聚合打包使用的工具为apktool +dex2jar
问题1:
乐视渠道出现找不到资源问题,原因在于apktool在合并res资源的attrs时, 并不能插入到attrs资源中,
导致apktool生成不了R styleable.smali文件和在R.smali文件中不存在R s t y l e a b l e . s m a l i 文 件 和 在 R . s m a l i 文 件 中 不 存 在 R styleable属性
解决:
手动把 资源复制到attrs中,再使用aapt命令生成R.java文件,然后把java文件转换成smali文件,复制所有的smali文件覆盖掉原有同名的smali文件(在package目录下),重新打包即可
问题2:
A站渠道出现R文件资源问题,因为渠道资源索引R文件导致
解决:
1.生成smali文件夹
使用打包脚本生成一个合并ACfunSDK后的无签名apk包,使用apktool d xx.apk解压apk,生成smali文件夹
2.生成R文件
把步骤1获得的AndroidManifest.xml文件和res文件夹复制到一个新建的文件夹里,使用aapt命令生成R.java文件,命令如下:
aapt package -f -m -J /Users/laiying/Desktop/ -S res -I /Users/laiying/Library/Android/sdk/platforms/android-19/android.jar-M AndroidManifest.xml
红色部分为需要修改的地方:
第一个红色部分:R文件生成后存放路径(R文件会自动保存在游戏包名目录下)
第一个红色部分:使用的SDK编译版本
出现问题总结:
1.如drawable-mdpi与drawable-mdpi-v4中同时存在相同文件名的文件,需要删除drawable-mdpi中的文件
2.如果游戏的AndroidManifest.xml文件中存在android:isGame=”true”属性,需要把它去除
3.如提示values-v21中存在不支持的样式,去除即可
3.编译R.java文件
javac -source 1.6 -target 1.6 R.java)
4.生成的R文件的jar
把R文件所在的目录生成为JAR
命令 jar cvf all.jar com
5.生成 dex文件
把R文件生成的JAR编译为dex文件
命令: dx –dex –output=classes.dex all.jar
*如果出现下面错误需要下载dx.jar(把dx.bat文件拷贝到android-sdk\build-tools\23.0.2\lib目录下
):
java.lang.RuntimeException: Exceptionparsing classes
atcom.android.dx.command.dexer.Main.processClass(Main.java:752)
atcom.android.dx.command.dexer.Main.processFileBytes(Main.java:718)
atcom.android.dx.command.dexer.Main.access$1200(Main.java:85)
atcom.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(Main.java:1645)
6、生成smali文件
使用baksmali-2.0.3.jar把获得的dex文件转换为smali文件
命令:java -jar baksmali-2.0.3.jar classes.dex
7.替换smali文件
把生成的smali文件替换到步骤1中相同的目录下
如:生成的smali文件路径为:com.test,即需要替换到步骤1中的com.test
8、重新打包签名即可
问题3:
在汇编时出现找不到类,或者类不匹配问题,某些jar的包下存在的类数目超过26个,导致有大小写的类名出现,因为系统不区分大小写,所以解压出来的某些类被覆盖
解决:
1.不解压jar,直接合并成dex文件 dx –dex –output=classes.dex all.jar test.jar(可以合并多个jar)
2、解压成smali文件,再把smali文件合并成dex(需要用到baksmali.jar / smali.jar)
命令如下:
dex转smali: java -jar baksmail.jar -o out/ classes.dex
smail转dex: java -jar smali.jar out/ -o class.dex
问题4:
apktool修改versionCode/versionName:
运行apktool命令进行解包会生成一个apktool.yml打开该文件可以看到这两个值,直接修改汇编就可以
versionCode: ‘8’
versionName: 1.0.7.9
包名的修改需要在AndroidManifest.xml修改
问题5:
apktool汇编失败:
at brut.util.OS.exec(OS.java:97)
at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:435)
… 6 more
Caused by: java.io.IOException: Cannot run program “C:\Users\ADMINI~1\AppData\Local\Temp\brut_util_Jar_5992000255534415667.tmp”: CreateProcess error=206, 文件名或扩展名太长。
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at brut.util.OS.exec(OS.java:90)
… 7 more
Caused by: java.io.IOException: CreateProcess error=206, 文件名或扩展名太长。
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(ProcessImpl.java:386)
at java.lang.ProcessImpl.start(ProcessImpl.java:137)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
… 8 more
原因:
apktool中对资源文件进行了检索,导致一些自定义的文件不能被解释
解决:
1、修改apktool 2.0.0版本
2、或者直接把解包出来生成的apktool.yml中的doNotCompress:下的内容删除,例如把下面的红框内容删除
提示找不到资源
解决:查看是否被渠道资源覆盖游戏资源,把渠道资源文件名修改成和游戏资源文件名不同的,就不会被覆盖了,如果不是覆盖资源问题,那就需要查看游戏是否缺失该资源
汇编时提示提过目录,会导致assets的某些资源没有汇编到apk;
1、在apktool.bat文件中增加红框部分代码,需要注意的是assets\assets_resources 目录为你需要打包进apk的文件目录
2、在解包apk时生成的apktool.yml 文件中把doNotCompress:节点下的- asseets开头的字段全部删除
删除前:
问题7:
汇编时出现 .9图解释出错,res/values/public.xml汇编出错
解决:使用最新的apktool工具
更多问题后续更新