odex合并的方法:


1. smali-1.2.2.jar 和 baksmali-1.2.2.jar

http://code.google.com/p/smali/downloads/list

2 . 需要这个 apk 所在的 rom 里面的一些 jar 文件,都在 /system/framework 里面: core.jar, ext.jar, framework.jar, android.policy.jar, services. Jar

当然,这五个是最基本的,有可能还不够,这种情况下面会讲到。(所以建议将/system/framework下的内容全部pull出来)

3. 总共分四步:

(1) 把下载好的 smali-1.2.2.jar 和 baksmali-1.2.2.jar ,还有 rom 里面抠出来的 5 个 jar ,放到工作目录,然后 apk 和 odex 也放到一起

(2) 分解 odex 文件为 class 文件。 命令: java -jar baksmali-1.2.2.jar -x xxx.odex,命令完成之后,会生成一个 out 文件夹,里面就是所有的 class 文件

如果出现问题,比如什么异常,缺少包什么的,就更到 rom 里面把出错信息里面要求的包拿出来,放到当前目录下。

(4) 将 class 生成为 classes.dex 文件。 命令: java -Xmx512M -jar smali-1.2.2.jar out -o classes.dex 这一步应该不会有什么问题,然后会生成 classes.dex 文件。

(5) 把 classes.dex 放入apk 里面,把盖子盖上。 最后这一步最简单了,用解压缩软件打开 apk ,然后把千辛万苦生成的 classes.dex 塞进去,就 ok 了。

这个 apk 就能用了。如果想给他重新签个名的话,去找个 Auto Sign 签名工具签署一下就行。 


Odex与deodex的区别:


打开一个apk,里面有很多个文件夹和文件,一般在layout负责界面,value负责字体颜色和文字显示等。


odex是整个apk的核心部分,负责功能实现,deodex就是把odex文件以classes.dex的形式和apk整合成一个文件。


一般来说官方rom都是odex的rom,而定制rom大部分都是deodex化的。


两者应该各有优点吧,貌似现在也没有统一的说法。官方rom大部分每个apk对应一个.odex文件,而deodex化的rom里面只有一个apk,把.odex转换成classes.dex放到apk包里面了。


所以 odex  rom的.apk+.odex=deodex化rom的1个.apk  (简单地来说,其实就上一个合并的过程)




== ODEX的优点 ==




1.刷完机首次进入系统的时间会缩短一些。文件的运行速度应该也有所提升。


2.APK文件不能单独安装,并且如果反编译APK文件,一般也只能得到资源文件。


可以说是起到一定的保护作用,避免被肆意修改和使用。这样做可以使其厂商保证一定的反盗版,因为没有没有dex文件的apk是无法正常安装的。


3.会增加一些可安装应用的空间,虽然不是很多。(这个我没发现)


== ODEX的缺点 ==


1.不方便修改ROM以及文件本身。


2.增加ROM包的体积,虽然不是很多


3.当你升级某个被ODEX的应用后,这个应用将会出现故障,最常见的就是FC。




而现在的定制rom之所以基本上都是deodex化的是因为:




1. 可以适当减小文件的体积,起到节省rom空间的作用;


2.主要方便rom定制者对rom的个性化定制和移植;apk相对容易反编译和修改,而odex先要解包成smali然后才能生成classes.dex,如果要再生成odex,还要用dexopt-wrapper,比较麻烦。


我个人感觉,如果只是简单的使用,不美化,不经常修改system/app下的文件的人,对系统文件进行ODEX化,应该是能起到一定的优化作用的,而现在大部分的安装应用程序都是单个apk文件,升级也不会有FC的问题。


== zipalign ==


在你的应用程序上运行zipalign,使得在运行时Android与应用程序间的交互更加有效率。因此,这种方式能够让应用程序和整个系统运行得更快。


在Android中,当资源文件通过内存映射对齐到4字节边界时,访问资源文件的代码才是有效率的。zipalign 可以简单优化APP.