安卓手机odex化与刷机包制作
写于2012年2月7日
23:23
由于打算使用一个稳定的rom,不打算频繁刷机了,于是决定odex化所有app
解释下为什么要做odex优化吧,其实不做也可以。
但是做了之后,能加速程序的启动速度,开机也会加快。
最重要的是大优的RAM的确少,做了odex之后可以释放更多的ram,这可以保持系统的流畅性
引用一下:
本人很早就像搞这个 但是一直未果 请教几人也无任何结果
今无意中发现此教程 而且也亲测成功了 特转来与大家分享
关于odex到底能否提速和提速多少的问题本帖不做讨论
什么是ODEX?
ODEX是安卓上的应用程序apk中提取出来的可运行文件,是通过apk安装包的中的dex优化过的,再把apk包里的dex文件删除。
这样做可以加快软件的启动速度,预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行。
什么是dalvik-cache?
当Android启动时,DalvikVM监视所有的程序(APK文件)和框架,并且为他们创建一个依存关系树。DalvikVM通过这个依存关系树来为每个程序优化代码并存储在Dalvik缓存中。这样,所有程序在运行时都会使用优化过的代码。这就是当你刷一个新的ROM时,有时候第一次启动时间非常非常长的原因。当一个程序(或者框架库)发生变更,DalvikVM将会重新优化代码并且再次将其存在缓存中。在cache/dalvik-cache是存放system上的程序生成的dex文件,而data/dalvik-cache则是存放data/app生成的dex文件。
源文档
准备工作:
用Recovery进行一个备份,预防出现意外,不能开机。
请确定你的电脑可以正常连接手机调试模式。
请确定你的电脑安装好JAVA。
请确定你的system有10~20M空余。
说明:
Android系统中运行的程序包主要分framework,system/app,data/app,三个路径,开机的时候启动内核后,就会逐个启动framework里的jar框架程序,再启动system/app的开机自启程序。
如果你想把整个ROM都odex化,就必须先将framework的先做,因为在odex过程中,需要依赖framework进行。而且在odex framework时,每个文件都要严格按照顺序,否则不能开机。如果你在其他app做了odex,Sorry,你不能odex framework。
源文档
总之 ,就是依次odex化 framework,system/app,data/app
顺序不能改
下载odex工具包
一、ODEX framework
运行 复制文件.bat
等待完成,然后按WIN+R,输入CMD,打开CMD,依次输入:
adb shell回车
su
回车
cd system/framework
回车
dexopter fr
等待完成
然后重启一次。如果你发现不能开机,请进入Recovery 清除cache。还是不能开机,Sorry,可能是失败了,两个解决方法,一个是使用Recovery+ADB删除odex文件,二是恢复系统。(不过不成功的,都是没认真看我教程的人)
开机后,你会发现framework目录下多了些odex文件,然后用你知道的方法,把所有jar文件复制到电脑上,那个framework-res.apk不用管它,然后用winrar等打开,把里面的classes.dex文件删除掉。关闭,每个文件都这样做。
然后把所有framrwork文件制作成一个zip升级包,签名。进入Recovery安装。开机。这样做是为了节约空间。
源文档 <http://bbs.anzhi.com/thread-4848109-1-3.html>
二、接下来是 安卓刷机包制作的内容
META-INF\com\google\android 下有
update-binary 和updater-script
updater-script内容如下:
ui_print("updating system...");
run_program("/sbin/mount", "/system");
show_progress(1, 15);
package_extract_dir("system/framework", "/system/framework");
run_program("/sbin/umount", "/system");
ui_print("Installation complete!");
run_program("/sbin/mount", "/system");这句话是挂载分区
等价于mount("ext3", "EMMC", "/dev/block/mmcblk0p12", "/system"); 注意 这个是4个参数的。
show_progress(1, 15);是进度条
具体有关rom制作请看
安卓刷机及刷机包制作教程
http://hi.baidu.com/spring_badboy/blog/item/ccf2072dbab1082f359bf706.html
如何制作刷机补丁和CWM刷机包ROM(含工具与签名)
http://bbs.gfan.com/android-1896274-1-1.html
【转帖】Android平台刷机包制作研究(1)
http://bbs.mfunz.com/thread-13499-1-1.html
META-INF这个文件是有关签名的
接下来是system文件夹
所有jar已经去除了dex
打包成zip
用autosign签名
这样就可以进入recovery刷入
注:若不制作刷机包的话。
就把删除dex文件的jar文件重新放回去. 记住, 先放到system 修改好权限 644 你们懂的. 然后再覆盖进去,这样你框架就odex好了 。
引用一下
ODEX. Framework,System.Data 全部附件及易懂教程 http://bbs.anzhi.com/thread-4779013-1-1.html
还有刷机包updater-script的语法(进阶):
创建一个名为update-script的文件,其内容如下(高亮部分):
1 show_progress 0.1 0
2
3 copy_dir PACKAGE:system SYSTEM:
4
5 show_progress 0.1 10
6
行1和行5:显示进度条
行3:复制刷机包中的system文件夹到Android的/system
注意:你应该在文件的最末尾多添加一个空行(也就是行6)
将C:\goapk压缩中的所有内容压缩为zip包(千万记住:是压缩goapk这个文件夹中的内容,不是goapk文件夹本身)
为goapk.zip签名
签名命令:java -jar signapk.jar certificate.pem key.pk8 goapk.zip update.zip
注意:你可以在这个帖子中找到为刷机包签名的教程和工具
将update.zip文件复制到SD卡中,然后手机进入recovery界面来刷入这个刷机包
进阶学习:(以下仅作参考,因实际情况不同,可能会有一定的出入。但是极度推荐学习本部分)
update-script 语法参考(在Android源码的recovery.c文件中定义):
copy_dir
语法:copy_dir <源目录> <目标目录> [<时间戳>]
描述:复制<源目录>中的内容到<目标目录>中。如果<源目录>中没有同名文件进行覆盖,那么<目标目录>中的原始内容会仍然存在不变。
示例:copy_dir PACKAGE:system SYSTEM:,这个命令会把刷机包中的system文件夹复制到手机的/system文件夹中
format
语法:format <根目录>
描述:格式化一个分区。
示例:format SYSTEM:,这个命令会格式化整个/system。注意:格式化时所进行的数据删除操作是不可逆转的。
delete
语法:delete <文件1> [... <文件N>]
描述:删除文件。
示例:delete SYSTEM:app/Calculator.apk,这个命令会删除手机system/app文件夹中的Calculator.apk文件。
delete_recursive
语法:delete_recursive <文件或目录1> [... <文件或目录N>]
描述:删除一个文件或递归删除某个文件夹(也就是包括该文件夹中的所有内容)
示例:delete_recursive DATA:dalvik-cache,这个命令会删除/data/dalvik-cache文件夹以及该文件夹中的所有内容。
run_program
语法:run_program <执行程序> [<参数> ...]
描述:运行一个刷机包中的外部程序。
示例:run_program PACKAGE:install_busybox.sh,这个命令会执行刷机包中的install_busybox.sh脚本(命令行)。
set_perm(本命令中涉及的数值,如有疑惑,请自行Google。uid=user id,gid=group id)
语法:set_perm
描述:设置某个文件或是指定的整个目录树的所有者和权限,就像是一个‘chmod’、‘chown’、以及‘chgrp’命令的集合体。
示例:set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh,这个命令会设置手机上system分区中etc/init.goldfish.sh文件的用户组为:shell;用户为:root;权限为:所有者以及所属用户组成员可以进行读取和执行操作,其他用户无操作权限。
set_perm_recursive(本命令中涉及的数值,如有疑惑,请自行Google。uid=user id,gid=group id)
语法:set_perm_recursive
描述:递归设置某个文件夹中所有内容的所有者和权限
示例:set_perm_recursive 0 0 0755 0644 SYSTEM:app,这个命令会递归设置手机上system/app文件夹以及其所有内容的用户组为:root;用户为:root;app文件夹的权限为:所有者可以进行读、写、执行操作,其他用户可以进行读取和执行操作;app文件夹下的所有文件的权限为:所有者可以进行读写操作,其他用户可以进行读取操作。
show_progress
语法:show_progress <小数> <持续时间>
描述:为下一个操作在屏幕上显示一个进度条,自动的根据<持续时间>指定的秒数来递增进度条状态(如果实际上进度条的推进是可以确定的,那就会更加迅速)。
示例:show_progress 0.1 0,这个命令是指,操作完成后,进度条前进0.1(10%)
symlink
语法:symlink <链接目标> <链接所在路径>
描述:创建一个符合链接(就像是 ‘ln-s’)。<链接所在路径>的格式类似于这样:根目录:路径, 但是<链接目标>则是指目标文件(而且位置可能是相对与链接所在路径的)
示例:symlink /system/bin/su SYSTEM:xbin/su,这个命令会为/system/bin/su在手机system分区的xbin文件夹下创建一个符号链接,名为su
源文档 <http://bbs.zhangku.com/thread-3647-1-4.html>
三、odex system。 (这个自动化 超级方便)
打开odex文件夹 - system data文件夹 - system odex文件夹 - 再打开那个system odex批处理文件 按提示来.很简单
发现G大的odex化工具没有删除dex。。。于是用了另一个脚本
四、odex data。 (和odex system一样的步骤) 只是另打开那个data odex文件夹 .你们odex了system绝对可以看到这个文件夹.
使用这两个自动化odex不需要像odex框架那么繁琐的删除dex文件 因为这是自动化 ~
这样就搞定啦~!!!!!!
五、关于单个文件odex化
引用:
还有如果以后你想自己添加一个apk的话,可以逐个制作odex,虽然有点麻烦,先确定之前制作framework的dexopt-wrapper还在system/bin里,然后连接手机,(最好复制adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll到windows/system32里,方便以后使用adb而不用每次打开cmd都要cd到当前目录)WIN+R输入CMD打开CMD,然后输入:
· adb shel
· 回车l
· su
· 回车
· cd system/app(这个目录是你存放apk的目录)
· 回车
· dexopt-wrapper XXX.APK XXX.odex
· 回车
完成后,把你刚才的apk文件在电脑上用winrar等打开,把dex文件删除,然后把文件拖动到我提供的ADB文件复制.bat上,选择路径,回车。完成,如果发现程序文件不存在,请重启手机。如果发现程序不能运行,请尝试签名apk。再不行就是apk不能制作odex。你可以先做完odex再一起复制到system/app,也可以先安装然后再直接在里面生成。这个有很多方法,主要靠自己灵活变通,你认为怎样做才好就怎样做。
源文档 <http://bbs.anzhi.com/thread-4848109-1-3.html>
六、关于odex化的效果与注意事项
odex化也就是相当于Zipalign优化apk性能,有什么作用。。。
对APK应用程序进行全面的优化,使软件更加流畅的运行并且对RAM的占用率更小..更多作用呢就请自己百度一下吧!这个软件也是从其他网站搜刮回来的。。。
注意:、删除、更新程序必知:由于APK与ODEX文件是一一对应的,故删除程序后需要删除同名ODEX文件,现在可以利用程序来删除,也可手动删除,暂时不删除不影响使用。更新程序必须删除同名ODEX,可以先更新再删除,也可先删除再更新,否者更新的程序会提示崩溃,更新后可以用程序单独优化。。。。。。。。。。。。。。。。。。。。。运行本程序直接删除所有优化文件即可恢复原状=======================================================================================================================================
优化原理说明======》》》你用winrar打开一个APK会发现classes.dex这个文件,这个dex文件就是APK的运行代码。但是这个代码还需要经过机器翻译成本机适用的代码进行运行。
而优化后的ROM中会多出一个与APK同名的odex文件,这是dex文件的优化文件。
这么做的好处在于,原来的APK执行过程是:APK--获得dex--机器翻译成odex,然后运行。
而优化后的执行过程是:odex,直接运行。
当然,这么说不完全正确,但是大概就是这样。
优点:程序开启减少了步骤,所以速度更快;
缺点:需要多占用一些空间,但是也不是太多
所有参考的内容都附上了链接
"D:\手机\apk\odex\ODEX全套.zip"附上工具
手机华为U8800,ROM是mengluole的2.3 miui ,本文作者是 ElvisZ
完成于2012/2/7 23:54 转载请注明出处。
发表时间 2012年3月25日23:30:34