安卓手机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 frameworksystem/appdata/app

顺序不能改

下载odex工具包

一、ODEX framework

安卓手机odex化与刷机包制作_第1张图片

 

运行  复制文件.bat

等待完成,然后按WIN+R,输入CMD,打开CMD,依次输入:

 

adb shell回车

su

回车

cd system/framework

回车

dexopter fr

 

安卓手机odex化与刷机包制作_第2张图片

 

 

等待完成

 

然后重启一次。如果你发现不能开机,请进入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这个文件是有关签名的

安卓手机odex化与刷机包制作_第3张图片

 

接下来是system文件夹

安卓手机odex化与刷机包制作_第4张图片

 

所有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(本命令中涉及的数值,如有疑惑,请自行Googleuid=user idgid=group id

语法:set_perm <属性> <路径> [... <路径N>]

描述:设置某个文件或是指定的整个目录树的所有者和权限,就像是一个‘chmod’、‘chown’、以及‘chgrp’命令的集合体。

示例:set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh,这个命令会设置手机上system分区中etc/init.goldfish.sh文件的用户组为:shell;用户为:root;权限为:所有者以及所属用户组成员可以进行读取和执行操作,其他用户无操作权限。

 

set_perm_recursive(本命令中涉及的数值,如有疑惑,请自行Googleuid=user idgid=group id

语法:set_perm_recursive <文件夹属性> <文件属性> <路径> [... <路径N>]

描述:递归设置某个文件夹中所有内容的所有者和权限

示例:set_perm_recursive 0 0 0755 0644 SYSTEM:app,这个命令会递归设置手机上system/app文件夹以及其所有内容的用户组为:root;用户为:rootapp文件夹的权限为:所有者可以进行读、写、执行操作,其他用户可以进行读取和执行操作;app文件夹下的所有文件的权限为:所有者可以进行读写操作,其他用户可以进行读取操作。

 

show_progress

语法:show_progress <小数> <持续时间>

描述:为下一个操作在屏幕上显示一个进度条,自动的根据<持续时间>指定的秒数来递增进度条状态(如果实际上进度条的推进是可以确定的,那就会更加迅速)。

示例:show_progress 0.1 0,这个命令是指,操作完成后,进度条前进0.110%

 

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批处理文件  按提示来.很简单

 

安卓手机odex化与刷机包制作_第5张图片

 

发现G大的odex化工具没有删除dex。。。于是用了另一个脚本

 

 

 

 

 

 

四、odex data  (和odex system一样的步骤)  只是另打开那个data odex文件夹 .你们odexsystem绝对可以看到这个文件夹.    

 

使用这两个自动化odex不需要像odex框架那么繁琐的删除dex文件  因为这是自动化 ~

 

 

安卓手机odex化与刷机包制作_第6张图片

 

 

这样就搞定啦~!!!!!!

 

五、关于单个文件odex

引用:

还有如果以后你想自己添加一个apk的话,可以逐个制作odex,虽然有点麻烦,先确定之前制作frameworkdexopt-wrapper还在system/bin里,然后连接手机,(最好复制adb.exe,AdbWinApi.dll,AdbWinUsbApi.dllwindows/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的占用率更小..更多作用呢就请自己百度一下吧!这个软件也是从其他网站搜刮回来的。。。

 

注意:、删除、更新程序必知:由于APKODEX文件是一一对应的,故删除程序后需要删除同名ODEX文件,现在可以利用程序来删除,也可手动删除,暂时不删除不影响使用。更新程序必须删除同名ODEX,可以先更新再删除,也可先删除再更新,否者更新的程序会提示崩溃,更新后可以用程序单独优化。。。。。。。。。。。。。。。。。。。。。运行本程序直接删除所有优化文件即可恢复原状=======================================================================================================================================

优化原理说明======》》》你用winrar打开一个APK会发现classes.dex这个文件,这个dex文件就是APK的运行代码。但是这个代码还需要经过机器翻译成本机适用的代码进行运行。

 

而优化后的ROM中会多出一个与APK同名的odex文件,这是dex文件的优化文件。

 

这么做的好处在于,原来的APK执行过程是:APK--获得dex--机器翻译成odex,然后运行。

                         而优化后的执行过程是:odex,直接运行。 

当然,这么说不完全正确,但是大概就是这样。

优点:程序开启减少了步骤,所以速度更快;

缺点:需要多占用一些空间,但是也不是太多

 

所有参考的内容都附上了链接

"D:\手机\apk\odex\ODEX全套.zip"附上工具

 

 

手机华为U8800ROMmengluole2.3 miui ,本文作者是 ElvisZ

                                               完成于2012/2/7 23:54    转载请注明出处。

发表时间 2012年3月25日23:30:34