(一)安卓升级包介绍:
OTA (OTA )升级是Android提供的标准升级方法。 其原理是在OTAPackage中创建需要升级的部分,用户手动或通过网络下载后,在恢复模式下运行Package中的升级脚本,并筛选需要升级的文件
OTAPackage可以是完整升级包或增量升级包。 完整升级包包含所有系统文件和images,但增量升级包只包含与指定版本不同的部分。 其中不同的部分将更新为patch文件。
OTApackage是zip格式的压缩包,下表显示了升级包的配置示例。
update.zip
|--boot.img
|--标识. img
|--META-INF
||--CERT.RSA
||--CERT.SF
||--com
|||--android
||| `--元数据
||`--谷歌
||`--android
|||--update-zjdygary
||`--更新器-脚本
|`--MANIFEST.MF
|--元
`--系统
`-APP
`--xxx.apk
主要组成部分包括:
(1)更新器脚本是升级脚本。 在恢复模式下,执行此脚本中的语句以完成指定的操作。 update-zjdygary是从bootablerecoveryupdater中的代码编译的升级程序,用于分析和运行升级脚本。
)2) CERT.RSA、CERT.SF、MANIFEST.MF是签名的验证文件,Android系统在进行升级包验证时需要。
)3)其他部分,如boot.img、logo.img、system等是需要具体升级的内容。 其中,recovery部分通过patch方式进行了更新。
综上所述,OTA包的核心是updater-script。
2 )手动创建升级包
也可以手动创建升级包。 按规定格式打包签名就可以了。 具体步骤如下。
(1)准备升级所需的文件和脚本,按照规定的目录结构创建并保存。 假设需要更新/system/app中的apk,则目录结构应该如下所示:
|--META-INF
|`--com
| `--谷歌
|`--android
||--update-zjdygary
| `--更新器-脚本
`--系统
`-APP
`--xxx.apk
如上所述,update-zjdygary是从可引导/恢复/更新器/编译的,out/target/product/god box/system/zjdyg /更新器
)2)将上述文件打包到update.zip中。 指令大致如下。
zip-r update.zip meta-INF系统……
)3)在升级包中添加签名。 命令如下:
jvajarout/host/Linux-x86/framework/sign apk.jar-w build/target/product/security/test key.x509.pembubuu
这里的签名工具和安全证书是Android附带的示例,您可以修改命令以指定自己的证书。
)4)生成的update_signed.zip是必需的升级包。
三、定制升级脚本
升级脚本update-script是纯文本文件,必须按照Android中规定的语法规则编写。 以下是一个示例:
set_progress('1);
sh
ow_progress("1","100");ui_print("update fastboot......");
package_extract_file("fastboot.zjdyg", "/dev/block/platform/hi_mci.1/by-name/fastboot");
ui_print("update baseparam......");
package_extract_file("baseparam.img", "/dev/block/platform/hi_mci.1/by-name/baseparam");
ui_print("update recovery......");
package_extract_file("recovery.img", "/dev/block/platform/hi_mci.1/by-name/recovery");
ui_print("update logo......");
package_extract_file("logo.img", "/dev/block/platform/hi_mci.1/by-name/logo");
ui_print("update boot......");
package_extract_file("boot.img", "/dev/block/platform/hi_mci.1/by-name/kernel");
ui_print("update system......");
format("ext4", "EMMC", "/dev/block/platform/hi_mci.1/by-name/system", "0", "/system");
mount("ext4", "EMMC", "/dev/block/platform/hi_mci.1/by-name/system", "/system");
package_extract_dir("system", "/system");
symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");
symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");
symlink("mksh", "/system/zjdyg/sh");
symlink("toolbox", "/system/zjdyg/cat", "/system/zjdyg/chmod",
"/system/zjdyg/chown", "/system/zjdyg/cmp", "/system/zjdyg/cp",
"/system/zjdyg/date", "/system/zjdyg/dd", "/system/zjdyg/df",
"/system/zjdyg/dmesg", "/system/zjdyg/du", "/system/zjdyg/getevent",
"/system/zjdyg/getprop", "/system/zjdyg/grep", "/system/zjdyg/hd",
"/system/zjdyg/id", "/system/zjdyg/ifconfig", "/system/zjdyg/iftop",
"/system/zjdyg/insmod", "/system/zjdyg/ioctl", "/system/zjdyg/ionice",
"/system/zjdyg/kill", "/system/zjdyg/ln", "/system/zjdyg/log",
"/system/zjdyg/ls", "/system/zjdyg/lsmod", "/system/zjdyg/lsof",
"/system/zjdyg/md5", "/system/zjdyg/mkdir", "/system/zjdyg/mount",
"/system/zjdyg/mv", "/system/zjdyg/nandread", "/system/zjdyg/netstat",
"/system/zjdyg/newfs_msdos", "/system/zjdyg/notify", "/system/zjdyg/printenv",
"/system/zjdyg/ps", "/system/zjdyg/r", "/system/zjdyg/reboot",
"/system/zjdyg/renice", "/system/zjdyg/rm", "/system/zjdyg/rmdir",
"/system/zjdyg/rmmod", "/system/zjdyg/route", "/system/zjdyg/schedtop",
"/system/zjdyg/sendevent", "/system/zjdyg/setconsole",
"/system/zjdyg/setprop", "/system/zjdyg/sleep", "/system/zjdyg/smd",
"/system/zjdyg/start", "/system/zjdyg/stop", "/system/zjdyg/sync",
"/system/zjdyg/top", "/system/zjdyg/touch", "/system/zjdyg/umount",
"/system/zjdyg/uptime", "/system/zjdyg/vmstat", "/system/zjdyg/watchprops",
"/system/zjdyg/wipe");
set_perm_recursive(0, 2000, 0755, 0755, "/system/zjdyg");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xzjdyg");
set_perm_recursive(0, 2000, 0755, 0755, "/system/etc");
unmount("/system");
ui_print("update ok ...");
升级脚本的生成根据升级包的制程也作过分两种情况,自动和手动。
3.1 自动生成升级脚本
自动模式下,执行ota_from_target_files时,制作升级包的函数会调用edify_generator.py脚本里的函数去自动编写updater-script。而edify_generator.py里的函数和updater-
script的语法规则是一一对应的。例如:Mount函数对应于mount(fs_type, partition_type, location, mount_point);Print函数对应于ui_print (“str”);
如果想定制updater-script,只需要修改ota_from_target_files(ota_from_target_files1)里自动编写脚本的那些代码,具体见WriteFullOTAPackage 或
WriteIncrementalOTAPackage里的script类,这两个方法分别为制作作全量包和差分包使用。
3.2 手动定制化升级脚本
手动模式就需要客户自行编写updater-script。由于是纯文本文件,所以可以用任意的文本编辑器去编写,只需要遵照Android里规定好的语法规则即可。在ICS里,updater-
script的编写使用的是被称为Edify的一套语法规则,其支持的指令见下表(只列举部分):
序号
命令
功能说明
1
mount(fs_type, partition_type, location, mount_point)
挂载指定的分区或设备
2
unmount (mount_point)
卸载指定的分区或设备
3
format(fs_type, partition_type, location, fs_size)
格式化指定的分区
4
show_progress (fraction, duration)
进度显示
5
set_progress (fraction)
设置进度条步进长度
6
delete (paths)
删除指定路径的文件
7
package_extract_file(zip_path, dest_path)
将升级包内特定的文件释放到指定的目录。如果是emmc版本,可以直接将image文件更新到指定partition。
8
symlink(target src1 src2 ...)
建立指向target的符号链接src1,src2,……
9
package_extract_dir(zip_path, dest_path)
将升级包内特定的目录释放到指定的目录
10
set_perm_recursive (uid, gid, dir-mode, file-mode, path)
设置文件夹和文件夹内文件的权限
11
ui_print (“str”)
用于在recovery界面中输出指定信息
如前所述,updater-script的解释执行是由update-zjdygary来完成的。如果需要扩充语法规则,则可以修改update-zjdygary的source code,涉及的具体文件如下:
bootablerecoveryupdaterintall.h
bootablerecoveryupdaterintall.c