曾经参考了网上很多制作差分包的流程,结果一直起不来, 最后经过各种摸索和测试,终于在android M 上制作出了可以正常工作Android M 差分包。 希望献给正在迷茫于此的你。
Android 差分包(update.zip) 主要用于Android OS 的OTA update。 Android 的OTA 更新主要包含两种更新:
1) FULL OTA
2) Diff OTA 更新。
FULL OTA 是整个包的更新, 而diff OTA 是基于上一版update.zip 的差异的更新(即差分包update.zip里面主要包含一些patch)。所以在进行OTA 差分包更新的时候, 一定要先进行一次FULL OTA 更新, 更新的update.zip 就是你制作差分包的Base 版本。

我们下面来描述制作Android M 差分包的详细流程:

  1. 制作Base 版本的update.zip

$ source build/envsetup.sh$ lunch xxx$ make otapackage

等编译完成后, 你需要保存两个文件:
1) 用于第一次FULL OTA 更新的Base 版本的update.zip
该文件的路径为:out/target/product/$(product_name)/update.zip
2) 用于制作差分包的base 版本的update.zip
该文件的路径为: out/target/product/$(product_name)/obj/PACKAGING/target_files_intermediates/$(product_name)-target_files-eng.root.zip
它是在用命令make otapackage之后的中间生产物,是最原始的升级包。 里面包含了制作差分包所需要的文件。
注意:制作差分包不能用out/target/product/$(product_name)/update.zip。 否则根本不会制作出对应的差分包。
我们先将out/target/product/$(product_name)/obj/PACKAGING/target_files_intermediates/$(product_name)-target_files-eng.root.zip命名为Base.zip.

 $ mv  $(product_name)-target_files-eng.root.zip   Base.zip
  1. 修改Android OS 源码部分;

为了测试, 我们就只给一个app 中加入log.d("####") 用于debug.

  1. 制作新版本update.zip

   $  source build/envsetup.sh   $ lunch xxx   $ make otapackage    

和1 不同的是, 只需要保存一个文件:
即out/target/product/$(product_name)/obj/PACKAGING/target_files_intermediates/$(product_name)-target_files-eng.root.zip. 我们将其命名为new.zip.

  $ mv  $(product_name)-target_files-eng.root.zip   New.zip     
  1. 修改 build/tools/releasetools/ota_from_target_files.py 脚本

system_items.GetMetadata(target_zip)system_items.Get("system").SetPermissions(temp_script)

改为:

system_items.GetMetadata(target_zip)#system_items.Get("system").SetPermissions(temp_script)system_items.Get("system").SetPermissions_NonSelinux(temp_script) 

否则,在更新的时候会出现错误。

  1. 使用修改后的脚本制作差分包:

$ ota_from_target_files.py  -i  Base.zip  New.zip  update.zip

等完成后, 我们的差分包就制作成功了。

  1. 使用1产生的update.zip 进行FULL OTA 更新

update.zip即1中产生的out/target/product/$(product_name)/update.zip。

  1. 使用5 产生的update.zip 进行增量更新即可。

至此,Android M 的差分包更新就完成了。 下面我们描述下一些可能出现的错误信息:


a).

file "/system/etc/recovery-resource.dat" doesn't have any of expected sha1 sums; checking cachefailed to stat "/cache/saved.file": No such file or directoryfailed to load cache filescript aborted: "/system/etc/recovery-resource.dat" has unexpected contents.

这个错误是apply_patch_check()打印的, 该函数检查是否符合升级条件,判断sha值,确认是A状态或者C状态。
通常打印这个消息就是不具备更新的条件, 例如: 你没有预先进行 FULL OTA更新, 就直接进行 DIFF OTA 更新, 就会打印该错误。

b).

script aborted: set_metadata_recursive: some changes failedSymlinks and permissions...ApplyParsedPerms: lsetfilecon of /system/lost+found to u:object_r:system_file:s0 failed: Operation not supported on transport endpointset_metadata_recursive: some changes failedE:Error in /cache/update.zip(Status 7) 

这个我按照4 修改后, 问题就得到了解决。
Qing 2017/08/31

更多相关文章

  1. Android(安卓)8.1 开机流程分析(1)
  2. Android设计应用图标不用愁---Asset Studio Integration来帮你
  3. 关于用百度地图开发的准备工作
  4. Android(安卓)R文件消失
  5. Android中的sdk相关介绍
  6. 为你的APK进行数字签名
  7. unity和Android之间互相调用
  8. apk自我保护的一种实现方式——运行时自篡改dalvik指令
  9. Android(安卓)Studio 中Gradle配置debug使用release的签名

随机推荐

  1. android应用程序基本原理
  2. Android(安卓)vector矢量图应用实例
  3. Android数据加密之SHA安全散列算法
  4. Android(安卓)NDK r4 windows 环境中的安
  5. IDEA搭建Android(安卓)wear开发环境,Andro
  6. android:layout_weight总有你不知道的用
  7. Android系统Surface机制的SurfaceFlinger
  8. 如何从Android(安卓)so中提取URL
  9. Android我还可以相信你多少系列文章三之
  10. Android中通过WebView控件实现与JavaScri