Android合并Apk和Odex的全过程解剖

本文详细记录了将Android的Apk与Odex文件合并的过程,包括遇到的问题和解决方法。作者通过尝试不同版本的smali工具,解决boot class path文件缺失的问题,并最终完成合并。尽管最后因为定制类导致合并失败,但该过程对于理解Apk和Odex的合并具有参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没来写博客了, 今天遇到一系列问题, 于是终于狠下心来写一下! 希望能帮助到一些有需要的朋友!


转载请注明下出处http://blog.youkuaiyun.com/izard999/article/details/39182773

谢谢


为什么要合并Apk和Odex呢? 下面先介绍一下我这样做的原因.

我们公司做类似小米盒子的产品(只是类似而已哟), 但是有两个供应商, 一个是创维(下面简称A),还有一个是某外包公司(下面简称B),  第一批货是B提供的, 里面带了个Settings的页面,还不错. 于是我们的相关人员就截了一些图,然后写了一些相关帮助文档.  没过多久, A公司送了个样本过来,  由于B没有提供Settings的源码, 所以A方自己弄了一个. 此时我们发现A方的Settings界面要漂亮许多,  于是我就想了个方案, 把A的settings pull出来, 然后push到A里面去.

但是我发现他里面是两个文件,  一个是 apk,一个是odex. 根据以前的经验, 必须要把两个合成一个才可以安装或者push(事实也证明把这两个文件同时push进去是没有用的).

于是我百度了好一些, 实际上都没什么用..  没办法, 对着那些前辈们提供的资料自己再研究一下

首先, 我把http://smali.googlecode.com/files/smali-1.2.2.jar  和http://smali.googlecode.com/files/baksmali-1.2.2.jar 这两个文件下载下来(某文章提供的), 然后按照

java -jar baksmali -x xxx.odex 报错

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

根据之前反编译的经验, 由此可以判断这个jar的版本低了, 于是我到官方去下载了2.0.3的版本(地址就不提供了, 自己google)

下载下来之后 继续java -jar baksmali -x xxx.odex, 依旧报错

Error occurred while loading boot class path files. Aborting.
org.jf.util.ExceptionWithContext: Cannot locate boot class path file /system/framework/core.odex

还行, 这次是告诉我少包了, 好的.  于是我把Genymotion中的system/framework 全部原封不动的pull下来, 再运行, 依旧报刚才的错!

然后我把我pull出来的文件扫了一遍, 发现全是APK,  那么我懂了.. 这种没分离的包还不行!

于是我把那个盒子里面的system/framework down下来,

运行java -jar baksmali.jar -d ./system/framework -x xxx.odex   搞定

这个时候注意了,  system/framework目录与jar包是平级的,   于是再运行java -Xmx512M -jar smali.jar out -o classes.dex

最后把生成的classes.dex复制到apk里面去, 就OK了!    等我把合并好的APK push到B的盒子里面去,  发现 应用程序列表是有的, 但是我一点开, 报错了.

找不到SystemWriteManager这个类  说实话这个类之前我根本没见过,  源码中没搜到.!

于是google了一番,得出的结论是  这是人家定制的...  那我就没办法玩儿了

虽然说这个办法最后没有成功, 但是学会了合并apk和odex,  还是很不错的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值