OTA 升级是 Android 系统提供的标准软件升级方式。 它功能强大,提供了完全升级、增量升级模式,可以通过 SD卡升级,也可以通过网络升级。
那如何生成差分升级包呢?
Android源码的根目录下有以下两个命令:
1、make ——会生成系统的img文件,system.img,boot.img,userdata.img,recovery.img
2、make otapackage——会生成sd卡用的全部系统升级包,如msm8974-target_files-eng.xxxx.zip
要生成差分升级包,需要先制作出两个全升级包,然后根据这两个升级包做出差分升级包,这里以高通的msm8974为例,讲诉Android差分包的制作过程。
1、制作全系统升级包
1.1 使能编译脚本 在Android源码目录下运行source build/envsetup.sh
1.2 选择具体机型 在终端运行lunch,随后会打印机型列表,通过输入数字选择具体的机型
1.3 编译 在终端运行make,如果之前没有编译过Android源码,该过程相当久。
1.4 make otapackage
注(1.1-1.3也是Android源码官方的标准编译方式,其实也是输出一些临时变量,供编译时使用,可通过 printenv查看具体的配置信息,很简单对不对)
2、建立一个目录
这个随意,在哪里建都行, 主要要于保存升级文件如
mkdir ~/OTA
注(~代表为用户目录,一般为/home/用户名,可通过cd ~,然后通过pwd查看路径)
3、将编译生成的out/target/product/msm8974/obj/PACKAGING/target_files_intermediates/msm8974-target_files-eng.xxxx.zip 拷贝并且更名放到目录~/OTA/A.zip
4、在代码中做一些修改,产生一些差异
5、第二次make;make otapackage(修改于Android源码后out/target/product/msm8974/文件在重新编译后,某个文件(如apk)虽已不再生成,但该文件不会自动删除(上一次的生成文件残留),个人感觉这个有BUG,希望谷歌方面改进一下,这样我们在make之前,最好手动删除一下out/target/product/msm8974/system这个目录)
6、将第二次编译生成的out/target/product/msm8974/obj/PACKAGING/target_files_intermediates/msm8974-target_files-eng.xxxx.zip 拷贝并且更名放到目录~/OTA/B.zip
7、在src根目录下执行制作差分包的命令,必须在src根目录下执行,因为ota_from_target_files.py这个脚本里面写定了相对路径的引用文件。
./build/tools/releasetools/ota_from_target_files -i 。
如: ./build/tools/releasetools/ota_from_target_files -i ~/OTA/A.zip ~/OTA/B.zip ~/OTA/update.zip
注:-i指定制作差分包,~/OTA/update.zip 就是升级用的差分包,这个脚本要在Android源码的根目录下执行。
8、升级原理
打开update.zip,有一个升级脚本META-INF/com/google/android/updater-script。Android就是根据这个脚本进行升级的,有兴趣的可以研究一下。当然升级失败了,最好从这个脚本中找原因了,因为这个文件会打印升级过程中的信息。通过adb shell,进入/tmp目录,有个文件记录了升级过程的信息,可通过这个文件查看升级失败的原因。
9、应用升级包
差分包制作好后,可以用Android的recovery应用该升级包。应用该升级包的时候,遇到了两个问题,这里给大家分享一下。
9.1时间戳失败
时间戳失败即OTA包必须比recovery的编译时间要早,这个在编译的时候控制一下即可。当然,你也可屏蔽OTA包的时间戳检测,见http://blog.csdn.net/mike8825/article/details/49332249
9.2指纹校验失败。差分升级包就是比较现存基础包与原来的基础包的差异而生成的,即该OTA包有特定的应用背景(用于两个差分包之间)。升级过程中,升级脚本(打开该升级包,如下图所示)会检测fingerprint,确保该升级包被正确应用。fingerprint这个属性存在于/build.prop,可通过adb shell进入根路径,通过cat build.prop查看这个属性(或getprop)。如果自己做版本控制的话,这个也可以屏蔽。关于指纹校验该篇博客有较详细的介绍http://blog.csdn.net/huangyabin001/article/details/44465145。
9.3提示system分区不够大,升级失败。这里的system分区为500M,剩余200M。这里感觉挺奇怪的,200M的的空间还升级不了一个20多M的升级包。开始的时候认为是selinux引起的,因为串口会打印一下selinux的错误,尝试改正这些错误后,升级包并没有应用成功。这里,单纯一点,它提示system分区容量不够,那咱就给它大一点哦。尝试修改将system分区的容量改为1G后,成功升级。
关于OTA包的详解见
http://blog.csdn.net/thl789/article/details/8743743