Android OTA升級的補救措施
問題場景如下:
產品已經上市,由於銷量太好了,某個硬體連二供都供應不上,沒辦法,只能用三供的硬體,但是之前量產版本的軟體(軟體A)不支援三供的硬體,所以為相容三供硬體,需要出軟體B,軟體A和軟體B版本號一樣(為了使所有使用者在表面上看拿到都是了一樣的產品)。但是使用的三方OTA升級軟體是通過軟體版本號去區分版本的,現在軟體A和軟體B版本號一樣,那麼以後如果需要出售後版本C,如何使得軟體A和軟體B都能正常升級到軟體C呢?
基本思路:
1. 先認識兩個很很重要的檔案
OTA升級包裡面的\META-INF\com\google\android\updater-script 和 \
updater-script 是升級指令碼,這個指令碼指出了相關檔案要更新到某個分割槽以及升級包和軟體版本的匹配關係。update-binary 負責解析updater-script 指令碼和執行升級動作。
所以可以看到解析升級包和執行升級是不依賴於軟體版本的,即使版本已經發布出去,我們還是可以修改程式碼使得升級過程按照我們希望的去做,然後重新編譯得到update-binary 和 updater-script 。
2. 有了前提(1),我們就可以實現把兩個升級包合成一個,然後去升級。
具體解決方法:
1. 很顯然,軟體A已經發到使用者手中,無法再去修改軟體A。而在出軟體B的時候,還是可以做些需要的改動的,因為它還在自己的控制中。首先需要做個標誌,只得軟體B能和軟體A區分開,比如編譯時間,一個屬性值,只要在升級時能獲取到就行。
2. 做軟體A 到軟體C的差分包AC, 做軟體B到軟體C的差分包BC。
3. 在 bootable\recovery\updater\updater.zip 中做相應修改,軟體A升級時解析差分包AC的updater-script , 軟體B升級時解析差分包BC的updater-script 。
4. 重新編譯出update-binary (編譯完對應到obj\PACKAGING\target_files_intermediates\xxxtarget_files\OTA\bin\updater 檔案)
5. 把 AC 和 BC 兩個差分包解壓併合併到一起。AC的updater-script 檔案裡面需要修改成對應AC包的升級檔案,BC的updater-script 檔案裡面需要修改成對應BC包的升級檔案。用編譯出來的update-binary 替換到整合包裡。
6. 重新打包AC和BC整合後的檔案,KK 使用的命令是 zip -qry temp.zip ./* , LL 上使用的命令是 zip -qry -n patch.dat temp.zip ./* . LL 上patch.dat 為字尾的升級檔案不能壓縮,否則升級失敗。
7. 對整合包進行簽名java -Xmx1024m -jar out/host/linux-x86/framework/signapk.jar -w android_keys/testkey.x509.pemandroid_keys/testkey.pk8temp/temp.zip update.zip
8. 這樣得到的update.zip 在軟體A和軟體B上就都能升級了。