在为游戏接入A站SDK时,发现接好的SDK,编译执行时,找不到资源Id。当时就很懵逼,搞不懂为什么R文件没有自动生成资源id,通过一天的研究,查找资料,终于搞定了!下面就是怎么重新编译生成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/Dexlin/Desktop/ -S res -I /Users/Dexlin/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