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,否則融雲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增加如下配置android {
defaultConfig {
...
//支援多個dex檔案的編譯
multiDexEnabled true
...
}
}
dependencies {
...
compile 'com.android.support:multidex:1.0.1'
...
}
檢視每個包函式數的工具:https://github.com/mihaip/dex-method-counts
檢視每個包的函式數,從而著手優化,哪些是廢棄程式碼可以刪掉,解決超過65535限制的問題,但如果程式碼無法再優化了,就只能採用上面的 multiDex打包了