好久没来写博客了, 今天遇到一系列问题, 于是终于狠下心来写一下! 希望能帮助到一些有需要的朋友!
转载请注明下出处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, 还是很不错的