Gradle问题: AAPT2 error和"aapt.exe'' finished with non-zero exit value 1或者AAPT2与Robelectric不兼容

在使用Android Studio编译工程的时候,时常会遇到aapt2和aapt的问题,如下

Caused by: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
    at com.android.builder.png.AaptProcess$NotifierProcessOutput.handleOutput(AaptProcess.java:454)
    at com.android.builder.png.AaptProcess$NotifierProcessOutput.err(AaptProcess.java:411)
    at com.android.builder.png.AaptProcess$ProcessOutputFacade.err(AaptProcess.java:332)
    at com.android.utils.GrabProcessOutput$1.run(GrabProcessOutput.java:104)
Process 'command 'D:\SoftWare\AndroidSDK\build-tools\26.0.2\aapt.exe'' finished with non-zero exit value 1

那这个问题是如何发生,该如何解决?顺着来看

1)首先介绍下什么是Gradle
       简单的来说,Gradle是一个自动化项目构建工具,他可以帮助你配置项目的依赖,将项目进行编译,打包,部署……,也可以定义满足自己需要的构建逻辑,写入到build.gradle中供日后复用;
       我们的Android Studio其实就是基于Intellij IDEA的安卓开发环境的一个开发工具,他集成了Gradle插件,这样我们就可以在AS愉快的撸代码了

2)那怎么查看自己Android Studio上Gradle的版本?
方法一:如下图
这里写图片描述

方法二:查看gradle-wrapper.properties文件,如下图
这里写图片描述

3)aapt和aapt2是做什么用的?
aapt即Android Asset Packaging Tool,安卓资源打包工具,他负责将资源文件如xml,图片打包成R.Java(资源索引表),以及.arsc资源文件;随着Gradle版本的升级,在Android Plugin for Gradle 3.0.0里面,默认开启了AAPT2增量资源处理功能,


引用了这么多,那么我们就来看看aapt2 error和aapt.exe finished with non-zero exit value 1是如何产生的

我们用Android Studio来新建一个Module,我的AS版本为3.2 Canary 11,默认集成的Gradle版本为4.1,新建的Module如下
这里写图片描述
可以看出我是基于Android5.0构建的一个Moudle,Moudle结构如下
这里写图片描述
然后你编译一下工程,就会报aapt2 erro的错误,如下图
这里写图片描述

正如上面所说Android Gradle 3.0.0默认开启aapt2,那我们既然用不到,关掉他就好,关掉的方法如下

如果您的构建因为 AAPT2 资源处理问题失败或者您想要使用 Roboelectric,您可以通过以下方式停用 AAPT2:在您的 gradle.properties 文件中设置 android.enableAapt2=false,并从命令行运行 ./gradlew –stop,重新启动 Gradle 后台程序。

但是我们的Module里面没有gradle.properties文件啊?好吧,我们自己新建一个,并添加android.enableAapt2=false,最新的项目结构如下
这里写图片描述
可是重新编译之后,报”aapt.exe” finished with non-zero exit value 1错误,如下图
这里写图片描述
这又是为什么?
aapt是资源打包工具,那么我们就跟踪下项目的资源文件,看下项目的Manifest.xml,如下
这里写图片描述
在看下项目的res文件
这里写图片描述
可以发现manifest.xml中引入了mipmap/ic_launcher资源,而ic_launcher.xml使用的是vector这样的标签,因为我们项目是基于android 5.0编译的,但是5.0还不支持vcetor这样高级属性,顾出现了”aapt.exe” finished with non-zero exit value 1的错误,那解决办法就是删除这个资源,使用默认的png替换即可,替换的项目结构如下
这里写图片描述

我删除了原有项目中的mipmap文件夹,删除了ic_launcher_background.xml这样的利用vector属性的xml文件,重新编译项目,一切恢复正常.

综述:

在使用高版本的AS和Gradle构建项目的时候,会自动生成带有高级属性的项目,如利用vector属性的xml,mipmap资源;如果你的项目选择用的编译版本即android版本过低,则会出现aapt2和aapt的问题;

解决方法也很简单,去除这些高级属性

猜你喜欢

转载自blog.csdn.net/yi_master/article/details/80363372