分类: Android平台
2015-01-24 12:31:12
生成ota全包,请参照下面步骤1和2的命令。步骤1是前提,步骤2最终生成ota全包。
1. 编译+签名:
vendor/baidu/tools/release_make_image.sh
假设当前需生成的版本号为vC80-0,编user版本,存放key的目录为~/MyProject
/chengkai/key,则命令如下:
vendor/baidu/tools/release_make_image.sh vC80-0 user ~/MyProject/chengkai/key
此条命令之后,在代码根目录下会生成image_output_vC80-0目录,请把这个目录
保存好,里面存放了签了名的 target_files、image等。其中
image_output_vC80-0/image目录里面就是带签名的 image文件,用于烧写手机。
如果以后代码有了更新,需要出个vC81-0版本,则仍然使用该命令:
vendor/baidu/tools/release_make_image.sh vC81-0 user ~/MyProject/chengkai/key
此条命令之后,在代码根目录下会生成image_output_vC81-0目录。
2. 如果想生成从vC80-0到vC81-0的ota升级包,则使用这个命令:
vendor/baidu/tools/release_make_ota_diff.sh
结合上面的例子,则实际命令如下:
vendor/baidu/tools/release_make_ota_diff.sh
xxx/image_output_vC80-0/target_files_signed.zip vC80-0 xxx/image_output_vC81-0/target_files_signed.zip vC81-0 ~/MyProject/chengkai/key/releasekey
注意这一步只需使用release key,所以最后一个参数不是指向存放key的目录,而
是指向里面的release key。
此条命令之后,在代码根目录下生成ota_output,里面存放了vC80-0到vC81-0的
ota差分包(在ota-diff目录),以及vC81-0的ota全包(在ota-full目录)。
目前有两种升级方式:recovery升级和通过应用来升级。通过recovery升级不会检测image签名和OTA包签名的一致性, 通过应用升级会检测image签名和OTA包签名的一致性。所以有两种方式来解决这一签名不一致的问题。
1. 通过build/target/product/security下的key 来 签名的image和OTA包,但是只能通过recovery模式来升级。升级之后手机里面就是build/target/product/security下的key的签名。
2. 先用build/target/product/security下的key来签名image, 再用百度 key签名OTA包。这样OTA包就能够在之前用百度key签名的系统上升级。 升级之后手机里面就是build/target/product/security下的key的签名了。
使用这两种方法解决本次的签名的问题后,下次升级就可以直接用build/target/product/security下的key签名image和OTA包,然后通过recovery模式或者应用来完成OTA升级了。
BR
1.创建一个update目录,该目录包含自己想要升级或替换的内容
例如:
update/
update/system
update/system/app
update/system/app/doodle_jump.apk
update/META-INF
update/META-INF/com
update/META-INF/com/google
update/META-INF/com/google/android
update/META-INF/com/google/android/update-script
该目录包含doodle_jump游戏,升级后该apk将出现在手机的/system/app/目录下。
META-INF目录下包含升级脚本,update-script脚本的内容如下:
show_progress 0.500000 0
copy_dir PACKAGE:system SYSTEM:
show_progress 0.100000 0
大家可以根据自己的升级内容添加相应的命令。
2.创建压缩包
在update/目录下运行:
$ zip -qry ../update.unsigned.zip ./
将在update/的父目录下产生update.unsigned.zip 压缩包
3.签名
$ java -Xmx512m -jar signapk.jar -w key.x509.pem key.pk8 update.unsigned.zip update.zip
生成签过名的update.zip包,其中
signapk.jar,key.x509.pem,key.pk8与具体手机系统相关
4.将签过名的update.zip包放入手机sdcard根目录,
重启系统进入recovery模式,选择
apply update.zip,成功后重启手机
ok,现在手机上已经有doodle_jump游戏了,并且它无法被删除~
-- original english --
When publishing an application or a custom rom you need to sign the .apk or .zip files with a using a private key. The system uses the certificate to identify the author of an application and establish trust relationship between applications. The classic way of doing this was to use then sign it with . In this tutorial i’ll explain an alternative method which is relatively easy to use for most people using a tool calledSignApk.jar.
SignApk.jar is a tool included with the Android platform source bundle, you can download it from. To use SignApk.jar you have to create a private key with it’s corresponding certificate/public key. To create private/public key pair, you can use . Openssl is relatively easy to use under unix/linux system. For Windows user, you can download Windows version of Openssl .
How to create private/public key pair using openssl (windows version)
- openssl genrsa -out key.pem 1024
- openssl req -new -key key.pem -out request.pem
- openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem
- openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt
java -jar signapk.jar certificate.pem key.pk8 your-app.apk your-signed-app.apk
OR
java -jar signapk.jar certificate.pem key.pk8 your-update.zip your-signed-update.zip
Note:
If you don’t want to create your own public/private key pair, you can use test key included in SignApk.rar.
======================================= Import =========================================
There are several ways to install applications or library files to an . You can use Marketapplication to find and install or adb command line tool to install or push the files to Android file system. These are all easy to implement for single file but if you have several applications or library files to install at once, it might be better to use update zip file. The update zip file is Android advanced system to install applications or lib files to Android file system using recovery tool. This method is commonly used by rom or theme developers to distribute their package.
Creating an update zip file is quite easy, all you have to do is put the files in corresponding directory in Android file system and an update-script file to copy the files. For example, to install Calculator.apk intosystem/app and copy libsec-ril.so file into system/lib :
1
2
3
4
5
|
show_progress 0.1 0
copy_dir PACKAGE:system SYSTEM:
show_progress 0.1 10
|
Line 1&5 : show progress bar
Line 3: copy system folder from update package to Android’s /system
Note: you should add one extra line at the end of the file (Line 6)
java -jar signapk.jar certificate.pem key.pk8 myupdate.zip update.zip
Note: you can find tutorial on how to sign the update.zip file
update-script syntax reference (definitions from recovery.c android source code):
Syntax: copy_dir
Copy the contents of
Ex: copy_dir PACKAGE:system SYSTEM:
Syntax: format
Format a partiti0n
Ex: format SYSTEM:, will format entire /system . Note: formatting erases data irreversibly.
Syntax: delete
Delete file.
EX: delete SYSTEM:app/Calculator.apk, will delete Calculator.apk from system/app directory.
Syntax: delete_recursive
Delete a file or directory with all of it’s contents recursively
Ex: delete_recursive DATA:dalvik-cache, will delete /data/dalvik-cache directory with all of it’s contents
Syntax: run_program
Run an external program included in the update package.
Ex: run_program PACKAGE:install_busybox.sh, will run install_busybox.sh script (shell command) included in the update package.
Syntax: set_perm
Set ownership and permission of single file or entire directory trees, like ‘chmod’, ‘chown’, and ‘chgrp’ all in one
Ex: set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh
Syntax: set_perm_recursive
Set ownership and permission of a directory with all of it’s contents recursively
Ex: set_perm_recursive 0 0 0755 0644 SYSTEM:app
Syntax: show_progress
Use of the on-screen progress meter for the next operation, automatically advancing the meter over
Ex: show_progress 0.1 0
Syntax: symlink
Create a symlink (like ‘ln-s’). The
for the target filesystem (and may be relative)
Definition of roots and partitions (from root.c android source code)
ROOT: (Linux block device) /mountpoint/ fs, size Description. BOOT: (/dev/mtdblock[?]) / (RAM) Raw Kernel, ramdisk and boot config. DATA: (/dev/mtdblock5) /data/ yaffs2, 91904kb User, system config, app config, and apps (without a2sd) CACHE: (/dev/mtdblock4) /cache/ yaffs2, 30720kb OTA cache, Recovery/update config and temp MISC: (/dev/mtdblock[?]) N/A Raw [TODO: Get info on MISC:] PACKAGE: (Relative to package file) N/A Pseudo-filesystem for update package. RECOVERY: (/dev/mtdblock[?]) / (RAM) Raw, [?]kb The recovery and update environment's kernel and ramdisk. Similar to BOOT:. SDCARD: (/dev/mmcblk0(p1)) /sdcard/ fat32, 32MB-32GB The microSD card. Update zip is usually here. SYSTEM: (/dev/mtdblock3) /system/ yaffs2, 92160kb The OS partition, static and read-only. TMP: /tmp/ in RAM Standard Linux temporary directory.
一、update-script脚本语法简介:
我们顺着所生成的脚本来看其中主要涉及的语法。
1.assert(condition):如果condition参数的计算结果为False,则停止脚本执行,否则继续执行脚本。
2.show_progress(frac,sec):frac表示进度完成的数值,sec表示整个过程的总秒数。主要用与显示UI上的进度条。
3.format(fs_type,partition_type,location):fs_type,文件系统类型,取值一般为“yaffs2”或“ext4”。Partition_type,分区类型,一般取值为“MTD”或则“EMMC”。主要用于格式化为指定的文件系统。事例如下:format(”yaffs2”,”MTD”,”system”)。
4.mount(fs_type,partition_type,location,mount_point):前两个参数同上,location要挂载的设备,mount_point挂载点。作用:挂载一个文件系统到指定的挂载点。
5.package_extract_dir(src_path,destination_path):src_path,要提取的目录,destination_path目标目录。作用:从升级包内,提取目录到指定的位置。示例:package_extract_dir(“system”,”/system”)。
6.symlink(target,src1,src2,……,srcN):target,字符串类型,是符号连接的目标。SrcX代表要创建的符号连接的目标点。示例:symlink(“toolbox”,”/system/bin/ps”),建立指向toolbox符号连接/system/bin/ps,值得注意的是,在建立新的符号连接之前,要断开已经存在的符号连接。
7.set_perm(uid,gid,mode,file1,file2,……,fileN):作用是设置单个文件或则一系列文件的权限,最少要指定一个文件。
8.set_perm_recursive(uid,gid,mode,dir1,dir2,……,dirN):作用同上,但是这里同时改变的是一个或多个目录及其文件的权限。
9.package_extract_file(srcfile_path,desfile_paht):srcfile_path,要提取的文件,desfile_path,提取文件的目标位置。示例:package_extract_file(“boot.img”,”/tmp/boot.img”)将升级包中的boot.img文件拷贝到内存文件系统的/tmp下。
10.write_raw_image(src-image,partition):src-image源镜像文件,partition,目标分区。作用:将镜像写入目标分区。示例:write_raw_image(“/tmp/boot.img”,”boot”)将boot.img镜像写入到系统的boot分区。
11.getprop(key):通过指定key的值来获取对应的属性信息。示例:getprop(“ro.product.device”)获取ro.product.device的属性值。
12. ui_print(String): 用于在Flash Mode要显示的内容
13. delete(FilePath): 用于删除文件的命令
14. run_program(Shell, ScriptPath): 例如:run_program("/sbin/sh", "/system/bin/install.sh");
15. umount(Path): 卸载文件系统
16. cmdlist:
二、updater-script脚本执行流程分析:
先看一下在测试过程中用命令make otapackage生成的升级脚本如下:
①比较时间戳:如果升级包较旧则终止脚本的执行。
②匹配设备信息:如果和当前的设备信息不一致,则停止脚本的执行。
③显示进度条:如果以上两步匹配则开始显示升级进度条。
④格式化system分区并挂载。
⑤提取包中的recovery以及system目录下的内容到系统的/system下。
⑥为/system/bin/下的命令文件建立符号连接。
⑦设置/system/下目录以及文件的属性。
⑧将包中的boot.img提取到/tmp/boot.img。
⑨将/tmp/boot.img镜像文件写入到boot分区。
⑩完成后卸载/system。
以上就是updater-script脚本中的语法,及其执行的具体过程。通过分析其执行流程,我们可以发现在执行过程中,并未将升级包另外解压到一个地方,而是需要什么提取什么。值得主要的是在提取recovery和system目录中的内容时,一并放在了/system/下。在操作的过程中,并未删除或改变update.zip包中的任何内容。在实际的更新完成后,我们的update.zip包确实还存在于原来的位置。
三、总结
以上的九篇着重分析了Android系统中Recovery模式中的一种,即我们做好的update.zip包在系统更新时所走过的流程。其核心部分就是Recovery服务的工作原理。其他两种FACTORY RESET、ENCRYPTED FILE SYSTEM ENABLE/DISABLE与OTA INSTALL是相通的。重点是要理解Recovery服务的工作原理。另外详细分析其升级过程,对于我们在实际升级时,可以根据我们的需要做出相应的修改。
不足之处,请大家不吝指正!