文檔說明
本文檔以SS826-CN-00(SDM450平臺,Android 7)爲例,描述從加密DATA分區進行OTA升級的方法。
問題背景
Android 7默認代碼,DATA分區是加密的。
可見以下路徑文件:
/device/qcom/msm8953_64/fstab.qcom
上圖修改是不對/data分區進行加密。
在不對/data分區加密時,OTA文件如果放在/data文件,可以進行如下命令進行升級:
adb root
adb shell
echo "--update_package=/data/update.zip" > /cache/recovery/command
reboot recovery
但是如果不修改fstab.qcom文件,使用以上命令進行OTA升級,會出現下圖錯誤:
E: failed to mount /data (Invalid argument)
分析過程
那如何在/data分區加密的情況下,把OTA包放在/data分區,實現OTA升級。
一通百度google搜索之後,說/data分區加密的話,需要先把update.zip解密生成block.map
照如下操作:
adb root
adb shell
/system/bin/uncrypt /data/update.zip /cache/recovery/block.map
結果沒生成block.map文件。
查看logcat日誌,有如下報錯:
E uncrypt : failed to open socket "uncrypt": No such file or directory
相關代碼在
bootable/recovery/uncrypt/uncrypt.cpp
在還沒有開始解密,就報錯了。
然後又是一通搜索,說是解密時需要用到socket通信,往下跟蹤代碼,跟了半天也沒搞懂這個socket通信是個啥玩意。
參考了Android 9的這部分代碼:
https://uploader.shimo.im/f/1NxYQLpmR9kZXsvK.cpp?attname=uncrypt.cpp&download
Android 9的代碼,直接跳過了所謂的socket通信。
好吧, 我依葫蘆畫瓢,照着修改Android 7相應的位置試試。
修改方法
- 合入以下patch , bootable/recovery/uncrypt.cpp
https://uploader.shimo.im/f/MXdMt5v2yoEhOXdX.patch?attname=uncryptt.cpp.patch&download
2. mmm bootable/recovery/uncrypt
3. 編譯之後生成 out/target/product/msm8953_64/system/bin/uncrypt 文件
4. 替換系統文件 adb push uncrypt /system/bin/
5. adb shell
/system/bin/uncrypt /data/update.zip /cache/recovery/block.map
echo "--update_package=@/cache/recovery/block.map" > /cache/recovery/command
reboot recovery
上述block.map文件前面一定要加"@"符號,否則系統重啓後會出現下圖錯誤(渣圖,湊合着看):
E: footer is wrong
系統重啓,顯示下面畫面,說明正在進行OTA升級:
石墨文檔鏈接
https://shimo.im/docs/vW3PCGhcGGJgq9Qk/