文档说明
本文档以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 "[email protected]/cache/recovery/block.map" > /cache/recovery/command
reboot recovery
上述block.map文件前面一定要加"@"符号,否则系统重启后会出现下图错误(渣图,凑合着看):
E: footer is wrong
系统重启,显示下面画面,说明正在进行OTA升级:
石墨文档链接
https://shimo.im/docs/vW3PCGhcGGJgq9Qk/