欢迎光临
专注android技术,聚焦行业精粹,传扬中国传统文化,我们一直在努力

Apktool 问题排查—First type is not attr!

  1. apktool官方权威解答从github apktool开源项目issue中作者的回复中提炼出的总结
  2. 解决方案全面除了作者提供的解决方案,本地验证也提供了更多的解决方案,更全面

1、问题描述

1)错误日志:

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的开关:

原因如下,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都可以)

3、Aapt源码分析

3.1、ResourceTable.cpp源码

github源码:

https://github.com/aosp-mirror/platform_frameworks_base/blob/o-preview/tools/aapt/ResourceTable.cpp#L2637

aapt1源码里面对位置为0的type做了强校验,如果不为attr则编译报错

赞(1) 打赏
未经允许不得转载:花花鞋 » Apktool 问题排查—First type is not attr!

评论 1

  1. #1

    大佬,求修改过后的aapt mac可执行文件,谢谢

    albert5年前 (2019-08-28)回复

国内精品Android技术社区

专注android技术,聚焦行业精粹,传扬中国传统文化,我们一直在努力

联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册