Gradle 分析 aapt.exe finished with non-zero exit value 1

aapt.exe finished with non-zero exit value 1

今天在适配 Android 8.0 的过程当中遇到了一个问题,困扰了我 3 个小时。最终解决了,今天就总结一下如何处理这一类问题 :

我在 Refresh Gradle 的时候提示报错 :

Process 'command 'E:\sdk\build-tools\27.0.3\aapt.exe'' finished with non-zero exit value 1

上面的信息不够详细,你打开左侧的打开 task 列表,如下图 :

点击报错的任务 :

首先看报错的第一行。Gradle 在执行 :app:processDebugResources 任务的时候报错,这句话的意思是在执行 app 模块的 processDebugResources 过程中,抛出了异常信息,然而这异常信息中没有其他有用的信息。其中 :app 为我定义的模块名称,大家知道 Gradle 一个工程中可以添加多个模块,如果你没有多个模块的话,这里只会显示对应的任务。

我们看到现在报错提示信息很模糊,无法定位到具体的错误。因此可以单独在工程目录执行这个任务 :

gradlew :app:processDebugResources   -s

其中 -s 为日志选项 如果你想看更详细的日志,建议使用 -d ,更多日志选项如下表 :

日志选项用途
-i/ --info在默认配置下,Gradle 构建不会输出大量的日志信息。通过这个选项将日志级别设置成 INFO 来获得更过的日志信息。
-d/–debug以 DEBUG 日志运行 Gradle 构建,将会产生大量的日志信息,包括堆栈跟踪信息,这个在查错的时候很有用。
-q/–quiet减少构建输出只剩下错误信息
-s/–stacktraceGradle 构建失败如果有异常抛出,这个 -s 选项会打印出一个简单的堆栈跟踪信息,这在调试失败时候很有用。
-S/–full-stacktrace打印出完整的异常堆栈跟踪信息

执行完后,我们会发现 Build Failed , 向上翻一下日志 ,发现有提示 Error :

C:\Users\cqw\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.1.0.aar\48e23dd036124e93301137ed877a949f\res\values\values.xml:246:5-69: AAPT: Attribute "tint" already defined with incompatible format.

C:\Users\cqw\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.1.0.aar\48e23dd036124e93301137ed877a949f\res\values\values.xml:246:5-69: AAPT: Original attribute defined here.

C:\Users\cqw\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.1.0.aar\48e23dd036124e93301137ed877a949f\res\values\values.xml:246:5-69: AAPT: Attribute "tintMode" already defined with incompatible format.

C:\Users\cqw\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.1.0.aar\48e23dd036124e93301137ed877a949f\res\values\values.xml:246:5-69: AAPT: Original attribute defined here.

如下图 :

原因其实很简单:
appcompat-v7-26.1.0.aar 的 values.xml 中已经定义了 tintMode/tint ,但是我在其他文件中也定义了这些属性。 即自定义属性的属性名称不能跟系统默认的名称冲突 。


解决办法

1.首先在你的工程的 attrs 中查询是否有 tintMode/tint 定义。(我搜索了没发现)

2.然后查询你所依赖的 module 中的 attrs 文件中有没有 tintMode/tint 定义。(搜索了还没发现,这时候我的心态已经有了点变化。会不会是编译器在忽悠我。)

3.全局搜索 xml 文件中的 tintMode/tint。(我不仅搜索了,还使用了 Invalidate Caches/Restart(事实上你不需要 Invalidate Caches ),此时心态有点崩溃,开始怀疑自己当初为什么选择 android 开发。)

4.如果你到这一步还没发现哪里有定义属性的话,那么一定是第三方的依赖中的 attrs 定义了。我相信一个大工程必然依赖了很多第三方包。我们知道 Gradle 构建 APK 过程中,会将所有的资源文件文件整合到一起了,找到你的 build 目录,如下图 :

找到 values 目录(因为错误提示中,提示了 values 中已经定义了相关属性),这 values 文件中不仅有我们项目自定义的属性,还有系统定义的属性,还有第三方依赖包的属性。

我在文件中搜索 tintmode 果然,发现了可疑的定义:

    <declare-styleable name="MdIcon"><attr format="boolean|reference" name="enabled"/><attr format="color|reference" name="tint"/><attr format="integer" name="tintMode"><enum name="clear" value="0"/><enum name="src" value="1"/><enum name="dst" value="2"/><enum name="src_over" value="3"/><enum name="dst_over" value="4"/><enum name="src_in" value="5"/><enum name="dst_in" value="6"/><enum name="src_out" value="7"/><enum name="dst_out" value="8"/><enum name="src_atop" value="9"/><enum name="dst_atop" value="10"/><enum name="xor" value="11"/><enum name="darken" value="16"/><enum name="lighten" value="17"/><enum name="multiply" value="13"/><enum name="screen" value="14"/><enum name="add" value="12"/><enum name="overlay" value="15"/></attr></declare-styleable>

然后借助谷歌,搜索代码片段,发现这个属性是一个第三方库 https://github.com/henrytao-me/android-md-core 中的代码。然后再看一眼自己的 gradle ,发现了依赖 :

implementation 'me.henrytao:mdcore:23.2.1'

先移除依赖,然后重新编译,编译通过。

5.理论上来上,到第四步已经能解决大部分问题了,不过这个时候,你也可以通过分析依赖。以我的模块为例,如下 :

gradlew  :app:dependencies > test.log

上述代码将依赖输出到 test.log 中,方便用 Notepad 打开搜索。你也可以直接输出到控制台:

gradlew  :app:dependencies 

或者打印整个项目依赖

gradlew  dependencies 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值