合并apk和odex的方法

这种方法很早就有人说到,下面是我亲自操作后再重新整理的,希望对大家能有帮助。

 

Android的ROM中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作用呢? 如果你仔细观察会发现文件名是一一对应的,同时那些对应的apk文件中没有dex文件。这样做可以使其厂商保证一定的反盗版,因为没有dex文件的apk是无法正常安装的,而厂商直接将odex和不完整的apk文件放到手机rom固化到/system/bin中可以让一般用户无法正常导出使用。

可能想到的是合并odex和apk变成apk中包含dex文件的,这样合并后最终apk文件安装在/data/中,而rom存放在 /system/app中,所以最终导致了用户可装在Android手机中的软件会变少,占用系统空间。

下面介绍如何重新打包和签名的方法:

  一、APK生成odex文件方法:
  将源码在Linux或虚拟机上编译,在/root/working_directory/out/target/product/generic/system/app目录下,就会看到相应的apk包和odex文件。


二、合并odex和少dex的apk 为完整的apk文件

  1. 在下面网址下载最新的smali和baksmali:

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

注意一定要是最新的,如果不是最新的,会报错:

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: bad magic value: 64 65 79 0a 30 33 36 00
        at org.jf.dexlib.DexFile.<init>(DexFile.java:382)
        at org.jf.baksmali.main.main(main.java:249)

 

合并odex时,请将手机ROM中的framework中的文件全复制出来,即在/root/working_directory/out/target/product/generic/system/framework目录下,将要分解的文件放置到同一目录,为了减少错误,最好全部pull出来,这样可以避免如下错误:

Error occured while loading boot class path files. Aborting.
org.jf.dexlib.Util.ExceptionWithContext: Cannot locate boot class path file core.odex
at org.jf.dexlib.Code.Analysis.ClassPath.loadBootClassPath(ClassPath.java:237)
at org.jf.dexlib.Code.Analysis.ClassPath.initClassPath(ClassPath.java:145)
at org.jf.dexlib.Code.Analysis.ClassPath.InitializeClassPathFromOdex(ClassPath.java:110)
at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:96)
at org.jf.baksmali.main.main(main.java:278)



  2 .  通过odex生成class文件

        通过cmd命令,进入你刚下载的工具的目录下,然后执行如下命令:

        java -jar baksmali-1.4.1.jar -x package.odex

        执行完上面这行命令后,会生成一个out 文件夹里面是package.odex的class文件。(若出现问题,根据提示可以从rom的 /system/framework 中的**.jar放到pc上的java环境变量中一起生成。)

  3. 通过class生成classes.dex 文件

      使用如下命令生成classes.dex文件。

       java -Xmx512M -jar smali-1.4.1.jar out -o classes.dex

  4. 将classes.dex放到apk文件

        因为apk是zip的mime编码类型,使用winzip或winrar直接拖入到apk改名为zip的压缩包中即可。

  5. 不要忘记了签名,使用jdk中的arsigner和keytool打包重新签名即可

 

有时候发现别人手机里有一款 apk 挺好,想弄出来装自己手机上,可是却发现那个 apk 是残缺的,里面没有 classes.dex 文件,却有个跟 apk 同名的 odex 文件。残缺的 apk 是装不了的,只能把这个 apk 跟 odex 合并成一个完整的 apk 才能安装。 需要的工具:

1 . smali-1.4.1.jar 和 baksmali-1.4.1.jar

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

当然,这五个是最基本的,有可能还不够,这种情况下面会讲到。

总共分四步:

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

2 . 分解 odex 文件为 class 文件。命令: java -jar baksmali-1.4.1.jar -x 处是你要分解的 odex 文件的名字,命令完成之后,会生成一个 out 文件夹,里面就是所有的 class 文件。如果出现问题,比如什么异常,缺少包什么的,就更到 rom 里面把出错信息里面要求的包拿出来,放到当前目录下。

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

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

 

附上apk合并odex文件和apk签名的下载地址:http://download.csdn.net/detail/xiaoyaovsxin/4980234

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值