Chinaunix首页 | 论坛 | 博客
  • 博客访问: 808691
  • 博文数量: 296
  • 博客积分: 5376
  • 博客等级: 大校
  • 技术积分: 2298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-14 19:02
文章分类

全部博文(296)

文章存档

2023年(2)

2020年(2)

2018年(2)

2017年(26)

2016年(4)

2015年(19)

2014年(12)

2013年(26)

2012年(84)

2011年(50)

2010年(41)

2009年(28)

分类: Android平台

2015-01-24 12:31:12



http://blog.csdn.net/kangear/article/details/23831431


http://blog.chinaunix.net/uid-26990529-id-3521580.html

生成ota全包,请参照下面步骤12的命令。步骤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_filesimage等。其中

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-0vC81-0ota升级包,则使用这个命令:

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-0vC81-0

ota差分包(在ota-diff目录),以及vC81-0ota全包(在ota-full目录)。




目前有两种升级方式:recovery升级和通过应用来升级。通过recovery升级不会检测image签名和OTA包签名的一致性, 通过应用升级会检测image签名和OTA包签名的一致性。所以有两种方式来解决这一签名不一致的问题。

1.       通过build/target/product/security下的key  签名的imageOTA包,但是只能通过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签名imageOTA包,然后通过recovery模式或者应用来完成OTA升级了。

BR




http://blog.csdn.net/tody_guo/article/details/7938788


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)

  • Download openssl package from link given above
  • Extract it anywhere on your drive (eg. C:\openssl)
  • Within openssl directory type (use cmd tool):

    - 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



    • Download SignApk.rar from link given above
    • Extract it  anywhere on your drive (eg. c:\SignApk)
    • If you don’t have java installed, and install it.
    • Copy certificate.pem and key.pk8 into your extracted SignApk directory
    • Within SignApk directory type:

      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 :

    • Create an empty folder (eg. C:\myupdate)
    • Create C:\myupdate\system\app folder for Calculator.apk and  C:\myupdate\system\lib folder forlibsec-ril.so
    • Create C:\myupdate\META-INF\com\google\android folder for update-script file.
    • Create the update-script file with the following syntax:
      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)

    • Compress the entire contents of C:\myupdate folder to zip (not the myupdate folder itself)
    • Sign the myupdate.zip file

      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 

    • Copy the update.zip file to sdcard and apply it from recovery console

    update-script syntax reference (definitions from recovery.c android source code):

    • copy_dir

      Syntax: copy_dir []
      Copy the contents of to  . The original contents of are preserved unless something in overwrote them.
      Ex: copy_dir PACKAGE:system SYSTEM:

    • format

      Syntax: format
      Format a partiti0n
      Ex: format SYSTEM:, will format entire /system . Note: formatting erases data irreversibly.

    • delete

      Syntax: delete [... ]
      Delete  file.
      EX: delete SYSTEM:app/Calculator.apk, will delete Calculator.apk from system/app directory.

    • delete_recursive

      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

    • run_program

      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.

    • set_perm

      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

    • set_perm_recursive

      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

    • show_progress

      Syntax: show_progress 
      Use of the on-screen progress meter for the next operation, automatically advancing the meter over seconds (or more rapidly if the actual rate of progress can be determined).
      Ex: show_progress 0.1 0

    • symlink

      Syntax: symlink

      Create a symlink (like ‘ln-s’). The is in root:path format, but is
      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.



  • http://blog.csdn.net/tody_guo/article/details/7943429

    目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制。

    一、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:

    [plain] view plaincopy
    1. is_mounted  
    2. unmount  
    3. format  
    4. show_progress  
    5. set_progress  
    6. delete  
    7. delete_recursive  
    8. package_extract_dir  
    9. package_extract_file  
    10. retouch_binaries  
    11. undo_retouch_binaries  
    12. symlink  
    13. set_perm  
    14. set_perm_recursive  
    15. getprop  
    16. file_getprop  
    17. write_raw_image  
    18. apply_patch  
    19. apply_patch_check  
    20. apply_patch_space  
    21. read_file  
    22. sha1_check  
    23. wipe_cache  
    24. ui_print  
    25. run_program  
    26. set_bootloader_env  


              

    二、updater-script脚本执行流程分析:

              先看一下在测试过程中用命令make otapackage生成的升级脚本如下:

    [plain] view plaincopy
    1. assert(!less_than_int(1331176658, getprop("ro.build.date.utc")));  
    2. assert(getprop("ro.product.device") == "tcc8800" ||  
    3.        getprop("ro.build.product") == "tcc8800");  
    4. show_progress(0.500000, 0);  
    5. format("yaffs2", "MTD", "system");  
    6. mount("yaffs2", "MTD", "system", "/system");  
    7. package_extract_dir("recovery", "/system");  
    8. package_extract_dir("system", "/system");  
    9. symlink("busybox", "/system/bin/cp", "/system/bin/grep",  
    10.         "/system/bin/tar", "/system/bin/unzip",  
    11.         "/system/bin/vi");  
    12. symlink("toolbox", "/system/bin/cat", "/system/bin/chmod",  
    13.         "/system/bin/chown", "/system/bin/cmp", "/system/bin/date",  
    14.         "/system/bin/dd", "/system/bin/df", "/system/bin/dmesg",  
    15.         "/system/bin/getevent", "/system/bin/getprop", "/system/bin/hd",  
    16.         "/system/bin/id", "/system/bin/ifconfig", "/system/bin/iftop",  
    17.         "/system/bin/insmod", "/system/bin/ioctl", "/system/bin/ionice",  
    18.         "/system/bin/kill", "/system/bin/ln", "/system/bin/log",  
    19.         "/system/bin/ls", "/system/bin/lsmod", "/system/bin/lsof",  
    20.         "/system/bin/mkdir", "/system/bin/mount", "/system/bin/mv",  
    21.         "/system/bin/nandread", "/system/bin/netstat",  
    22.         "/system/bin/newfs_msdos", "/system/bin/notify", "/system/bin/printenv",  
    23.         "/system/bin/ps", "/system/bin/reboot", "/system/bin/renice",  
    24.         "/system/bin/rm", "/system/bin/rmdir", "/system/bin/rmmod",  
    25.         "/system/bin/route", "/system/bin/schedtop", "/system/bin/sendevent",  
    26.         "/system/bin/setconsole", "/system/bin/setprop", "/system/bin/sleep",  
    27.         "/system/bin/smd", "/system/bin/start", "/system/bin/stop",  
    28.         "/system/bin/sync", "/system/bin/top", "/system/bin/umount",  
    29.         "/system/bin/uptime", "/system/bin/vmstat", "/system/bin/watchprops",  
    30.         "/system/bin/wipe");  
    31. set_perm_recursive(0, 0, 0755, 0644, "/system");  
    32. set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");  
    33. set_perm(0, 3003, 02750, "/system/bin/netcfg");  
    34. set_perm(0, 3004, 02755, "/system/bin/ping");  
    35. set_perm(0, 2000, 06750, "/system/bin/run-as");  
    36. set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth");  
    37. set_perm(0, 0, 0755, "/system/etc/bluetooth");  
    38. set_perm(1000, 1000, 0640, "/system/etc/bluetooth/auto_pairing.conf");  
    39. set_perm(3002, 3002, 0444, "/system/etc/bluetooth/blacklist.conf");  
    40. set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");  
    41. set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");  
    42. set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");  
    43. set_perm(0, 0, 0544, "/system/etc/install-recovery.sh");  
    44. set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");  
    45. set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");  
    46. set_perm(0, 0, 06755, "/system/xbin/librank");  
    47. set_perm(0, 0, 06755, "/system/xbin/procmem");  
    48. set_perm(0, 0, 06755, "/system/xbin/procrank");  
    49. set_perm(0, 0, 06755, "/system/xbin/su");  
    50. set_perm(0, 0, 06755, "/system/xbin/tcpdump");  
    51. show_progress(0.200000, 0);  
    52. show_progress(0.200000, 10);  
    53. assert(package_extract_file("boot.img", "/tmp/boot.img"),  
    54.        write_raw_image("/tmp/boot.img", "boot"),  
    55.        delete("/tmp/boot.img"));  
    56. show_progress(0.100000, 0);  
    57. unmount("/system");  


              下面分析下这个脚本的执行过程:

             比较时间戳:如果升级包较旧则终止脚本的执行。

             匹配设备信息:如果和当前的设备信息不一致,则停止脚本的执行。

             显示进度条:如果以上两步匹配则开始显示升级进度条。

             格式化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服务的工作原理。另外详细分析其升级过程,对于我们在实际升级时,可以根据我们的需要做出相应的修改。

             不足之处,请大家不吝指正!
阅读(1277) | 评论(0) | 转发(0) |
0

上一篇:Perl 数据结构

下一篇:android image

给主人留下些什么吧!~~