1.1 Recovery 模式简介 Recovery 模式指的是一种可以对安卓机内部的数据或系统进行修改的模式,(类似于windows pe 或 DOS)。在这个模式下我们可以刷入新的安卓系统,或者对已有的系统进行备份或升级,也可以在此恢复出 厂设置。 1.2 Recovery 模式在框架层的位置 Android 启动后,会先运行bootloader。Bootloader 会根据某些判定条件决定是否进入recovery 模 式。Recovery 模式会装载recovery 分区,该分区包含recovery.img。Recovery.img 包含了标准内核(和 boot.img 中的内核相同)以及recovery 根文件系统。 Android recovery 三个部分两个接口,recovery 的工作需要整个软件平台的配合,从架构角度看,有 三个部分: 1. Main System: 用boot.img 启动的Linux 系统,Android 的正常工作模式。 2. Recovery:用recovery.img 启动的Linux 系统,主要是运行recovery 程序。 3. Bootloader:除了加载、启动系统,还会通过读取flash 的MISC 分区获得来自Main System 和 Recovery 的消息,并以此决定做何种操作。 两个通信接口: 1. /cache/recovery/:command、log、intent 2. BCB(Bootloader Control Block):misc 分区 我们先来看以上三部分是如何通信的,先看下图: ![](https://i-blog.csdnimg.cn/blog_migrate/0f30df68adc792537307853bb50770dd.png) Main System 如何进入Recovery 模式:当我们在Main System 使用update.zip 包进行升级时, 系统会重启并进入recovery 模式。在系统重启前,我们可以看到Main System 定会向recovery 域写入 boot-recovery(粉红色线),用来告知bootloader 重启后进入Rcovery 模式。这一步是必须的,至于 Main System 是否会向recovery 域写入值我们在源码中不能肯定这一点。即便如此,重启进入Recovery 模式后,Bootloader 会从/cache/recovery/command 中读取值并放入到BCB 的recovery 域。而Main System 在重启之前肯定会向/cache/recovery/command 中写入Recovery 将要进行的操作命令。 下图是Main System 进入Recovery 模式调用接口的流程图: ![](https://i-blog.csdnimg.cn/blog_migrate/ef904ae5bd39c10211361948cf73c026.png) 1.installPackage: RecoverySystem 的接口,完成升级包路径转换,并调用bootCommand。 2.bootCommand:RecoverySystem 的接口,将命令写入/cache/recovery/command,并调用 pm.reboot。 3.Pm.reboot ![](https://i-blog.csdnimg.cn/blog_migrate/99317b0b7a76693ae6d46d4bf333a941.gif) owerManager 的接口,重启并进入Recovery 模式。
2 编译OTA 包 2.1 OTA 介绍 OTA (over the air)升级是Android 系统提供的标准软件升级方式。它功能强大,提供了完全升级 (完整包)、增量升级模式(差异包),可以通过本地升级,也可以通过网络升级。 2.2 生成完整包 完整包所包含内容:system、recovery、boot.img 发布一个固件正确的顺序: 1. make -j4 2. make otapackage -j4 3. ./mkimage.sh ota 发布固件必须使用./mkimage.sh ota,将boot 与kernel 打包,不需要单独烧kernel,如果量产固件 是分开的,将会影响后面差异包升级,除非你不需要用差异升级。 在out/target/product/rkxxxx/目录下会生成ota 完整包rkxxxx-ota-eng.root.zip,改成 update.zip 即可拷贝到T 卡或者内置的flash 进行升级。
2.3 生成差异包 OTA 差异包只有差异内容,包大小比较小,主要用于OTA 在线升级,也可T 卡本地升级。OTA 差异包 制作需要特殊的编译进行手动制作。 (1)首先发布v1 版本的固件,生成v1 版本的完整包 (2)保存 out/target/product/rkxxxx/obj/PACKAGING/target_files_intermediates/rk3188-target_files-en g.root.zip 为rkxxxx-target_files-v1.zip,作为v1 版本的基础素材包。 (3)修改kernel 代码或者android 代码,发布v2 版本固件,生成v2 版本完整包 (4)保存 out/target/product/rkxxxx/obj/PACKAGING/target_files_intermediates/rk3188-target_files-en g.root.zip 为rkxxxx-target_files-v2.zip,作为v2 版本的基础素材包。 (5)生成v1-v2 的差异升级包: Android7.1 google CTS 测试要求开启verifying boot 功能。目前默认开启verifying boot 功能的平台有 RK3368H Android7.1 mid、RK3399 Android7.1 mid,作差异包时必现加上block 参数。 ./build/tools/releasetools/ota_from_target_files -v -i rkxxxx-target_files-v1.zip -p out/host/linux-x86 -k build/target/product/security/testkey rkxxxx-target_files-v2.zip out/target/product/rk3188/rkxxxx-v1-v2.zip
说明: 生成差异包命令格式: ota_from_target_files -v -i 用于比较的前一个target file --block 使用block 方式进行OTA 升级,打开verfying boot 的功能时必现加上这个参数 -p host 主机编译环境 -k 打包密钥 用于比较的后一个target file 最后生成的ota 差异包 2.4 升级包打包脚本使用 2.5 注意事项 完整包和素材包是不一样的。 从生成差异包的方法可以知道,差异包是两个版本的素材包做差异生成,所以每发布一个版本固件必须 保存obj 下的素材包以及升级的完整包和./mkimage.sh ota 生成的各个imgage。 如果有使用在线升级,必须给每个版本固件配置唯一的ota 版本号: device/rockchip/rksdk/rksdk.mk 中的 ro.product.version = 1.0.0(也可以是其他格式的版本号字符串) 深圳视壮科技是人脸识别测温RK3288/RK3399/RK3568/A311D/A311D2安卓主板方案开发定制厂家 - Powered by Discuz!深圳视壮科技是人脸识别测温RK3288/RK3399/RK3568/A311D/A311D2安卓主板方案开发定制厂家 http://www.vskfb.com/forum.php?mod=viewthread&tid=83&extra=page%3D2 |