1. 程式人生 > >ecplise專案升級為android studio專案過程中遇到的問題總結

ecplise專案升級為android studio專案過程中遇到的問題總結

最近在使用AS常遇到一些問題反覆出現。於是整理了一下以前遇到的一些問題,並附帶常見的解決辦法。

  • 首先簡單看一下gradle build的工作流程,如圖:

如上圖,gradle編譯主要分為Load build,Configure build,calculate task graph ,Run tasks四個步驟,但是一般情況主要關注第4步Run tasks,這一步是編譯時問題高發地帶。大部分錯誤都是在Run tasks裡面尋找。

  • android studio尋找錯誤步驟:

1.點選下圖紅色區域檢視編譯錯誤日誌:

7

2. 找到具體出錯的task,在Terminal中手動執行任務,以便檢視錯誤。如圖:

8

3.在Terminal中用輸入命令 gradlew build  --debug/--scan/--stacktrace 編譯,以便發現問題,如下圖:

0

  • 常見錯誤收集分析:   

:xxx:compileDebugJavaWithJavac錯誤

描述:比較常見的錯誤,引發原因有多種,如java程式碼本身存在錯誤,程式碼中引用了不存在的三方庫,編譯快取錯誤等。

發現問題:首先Build->clean project再編譯。不行的話就在Terminal中輸入gradlew :xxx:compileDebugJavaWithJavac ,其中xxx根據實際情況替換對應出錯專案。比如我的執行結果的情況如下:1

出現該錯誤的是因為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,我的問題如下:3

不難看出是android.net.http.CertificateChainValidator出現衝突,在android studio介面雙擊shift,搜尋具體衝突位置。如圖:

4

可以看出有兩個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,我的錯誤如下:5

解決辦法:如果出現和上圖類似的錯誤,只需找到對應行修改即可。如果多個manifest都設定了啟動activity,只保留主工程的即可。