ecplise專案升級為android studio專案過程中遇到的問題總結
最近在使用AS常遇到一些問題反覆出現。於是整理了一下以前遇到的一些問題,並附帶常見的解決辦法。
- 首先簡單看一下gradle build的工作流程,如圖:
如上圖,gradle編譯主要分為Load build,Configure build,calculate task graph ,Run tasks四個步驟,但是一般情況主要關注第4步Run tasks,這一步是編譯時問題高發地帶。大部分錯誤都是在Run tasks裡面尋找。
- android studio尋找錯誤步驟:
1.點選下圖紅色區域檢視編譯錯誤日誌:
2. 找到具體出錯的task,在Terminal中手動執行任務,以便檢視錯誤。如圖:
3.在Terminal中用輸入命令 gradlew build --debug/--scan/--stacktrace 編譯,以便發現問題,如下圖:
- 常見錯誤收集分析:
:xxx:compileDebugJavaWithJavac錯誤
描述:比較常見的錯誤,引發原因有多種,如java程式碼本身存在錯誤,程式碼中引用了不存在的三方庫,編譯快取錯誤等。
發現問題:首先Build->clean project再編譯。不行的話就在Terminal中輸入gradlew :xxx:compileDebugJavaWithJavac ,其中xxx根據實際情況替換對應出錯專案。比如我的執行結果的情況如下:
出現該錯誤的是因為android 6.0(api 23)刪除了一些庫導致的。
解決辦法:
1.找到出錯工程gradle檔案的compileSdkVersion和targetSdkVersion修改為23以下。
2.在android sdk的安裝目錄找到對應jar包 比如/Users/xxx/Library/Android/sdk/platforms/android- 22/optional/org.apache.http.legacy.jar,拷貝到工程的libs目錄下,並在gradle檔案對應位置新增implementation('org.apache.http.legacy')。
:xxx:transformDexArchiveWithExternalLibsDexMergerForDebug,Program type already present,com.android.builder.dexing.DexArchiveMergerException等錯誤
描述:比較常見的錯誤,相同jar包(無論版本號是否相同)在多個工程中同時出現多份。
發現問題: gradlew :xxx:transformDexArchiveWithExternalLibsDexMergerForDebug,我的問題如下:
不難看出是android.net.http.CertificateChainValidator出現衝突,在android studio介面雙擊shift,搜尋具體衝突位置。如圖:
可以看出有兩個jar包包含了同一個類。
解決辦法:
1. jar包只保留一份,在多個工程中直接引用。
2. jar包保留多份,分別在每個工程中的gradle配置中的dependencies屬性中新增compileOnly ('對應的jar包')
:xxx:processDebugManifest, Manifest merger failed with multiple errors等錯誤
描述:處理AndroidManifest.xml檔案是出錯,引發原因有多種,比如manifest檔案本生配置錯誤,多個manifest檔案中都有設定application屬性或啟動activity,這樣在合併的時候就會出現衝突 。
發現問題:gradlew :xxx:processDebugManifest,我的錯誤如下:
解決辦法:如果出現和上圖類似的錯誤,只需找到對應行修改即可。如果多個manifest都設定了啟動activity,只保留主工程的即可。