博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Build update.zip from your own android source code
阅读量:2228 次
发布时间:2019-05-09

本文共 2638 字,大约阅读时间需要 8 分钟。

本文介绍如何从一个已经编译好的android源码树中提取一个update.zip所需要的所有资源, 从而最终构建一个可以在android recovery模式下刷机的update.zip包.在介绍之前,我们先假定你已经有了一个编译好的android源码树 myandroid.  

 


在Android 2.1-update1版本中, 一个最基本的update.zip包的结构如下:

 

.

 

|-- META-INF

 

|   `-- com

 

|       `-- google

 

|           `-- android

 

|               |-- update-binary

 

|               `-- updater-script

 

`—system

  • update-binary    : 二进制文件, 相当于一个脚本解释器, 能识别 updater-script 中描述的操作。该文件由 myandroid/out/target/product/YOU_PRODUCT/system/bin/updater  重命名所得。具体用什么名字是由 myandroid/bootable/recovery/install.c 文件中的宏 ASSUMED_UPDATE_BINARY_NAME 的值而定.
  • updater-script    : 该文件需要自己根据更新包需要更新的内容自行编写. 具体用什么名字是由 myandroid/bootable/recovery/updater/updater.c 文件中的宏 SCRIPT_NAME 的值而定.(注意: 是updater-script, 而不是 update-script).
  • system               :  该目录下放需要更新的内容. 比如, 如果你只是需要添加几个系统软件, 则在此目录下添加一个 app 目录, 然后把待添加的系统软件copy进来即可. 如果你是要制作一个系统更新包. 那myandroid/out/target/product/YOU_PRODUCT/system/ 中的所有文件copy到这个目录里来.

一个系统更新 update.zip 包的制作步骤(在一台ubuntu pc上做的实验,如有命令缺失,请自行安装)

  1. $mkdir update #在任意目录下,创建一个叫update的目录
  2. $cd upadte      #进入该目录
  3. $mkdir –p META-INF/com/google/android/  &&  mkdir system    #在update目录下, 创建2个子目录
  4. $cp myandroid/out/target/product/YOU_PRODUCT/system/bin/updater  META-INF/com/google/android/update-binary #获取update-binary文件
  5. $cp myandroid/out/target/product/YOU_PRODUCT/system/ system/  #获取更新系统MTD所需要的文件
  6. $cp myandroid/out/target/product/YOU_PRODUCT/boot.img ./ #获取更新系统boot区域所需要的文件.这个boot.img = kernel + ramdisk
  7. $vim META-INF/com/google/android/updater-script # 打开updater-script脚本, 开始编写更新过程.(下文详述)
  8. $zip update.zip -r ./META-INF/ ./system/ ./boot.img #编辑完updater-script脚本后, 把update内的所有内容打成一个 update.zip包.
  9. $java –jar ---签名--- # 使用java对update.zip包进行签名 (下文详述)
  • updater-script 脚本的编写(解释步骤7)

updater-script 的内容其实为一行一行update-binery能识别的命令序列. 文件 myandroid/bootable/recovery/update/install.c 末尾描述了所有可执行命令.下面介绍部分命令的使用实例:

    • mount :

eg : mount(“MTD”, “system”, “/system”);

挂在 MTD的system分区到文件系统的 /system 目录下.

  •  
    • ui_print :

eg : ui_print(“Hello word!”);

在屏幕上打印提示信息.

  •  
    • format :

eg : format(“MTD”, “system”);

格式化MTD的system分区

  •  
    • package_extract_dir :

eg : package_extract_dir(“system”, “/system”);

把update包中system中的内容全部拷贝到文件系统/system下

 

  • update.zip签名(解释步骤9)

update.zip包完成以后, 需要对该zip包进行签名, 否则在recovery模式刷机的时候, 会出现认证失败的错误提示.上文中的步骤9的完整命令为:

$java  –jar  myandroid/out/host/linux-x86/framework/signapk.jar  –w  myandroid/build/target/product/security/testkey.x509.pem  /testkey.pk8  update.zip  update_signed.zip

 

通过这条命令, 会对update.zip包进行签名, 然后输出一个update_signed.zip的签好名update包. 以此作为最终更新包。这条命令需要5个条件:

  1. host机需装有java环境, ubuntu上为 sun-java5-jdk DEB包
  2. signapk.jar 文件. 在编译好的myandroid/out/host/linux-x86/framework目录下
  3. testkey.x509.pem 在源码的 myandroid/build/target/product/security 目录下
  4. testkey.pk8 在编译好的 myandroid/build/target/product/security 目录下
  5. update.zip 没有经过签名的ZIP包.

转载地址:http://mhhfb.baihongyu.com/

你可能感兴趣的文章
《Head first设计模式》学习笔记 - 工厂方法模式
查看>>
《Head first设计模式》学习笔记 - 装饰者模式
查看>>
《Head first设计模式》学习笔记 - 模板方法模式
查看>>
《Head first设计模式》学习笔记 - 外观模式
查看>>
《Head first设计模式》学习笔记 - 命令模式
查看>>
《Head first设计模式》学习笔记 - 抽象工厂模式
查看>>
《Head first设计模式》学习笔记 - 观察者模式
查看>>
《Head first设计模式》学习笔记 - 策略模式
查看>>
ThreadLocal 那点事儿
查看>>
ThreadLocal 那点事儿(续集)
查看>>
阳台做成榻榻米 阳台做成书房
查看>>
深入分析java线程池的实现原理
查看>>
mybatis中"#"和"$"的区别
查看>>
Hibernate与MyBatis区别
查看>>
如何禁用Eclipse的Validating
查看>>
据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
查看>>
SpringMVC学习笔记2
查看>>
Oracle知识点连载(一)
查看>>
Oracle知识点连载(二)
查看>>
Oracle知识点连载(三)
查看>>