2013-09-22 12:32:41|分类:Android|标签:update.zip升级gmsandroidupdater-script|举报|字号订阅

很多时候厂商或者三方提供的ROM并不能满足需求,比如系统自带软件陈旧、缺少GMS软件包 (Google Mobile Service,包含了Gmail、GooglePlay等Google自家的常用软件,很多用户习惯用Gmail、用ContactsSync,所以通常会对这个服务包有比较强烈的需求 ,等等。
在这种情况下,一种方法是用户可以通过破解设备、加Root权限的方式去安装/替换ROM中已有的应用;而另一种方法则是制作一个升级包(Update.zip),在Recovery模式下刷机升级——这种方式被Sony等很多厂商采用,因为它可以在不破解设备或者加Root权限的情况下顺利升级系统内软件或者其它数据。当然,这种方式要求用和被升级ROM一致的签名文件(Key)给升级包做签名。
下面以制作GMS升级包为例(我想很多人的目的就是这个吧),介绍制作一个简单Update.zip的过程:
1)创建一个目录(例如,名为“update”的文件夹) 里面包含需要打包到Update.zip用来升级或者替换原有ROM的内容:

update / update / system update / system / app update / system / app / xxxx . 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 - binary update / META - INF / com / google / android / updater - script

在GMS包中,我包含了源码Google提供的很多apk及Maps相关libs:
其中,updater-script是update.zip在释放安装时所需要的脚本文件;updatebinary是脚本文件所需要调用的函数库,这个文件可以从ROM中提取,或者从 >>>> 这里 <<<<下载使用。
2)编写updater-script 目前广泛使用的是Edify脚本(updater-script和update-binary);很久以前还有Amend脚本(update-script),现在已经不再支持:所以如果有看到名为 update-script的脚本示例,一般已经没有用了可以无视。 仍然以GMS为例,递归地Copy升级包中的文件到设备相应的目录中:

ui_print ( "***********************************************" ); ui_print ( " GMS for Beta User " ); ui_print ( "***********************************************" ); show_progress ( 1 , 3 ); mount ( "ext4" , "EMMC" , "/dev/block/platform/msm_sdcc.1/by-name/system" , "/system" ); package_extract_dir ( "system" , "/system" ); set_perm_recursive ( 0 , 0 , 0755 , 0644 , "/system/app" ); set_perm_recursive ( 0 , 0 , 0755 , 0644 , "/system/etc/permissions" ); set_perm_recursive ( 0 , 0 , 0755 , 0644 , "/system/framework" ); set_perm_recursive ( 0 , 0 , 0755 , 0644 , "/system/lib" ); set_perm_recursive ( 0 , 0 , 0755 , 0644 , "/system/media" ); set_perm_recursive ( 0 , 0 , 0755 , 0644 , "/system/usr" ); unmount ( "/system" ); ui_print ( "GMS update complated." );

上面“/system”的挂载点因设备而异。关于 Edify脚本语法和函数的介绍,网上有很多资料,有兴趣可以再搜索看看是否能符合你客制化的需求。
3)打压缩包 压缩包可以用压缩工具,也可以用下面的命令行来做。但是要保证压缩包内的根目录下就有META-INF:
如果是Ubuntu一类的Linux环境下用“zip”命令做压缩包,则需要在步骤(1)的根目录中使用命令:

$ zip -qry ../update_unsigned.zip ./


4)给压缩包签名 使用下面的命令为上一步骤中生成的update_unsigned.zip做签名:

$ java -Xmx512m -jar signapk.jar -w releasekey.x509.pem releasekey.pk8 update.unsigned.zip update.zip

其中: -Xmx512m:指定了java最大内存堆栈,我的包比较大512不够用,设置成4096就成功; signapk.jar:签名工具,在源码中可以找到(/prebuilts/sdk/tools/lib/signapk.jar),或者从 >>>> 这里 <<<< 下载。下载链接中的文件基于Android4.3提取,不一定是通用的。 releasekey.x509.pem releasekey.pk8:这两个就是现有ROM发布时对应的签名Key,因设备/ROM而异。
5)应用update.zip升级包 至此,升级包已经制作完毕。将签过名的update.zip包放入SD卡或者其它能被访问到的目录(有些设备可能要求SD卡根目录), 重启设备并进入Recovery模式,找到update.zip并升级(有些设备可能直接有“ apply update.zip ”的选项) ,成功后重启手机。 【本文链接:http://zwkufo.blog.163.com/blog/static/2588251201382293049118/

更多相关文章

  1. Ubuntu识别不到Android设备
  2. Android(安卓)SQLite数据库升级的问题
  3. Android: Android(安卓)Bluetooth
  4. Android下USB Accessory的实现分析 (四)--- AOA上层分析
  5. 读取 android 设备的电池信息
  6. Android——init.rc脚本
  7. Android--学习笔记--02--AndroidStudio的设置
  8. 重装或者升级Android(安卓)Studio后,打开旧的Android项目,同步编译
  9. android kernel和标准linux kernel的区别

随机推荐

  1. C语言课程心得(五)
  2. 干货丨时序数据库DolphinDB历史数据回放
  3. Java并发编程:线程封闭和ThreadLocal详解
  4. 滴滴夜莺运维平台使用记(一)
  5. 第二天
  6. Java 基础知识总结
  7. Linux下oracle_rman备份配置参考文档
  8. Apache Ranger:运维管理的神兵利器
  9. java实现电脑开关机
  10. Android(安卓)水波纹效果的探究