1. 程式人生 > >eclipse專案匯入android studio 各類問題及解決方法

eclipse專案匯入android studio 各類問題及解決方法

          隨著時間的推移,技術的推進,開發android的IDE,逐漸由 eclipse轉移到android studio,但…  我們的拖延症是很嚴重的,只要eclipse能用一天就絕不遷移偷笑,只到有一天,專案越來越大,引入的第三方庫越來越多,超過了android的最大限制65535, 不得不使用拆包方式,不得不遷移到android studio大笑, 遷移專案過程中遇到很多坑,在此進行總結,並給大家提供參考。

一、大概介紹eclipse專案匯入android studio過程

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


2.  選擇專案裡的主工程,然後點選 Ok


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

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


二、遷移問題彙總

   匯入到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


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#[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,否則融雲SDKandroid7上無法連線;如果要使用大於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增加如下配置
android {
    defaultConfig {
		...
        //支援多個dex檔案的編譯
        multiDexEnabled true
		...
    }
}

dependencies {
	...
    compile 'com.android.support:multidex:1.0.1'
	...
}

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

檢視每個包的函式數,從而著手優化,哪些是廢棄程式碼可以刪掉,解決超過65535限制的問題,但如果程式碼無法再優化了,就只能採用上面的 multiDex打包了