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

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


转载请注明下出处http://blog.csdn.net/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,  还是很不错的

猜你喜欢

转载自blog.csdn.net/izard999/article/details/39182773
今日推荐