編譯錯誤處理

1.編譯報錯信息

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,有大俠知道煩請告知。

2.編譯報錯信息

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裏,編譯運行,順利安裝。

發佈了48 篇原創文章 · 獲贊 53 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章