天天看點

eclipse 項目導入android studio 各類問題及解決方法

随着時間的推移,技術的推進,開發Android的IDE,逐漸由 eclipse轉移到android studio,但…  我們的拖延症是很嚴重的,隻要eclipse能用一天就絕不遷移

eclipse 項目導入android studio 各類問題及解決方法

,隻到有一天,項目越來越大,引入的第三方庫越來越多,超過了android的最大限制65535, 不得不使用拆包方式,不得不遷移到android studio

eclipse 項目導入android studio 各類問題及解決方法

, 遷移項目過程中遇到很多坑,在此進行總結,并給大家提供參考。

一、大概介紹eclipse項目導入android studio過程

1.  點選Import project (Eclipse AD, Gradle,etc.) 這一項

eclipse 項目導入android studio 各類問題及解決方法

2.  選擇項目裡的主工程,然後點選 Ok

eclipse 項目導入android studio 各類問題及解決方法

3. 一路點選next,最後導入完成

   導入完成後,會自動生成 import-summary.txt檔案,裡面寫明了遷移後項目目錄、檔案位置等的一些變化,可以仔細看看

eclipse 項目導入android studio 各類問題及解決方法

二、遷移問題彙總

   導入到android studio後,并非一帆風順,而是各種坑坑窪窪~

   文中 android studio 簡稱AS

1. 圖檔命名問題

    AS對圖檔命名要求比eclipse嚴格,圖檔名稱隻能有 小寫字母、數字及下劃線組成;

報錯資訊:

F:\kydd\yzone\yzone\src\main\res\drawable-hdpi\common_listview_headview_red_arrow.png.png

Error:Error: '.' is not a valid file-based resource name character: File-based resource names must contain only lowercase a-z, 0-9, or underscore

問題原因: 圖檔名稱為:common_listview_headview_red_arrow.png.png,圖檔名包含了 '.',是以報錯

解決方法:重命名圖檔,去掉一個 .png

2.  找不到 support.v4包

報錯資訊:

F:\kydd\yzone\iMKit\src\main\Java\io\rong\imkit\CallEndMessageItemProvider.java

Error:(8, 30) 錯誤: 程式包android.support.v4.app不存在

Error:(193, 19) 錯誤: 找不到符号

符号:   類 FragmentActivity

位置: 類 CallEndMessageItemProvider

Error:(185, 137) 錯誤: 無法通路DialogFragment

找不到android.support.v4.app.DialogFragment的類檔案

Error:(186, 13) 錯誤: 方法不會覆寫或實作超類型的方法

解決方法:引入新版support.v4

eclipse 項目導入android studio 各類問題及解決方法

3. .9圖錯誤

    AS中,.9圖必須是規範的.9圖,否則就會報錯;

    (1)如果一張圖不是.9圖,則圖檔名稱中不要包含.9;

   (2).9圖必須對四個邊都進行了描點,AS才能進行識别; 

報錯資訊:

Error:java.lang.RuntimeException: CrunchingCruncher chat_to_bg_normal.9.png failed, see logs

或者:

Error:java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException:

Error:Execution failed for task ':yzone:mergeDebugResources'.

> Error: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: 

解決方法:

(1)如果不是.9圖,則把名稱中的.9去掉,如果是.9圖,那麼重新制作一下

(2)也可以把圖檔合法性檢查關閉,在build.gradle增加如下(我測試了這個好像不起效)

android {

...

aaptOptions.cruncherEnabled = false

aaptOptions.useNewCruncher = false

...

}

4, 權限、activity在 manifest.xml檔案中重複申明

報錯資訊:Error:Execution failed for task ':yzone:processDebugManifest'.

> Manifest merger failed with multiple errors, see logs

詳細log:

F:\kydd\yzone\yzone\src\main\AndroidManifest.xml:93:5-69 Warning:

Element uses-permission#android.permission.FLASHLIGHT at AndroidManifest.xml:93:5-69 duplicated with element declared at AndroidManifest.xml:91:5-69

F:\kydd\yzone\yzone\src\main\AndroidManifest.xml:773:9-777:55 Error:

Element activity#io.rong.imkit.widget.provider.TakingPicturesActivity at AndroidManifest.xml:773:9-777:55 duplicated with element declared at AndroidManifest.xml:674:9-677:52

F:\kydd\yzone\yzone\src\main\AndroidManifest.xml Error:

Validation failed, exiting

解決方法:

在manifest.xml檔案中,去掉重複的即可, AS的檢查比eclipse嚴格

5. 同一項目,有多個子module時,在兩個或以上module中聲明同一個meta-data,且值不同時,報錯

報錯資訊: Error:Execution failed for task ':yzone:processDebugManifest'.

> Manifest merger failed : Attribute meta-data#RONG_CLOUD_A[email protected] value=(xxxxxxxx) from AndroidManifest.xml:560:13-42

is also present at [yzone:iMKit:unspecified] AndroidManifest.xml:163:13-42 value=(yyyyyyyyyyy).

Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:558:9-560:45 to override.

解決方法:

(1)在其中一個module鐘删除,保留正确的那個;

(2)或者在主module中的meta-data中,加上 'tools:replace="android:value",如下:

<meta-data
tools:replace="android:value"
         android:name="RONG_CLOUD_KEY"
         android:value="${RONG_CLOUD_KEY}" />      

6. 最低版本号設定過低,報錯

    我們的項目中使用了個視訊播放的第三方庫,最低版本号支援14,而我們的build.gradle檔案中,最低版本号設定了13,固報錯

報錯資訊:Error:Execution failed for task ':yzone:processDebugManifest'.

> Manifest merger failed : uses-sdk:minSdkVersion 13 cannot be smaller than version 14 declared in library [com.github.danylovolokh:video-player-manager:0.2.0] F:\kydd\yzone\yzone\build\intermediates\exploded-aar\com.github.danylovolokh\video-player-manager\0.2.0\AndroidManifest.xml

Suggestion: use tools:overrideLibrary="com.volokh.danylo.video_player_manager" to force usage

解決方法:将最低版本号改為要求的即可

defaultConfig {
    ......
    minSdkVersion 14
    targetSdkVersion 23  //隻能用23,否則融雲SDK在android7上無法連接配接;如果要使用大于23,則需要加入 sqlite.so等包
     ......        
}      

7. compileSdkVersion 設定過低

報錯資訊:

F:\kydd\yzone\yzone\build\intermediates\res\merged\debug\values-v23\values-v23.xml

Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.

Error:(18) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.

Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.

Error:(18) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.

Error:Execution failed for task ':yzone:processDebugResources'.

> com.android.ide.common.process.ProcessException: Failed to execute aapt

解決方法:compileSdkVersion 設定為24

android {

......

    compileSdkVersion 24

......

}

8. android6.0及以上沒有httpclient,報錯

報錯資訊:

Error:(9, 30) 錯誤: 程式包org.apache.http.client不存在

Error:(218, 14) 錯誤: 找不到符号

符号: 類 ClientProtocolException

Error:(219, 29) 錯誤: 無法通路HttpRequestBase

找不到org.apache.http.client.methods.HttpRequestBase的類檔案

Error:(252, 29) 錯誤: 無法通路HttpEntityEnclosingRequest

找不到org.apache.http.HttpEntityEnclosingRequest的類檔案

Error:Execution failed for task ':yzone:compileDebugJavaWithJavac'.

> Compilation failed; see the compiler error output for details.

解決方法:

在build.gradle中添加如下配置

android {

......

//android6.0 沒有httpclient了,如用android23編譯,需要加上該行,android23以下的不需要加這行

        useLibrary 'org.apache.http.legacy'

......

}

9. 項目函數數超過65535

報錯資訊:

Error:Error converting bytecode to dex:

Cause:com.android.dex.DexIndexOverflowException: Cannot merge new index 65569 into anon-jumbo instruction!

Error:Execution failed for task':yzone:transformClassesWithDexForDebug'.

>com.android.build.api.transform.TransformException:com.android.ide.common.process.ProcessException:java.util.concurrent.ExecutionException:java.lang.UnsupportedOperationException

解決方法 :build.gradle增加如下配置

[java]  view plain  copy

  1. android {  
  2.     defaultConfig {  
  3.         ...  
  4.         //支援多個dex檔案的編譯  
  5.         multiDexEnabled true  
  6.         ...  
  7.     }  
  8. }  
  9. dependencies {  
  10.     ...  
  11.     compile 'com.android.support:multidex:1.0.1'  
  12.     ...  
  13. }  

檢視每個包函數數的工具:https://github.com/mihaip/dex-method-counts

檢視每個包的函數數,進而着手優化,哪些是廢棄代碼可以删掉,解決超過65535限制的問題,但如果代碼無法再優化了,就隻能采用上面的 multiDex打包了