本次介绍Android OTA更新,AOSP官方教程的地址是:https://source.android.google.cn/devices/tech/ota/
另外可以参考:https://blog.csdn.net/zengrunxiu/article/details/81746220,包含实现, 升级流程, 工作原理, 核心服务, SD卡升级, 修改.
原生Android提供的Recovery更新程序只支持更新system分区, recovery分区及boot分区.一般为了增加后期更好的维护,各SoC厂都会在此基础上进行扩展.下面基于全志平台对OTA更新流程进行一些简单的说明.
1,升级注意事项
1.1 OTA不能改变分区数目及其大小
recovery本质上是一个运行在Linux上的一个普通应用程序,它没有权限对现有分区表进行调整,所以第一次量产时就要将分区数目和大小确定,OTA不能改变分区数目和分区大小.
1.2 cache分区的大小
原生recovery机制中,因为recovery内的分区挂载路径与Android的分区挂载路径并不完全相同,所以在Android上层传入更新包地址时,必须保证这个包路径在recovery和Android系统都是相同的.
能够读写的分区中只有cache分区和data分区会被recovery和Android系统同时挂载,这意味着需要将包放在这两个分区中,recovery才能识别.所以Google原生策略中,当在外部存储选择一个更新包时,都默认复制到cache分区中.所以在划分分区是需要注意要分配cache分区足够大的空间,否则可能出现无法容纳更新包而导致无法升级的问题.
1.3 misc分区需要足够的权限被读写
misc分区是recovery和Android之间的桥梁,如果misc分区的读写权限过低,会导致上层应用无法对其写入数据,则会另recovery功能异常.检验此功能存在问题是,请确保misc分区的设备节点/dev/block/xxx和其软链接/dev/block/misc有足够的权限被读写.
2,制作OTA包
TargetFile: 包含制作时当前编译版本的system分区, boot分区, recovery分区等内容,可用于制作OTA完整包和差分包.
OTA完整包: 包含本次更新版本的所有内容,可以从之前各个版本直接升级到当前版本.制作完整包需要当前版本的TargetFile.
OTA差分包: 包含本次升级版本和之前特定某个版本的升级内容,只适用于之前特定一个版本升级到当前版本.制作差分包需要之前特定版本的TargetFile和当前版本的TargetFile.
2.1 制作不带签名的OTA包
2.1.1 制作不带签名的TargetFile
在编译完Android后,输入如下命令:
make_ota_target_file
或者
get_uboot
make target-files-package
make_ota_target_file只是封装了一些命令,具体可以查看device/softwinner/common/vendorsetup.sh里面有关于make_ota_target_file的定义.
get_uboot命令作用是从lichee目录中复制必要的更新文件到更新包中.不执行该命令会导致后面的make动作出错.
最后得到TargetFile的路径out/target/product/[device1]/obj/PACKAGING/target_files_intermediates/[device2]-target_files-[time].zip
2.1.2 制作不带签名的OTA完整包
get_uboot
make otapackage -j8
或者
make_ota_package
2.1.3 制作不带签名的OTA差分包
要生成差分包,必须获得前一版本的target-file文件,具体参考前面如何制作TargetFile.
将要更新版本(旧版)的target-file文件拷贝到Android的根目录下,并命令为old_target_files.zip,保证Android的根目录下只有一个*.zip的文件.之后执行以下命名将可以生成差分包:
make otapackage_inc
注意: 1,该差分包仅对指定的前一版本有效; 2,制作一个完整包,也会生成单亲啊版本的一个target-file文件包.
2.2 制作带签名的OTA升级包
签名可以让Android带有厂商私有的签名,在OTA升级的时候会预先校验签名,如果签名不匹配则无法进行OTA更新,签名校验保证了OTA包的来源合法性.制作带签名的OTA包流程如下:
2.2.1 生成没有签名的TargetFile
参考前面的方法.
2.2.2 TargetFile签名
./build/tools/releasetools/sign_target_files_apks -d [key_path] -o [unsigned_target_file.zip] [signed_target_file.zip]
[key_path]是存放key文件夹的路径,需要包括4个key,分别是:media, platform, releasekey, shared,具体包含以下文件: media.pem, media.x509.pem, platform.pk8, releasekey.pem, releasekey.x509.pem, shared.pk8, media.pk8, platform.pem, platform.x509.pem, releasekey.pk8, shared.pem, shared.x509.pem;
-o 表示替换一个公用的ota_key,这个可以确保第三方的ota包没有办法更新;
[unsigned_target_file.zip]: 表示上一步生成的没有签名的TargetFile;
[signed_target_file.zip]: 表示命令输出得到的经过签名的TargetFile.
注意: 签名的时候,需要按照提示输入相应的证书的密码.
2.2.3 从签名过的TargetFile得到镜像(boot.img, system.img和recovery.img)
./build/tools/releasetools/img_form_target_files [signed_target_file.zip] [img.zip]
[signed_target_file.zip]: 表示经过签名的TargetFile;
[img.zip]: 表示命令输出得到的镜像压缩包.
2.2.4 解压img.zip将得到: boot.img, system.img, recovery.img,复制到target/product/[device1]/下面,重新pack得到可烧录的固件,是签名过的固件.
2.2.5 制作带签名OTA完整包
./build/tools/releasetools/ota_from_target_files -k [releaseKey] [signed_target_file.zip] [ota_full.zip]
[releaseKey]和sign_target_files_apks用来签名的release key相对应;
[signed_target_file.zip]: 表示经过签名的TargetFile;
[ota_full.zip]: 表示命令输出得到的OTA完整包.
2.2.6 制作带签名OTA差分包
./build/tools/releasetools/ota_from_target_files -k [releaseKey] -i [signed_target_file_v1.zip] [signed_target_file_v2.zip] [ota_inc.zip]
[releaseKey]和sign_target_files_apks用来签名的release Key相对应;
[signed_target_file_v1.zip]: 表示经过签名的版本v1的TargetFile;
[signed_target_file_v2.zip]: 表示经过签名的版本v2的TargetFile;
[ota_inc.zip]: 表示命令输出得到的OTA完整包.
3,OTA更新
1,make otapackage -j4
2,生成out/target/project_name/$(device)_ota_$(date).zip
# 上面生成的包改成ota.zip
3,adb push ota.zip cache
4,adb shell
5,echo "--update_package=/cache/ota.zip" > /cache/recovery/command
6,reboot recovery
做完上述步骤之后,会进入recovery模式进行更新,更新完会自动重启到更新后的系统中.一般到用户手中,常见有两种方式更新:1,下一次开机自动更新; 2,正常开机时,通过自己做的apk进行更新,原理跟上面演示的adb类似.