Caused by: Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
at com.android.ide.common.res2.MergedResourceWriter.end(MergedResourceWriter.java:332)
at com.android.ide.common.res2.DataMerger.mergeData(DataMerger.java:301)
at com.android.ide.common.res2.ResourceMerger.mergeData(ResourceMerger.java:412)
at com.android.build.gradle.tasks.MergeResources.doIncrementalTaskAction(MergeResources.java:381)
好了不用找了,有用的信息就上面这点。
什么?你居然不告诉我在项目的哪个文件的哪一行代码的哪一个字符报的什么错误?
gradle编译器:我是一条小青龙,我有许多小秘密,就不告诉你,就不告诉你!
看日志里打印的AAPT2 error: check logs for details这一句了么,这个AAPT2的其中一个功能是配合android gradle 用来检测资源的标准性,这错误基本就是项目中某个资源有问题,而且很大可能是图片有问题,例如一个.png后缀名的图片实际并不是png图片,而是.jpg的,这个AAPT就会报错了,而且不会在这里告诉你是哪个图片出错,我去网上一搜,基本都是建议把gradle配置改成老版本,也就是在gradle.properties里加上这一句:
android.enableAapt2=false
看代码字面意思就知道这是把gradle编译检测资源功能给关了,我猜这时你心里会先后出现两个想法:
想法1:原来还可以这样设置,还好能设置关掉检测,终于找到解决办法了,赶紧试一试去;
想法2:这样直接关掉问题是可能解决了,但是没解决根本问题呀,以后gradle再升级后强制检测资源怎么办;
而且有强迫症的人怎么办,绝对不能允许这种有潜在危险的资源留在项目中的呀,ok看提示AAPT2 error: check logs for details,在android studio的terminal或者在windos命令行里进入本项目根目录执行gradle编译命令:
gradlew compileDebug --stacktrace
编译出错,看下面这条提示
* Try:
Run gradlew tasks to get a list of available tasks. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
执行下面命令输出详细信息
gradlew compileDebug --info
找到下面信息
Initialized native services in: C:\Users\Administrator\.gradle\native
The client will now receive all logging from the daemon (pid: 2608). The daemon log file: C:\Users\Administrator\.gradle\daemon\4.4\daemon-2608.out.log
daemon-2608.out.log这个文件就是详细编译信息,打开来看看:
:app:generateDebugBuildConfig UP-TO-DATE
:app:prepareLintJar UP-TO-DATE
:app:mainApkListPersistenceDebug UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResourcesAAPT err(Facade for 101062891): ERROR: 9-patch image \\?\G:\github\Vod_ott\app\src\main\res\drawable-hdpi\call_gray.9.png malformed.
AAPT err(Facade for 14478131): ERROR: 9-patch image \\?\G:\github\Vod_ott\app\src\main\res\drawable-hdpi\local_bg.9.png malformed.
AAPT err(Facade for 14478131): Frame pixels must be either solid or transparent (not intermediate alphas).
AAPT err(Facade for 14478131): Found at pixel #14 along top edge.
AAPT err(Facade for 412895172): ERROR: 9-patch image \\?\G:\github\Vod_ott\app\src\main\res\drawable-hdpi\btn_normal.9.png malformed.
AAPT err(Facade for 101062891): Frame pixels must be either solid or transparent (not intermediate alphas).
AAPT err(Facade for 412895172): Frame pixels must be either solid or transparent (not intermediate alphas).
AAPT err(Facade for 101062891): Found at pixel #31 along top edge.
AAPT err(Facade for 412895172): Found at pixel #4 along top edge.
Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT error: check logs for details
:app:mergeDebugResources FAILED
FAILURE: Build failed with an exception.
这下太清楚了,就是drawable-hdpi文件夹里的call_gray.9.png,local_bg.9.png和btn_normal.9.png这三坨老鼠屎搞的,居然提示found an invalid color,找UI改图,把图片一换,果然问题解决。
等等,是不是有人按这种方法操作了,并在详细log文件里搜了很久,眼睛都看大了,还是没找到想要的具体错误信息,告诉你一个惊天的秘密,刚刚被你不屑一顾的 android.enableAapt2=false 其实有大用,如果你的gradle版本是3.0以上,会默认开启AAPT2,如果你不加这个禁止配置,就会使用AAPT2来检测,但是AAPT2在日志里又不打印错误信息,实在太坑了;这时你得把这行配置加上去,加上之后gradle就会用AAPT第一版本来检测资源,不过还是会报错:
Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT error: check logs for details
从之前的AAPT2变成了AAPT了,所以就算加了这一行也不一定能解决所有的错误,难道是因为这个图片资源太老,连AAPT第一版本的检测都过不了?(还想通过改配置而不找具体原因治标不治本的解决?再给你指一条你应该不会去用的路子,用eclipse来运行,这个不会检测你的资源)
这时再执行上面查看详细log日志的操作,再看Log文件就有具体信息了,也就是说用AAPT第一版本编译会打印出具体错误文件,不知道是不是AAPT2有日志开关还是有bug,有大侠知道烦请告知。
Process 'command 'E:\android\Android_SDK_64\build-tools\27.0.3\aidl.exe'' finished with non-zero exit value 1
又是这种不说具体原因,那就再去看详细信息
:app:compileDebugAidlaidl.exe E 05-21 17:48:18 12260 12700 aidl.cpp:580] refusing to generate code from aidl file defining parcelable
G:\github\Vod_ott\app\src\main\aidl\com\android\internal\ITelephony.aidl:30 interface ITelephony should be declared in a file called com\android\internal\telephony\ITelephony.aidl.
aidl.exe E 05-21 17:48:18 8080 14340 aidl.cpp:588] Invalid package declaration 'com.android.internal.telephony'
FAILED
FAILURE: Build failed with an exception.
这个不是AAPT报错,所以跟AAPT版本也没关系了,不用禁2用1,从Log信息中很容易看出来是因为ITelephony.aidl这个aidl文件里的package写错了
很明显文件位置放错了,把Itelephony.aidl移到telephony里,编译运行,顺利安装。