- apktool官方权威解答从github apktool开源项目issue中作者的回复中提炼出的总结
- 解决方案全面除了作者提供的解决方案,本地验证也提供了更多的解决方案,更全面
1、问题描述
1)错误日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
I: Using Apktool 2.2.3-dirty I: Checking whether sources has changed... I: Smaling smali folder into classes.dex... I: Checking whether resources has changed... I: Building resources... W: A/ (15044): First type is not attr! W: W: This application has requested the Runtime to terminate it in an unusual way. W: Please contact the application's support team for more information. Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 3): [C:\Users\USER\AppData\Local\Temp\brut_util_Jar_4058827053303104259.tmp, p, --forced-package-id, 127, --min-sdk-version, 14, --target-sdk-version, 23, --version-code, 1, --version-name, 1.0, --no-version-vectors, -F, C:\Users\USER\AppData\Local\Temp\APKTOOL142551802667663674.tmp, -0, arsc, -0, arsc, -I, C:\Users\USER\AppData\Local\apktool\framework\1.apk, -S, C:\Users\USER\Test\app-debugkotlin\res, -M, C:\Users\USER\Test\app-debugkotlin\AndroidManifest.xml] at brut.androlib.Androlib.buildResourcesFull(Androlib.java:493) at brut.androlib.Androlib.buildResources(Androlib.java:427) at brut.androlib.Androlib.build(Androlib.java:326) at brut.androlib.Androlib.build(Androlib.java:264) at brut.apktool.Main.cmdBuild(Main.java:231) at brut.apktool.Main.main(Main.java:84) Caused by: brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 3): [C:\Users\USER\AppData\Local\Temp\brut_util_Jar_4058827053303104259.tmp, p, --forced-package-id, 127, --min-sdk-version, 14, --target-sdk-version, 23, --version-code, 1, --version-name, 1.0, --no-version-vectors, -F, C:\Users\USER\AppData\Local\Temp\APKTOOL142551802667663674.tmp, -0, arsc, -0, arsc, -I, C:\Users\USER\AppData\Local\apktool\framework\1.apk, -S, C:\Users\USER\Test\app-debugkotlin\res, -M, C:\Users\USER\Test\app-debugkotlin\AndroidManifest.xml] at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:441) at brut.androlib.Androlib.buildResourcesFull(Androlib.java:479) ... 5 more Caused by: brut.common.BrutException: could not exec (exit code = 3): [C:\Users\USER\AppData\Local\Temp\brut_util_Jar_4058827053303104259.tmp, p, --forced-package-id, 127, --min-sdk-version, 14, --target-sdk-version, 23, --version-code, 1, --version-name, 1.0, --no-version-vectors, -F, C:\Users\USER\AppData\Local\Temp\APKTOOL142551802667663674.tmp, -0, arsc, -0, arsc, -I, C:\Users\USER\AppData\Local\apktool\framework\1.apk, -S, C:\Users\USER\Test\app-debugkotlin\res, -M, C:\Users\USER\Test\app-debugkotlin\AndroidManifest.xml] at brut.util.OS.exec(OS.java:95) at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:435) ... 6 more |
2)复现方式
拿到一个apk包使用apktool重新打包时提示此错误,但同样的apktool工具打其它apk包没有出现此问题。初步猜测和apk有关系
2、ApkTool官方分析
Apktoolissue地址:https://github.com/iBotPeaches/Apktool/issues/1520
g
2.1、”First type is not attr!”错误的直接原因
apktool作者发现待重打包的apk的resource.arsc里面第一个不是attr,而是anim。然而在google的aapt工具里面对resource.arsc里面第一个类型必须得是attr有强校验,否则就会报“First type is not attr!”的错误。作者具体分析如下:

2.2、错误的根本原因是ApkTool使用了aapt1去对aapt2打过的包重打包
作者发现ApkTool里面使用了aapt1去对一个已经使用了aapt2打包的apk重打包导致此问题

2.3、解决办法
2.3.1、重新指定framework-dir
作者从AOSP镜像里面fork了platform-frameworks-base,修改了对”
First type is not attr! “的强校验,让用户在使用apktool时使用empty-framework-dir并指定一个新的framework,就可以解决此问题。
作者对platform-frameworks-base的改动如下:

2.3.2、关闭AndroidStudio的 android.enableAapt2
在工程的gradle.properties中关闭aapt2的开关:
1 |
android.enableAapt2=false |
原因如下,Android3.0开始google默认开启了aapt2作为资源编译的编译器。注意:如果你的AndroidStudio的版本是3.0,但是你的Android gradle 插件版本小于3.0,则默认开关是关闭的,只有Android gradle 插件的版本大于3.0该开关才默认打开(即:值为true)
classpath ‘com.android.tools.build:gradle:2.3.3’
Android gradle 插件版本为2.3.3
Android官方解释如下:

2.3.3、降低Android Gradle 插件的版本
从上面的方案中可以分析出,降低Android Gradle 插件的版本也能解决此问题。不过该方法对工程影响可能会比较大。
修改方法为修改工程根目录的build.gradle,找到buildscript块,修改classpath为com.android.tools.build.gradle的版本号为2.3.3(小于3.0都可以)
1 2 3 |
dependencies { classpath 'com.android.tools.build:gradle:2.3.3' } |
3、Aapt源码分析
3.1、ResourceTable.cpp源码
github源码:

aapt1源码里面对位置为0的type做了强校验,如果不为attr则编译报错
大佬,求修改过后的aapt mac可执行文件,谢谢