apk和odex的合并,让软件成为完整的apk包以便反编译

来源:互联网 发布:淘宝升级企业店铺入口 编辑:程序博客网 时间:2024/06/08 09:46
        Android的ROM中正常的软件都是apk内包含有一个classes.dex,但也有有时会没有(比如MIUI或有些HTC的ROM),却有很多odex文件,相对于APK中的dex文件而言这个odex有什么作用呢? 
       首先分析一下apk文件的安装过程。安装apk包,会在/data/app目录复制一份安装包,在/data/dalvikvm-cache目录放一个解压出来的classes.dex,如果有so文件,还要复制到对应的文件夹。但是,如果把一个apk分解为apk+odex,情况就大大不同了,这时完全可以把apk内的lib文件夹和classes.dex文件删掉,然后签名,配合odex一起使用,当然so文件也不能丢。所以,
            正常的包占的的空间=原包+classes.dex+so;
            分解后的包占的空间=分解包+odex+so。
       这样做可以使其厂商保证一定的反盗版,因为没有没有dex文件的 apk是无法正常安装的,而厂商直接将odex和不完整的apk文件放到手机rom固化到/system/bin中可以让一般用户无法正常导出使用,同时apk带odex不仅节约空间,而且还能优化加载速度。
       而那个 apk 是残缺的,里面没有 classes.dex 文件,残缺的 apk 是装不了的,只能把这个 apk 跟 odex 合并成一个完整的 apk 才能安装。

下面介绍合并的方法:

需要的工具:
1.smali-1.2.6.jar 和 baksmali-1.2.6.jar
2.还需要这个 apk 所在的 rom 里面的一些 jar 文件,都在 /system/framework 里面: core.jar, ext. jar, framework. jar, Android.policy. jar, services. jar 。当然,这五个是最基本的,有可能还不够,最好将整个framework文件夹里面的都放这里(不然可能会出异常)。

总共分四步:
1.   首先你的电脑要配置好java环境,不懂的自己Google。

2.把下载好的 smali-1.2.6.jar 和 baksmali-1.2.6.jar ,还有 rom 里面抠出来的 jar ,放到工作目录,然后 apk 和 odex 也放到一起。

3.分解 odex 文件为 class 文件。
命令: java -jar baksmali-1.2.6.jar -x <a.odex>
<a.odex> 处是你要分解的 odex 文件的名字(没有角括号),命令完成之后,会生成一个 out 文件夹,里面就是所有的 class 文件。

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

5.把 classes.dex 放入 apk 里面。
最后这一步最简单了,用解压缩软件打开 apk ,然后把千辛万苦生成的 classes.dex 拖进去替换原来的dex文件就 OK 了。这个 apk 就能用了。如果想给他重新签个名的话,去找个 Auto Sign 签名工具签署一下就行。


这里再共享一个非常简单的合并工具,用这个工具可以批量合并ROM里面的apk和odex文件,只需两步
首先把你要合并的ROM解压到romdir文件夹里面,然后点击odextools.bat就可以了(注意同样要java环境和整个framework文件夹里面的文件
odextools.rar