在將Eclipse做的Android項目成功導入Android Studio 后,啟動生成,遇到一些問題,現總結如下:
問題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
問題原因: 圖片名稱中包含"小寫字母、數字及下划線"以外的字符,所以報錯
解決方法:重命名圖片,"小寫字母、數字及下划線"以外的字符。
重命名快捷鍵“ Shift + F6 ”,或“ 右鍵→Refactor→Rename... ”
問題2: .9圖錯誤
AndroidStudio 中,.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:
解決方法:
[2] 如果不是.9圖,則把名稱中的.9去掉,如果是.9圖,那么重新制作一下;
[3] 也可以把圖片合法性檢查關閉,在build.gradle增加如下(這個好像不起效)
android {
...
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
...
}
問題3:啟動后顯示安裝失敗信息,如下:
Installation failed with message INSTALL_FAILED_NO_MATCHING_ABIS.
It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.
WARNING: Uninstalling will remove the application data!
Do you want to uninstall the existing application?
這個問題出現在模擬器上的概率更大,原因是某些應用使用了原生庫(NDK,Native Lib),這些庫的編譯目標通常是arm架構的cpu,在x86上運行就會報這樣的錯誤。
網上解決辦法有如下兩個:
1、換一個arm架構的模擬器;
2、在 build.gradle(Moudule:app)文件中加入,如下配置:
android{
...... splits { abi { enable true reset() include 'x86', 'armeabi-v7a','x86_64' universalApk true } } }
問題4:warning: Ignoring InnerClasses attribute for an anonymous inner class
在將Eclipse做的Android項目成功導入Android Studio 后,啟動生成,報出錯如下圖,但是項目可以正常啟動運行:
原因:引入第三方組件jar包后出現該問題,不引入時正常,具體原因不詳。
方案一:
在 app 目錄下 proguard-rules.pro 文件中,加入下面的混淆配置代碼(自己測試沒有成功):
-keepattributes EnclosingMethod
方案二:參考“問題10”解決方法(修改Gradle配置文件,啟用MultiDex並包含MultiDex支持)。
方案三:由於是在加入第三方包時,一編譯就報錯。最后發現是debug證書的問題。找到 debug.keystore 目錄下看到
可以看到debug.keystore的日期是 2017-2-24,而今天是2017-5-26日,如網上所說,debug證書過期了。
因此刪掉這個文件,重新編譯運行,問題解決,而此時 該目錄又重新生成了debug.keystore,日期是今天。
如果想重現這個問題,也很簡單,必須clear工程,否則它不會再到該目錄下裝載證書,而clear后,項目會重新裝載證書,檢測證書的有效期,問題重現。
問題5:權限、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嚴格
問題6:同一項目,有多個子module時,在兩個或以上module中聲明同一個meta-data,且值不同時,報錯
報錯信息:
Error:Execution failed for task ':yzone:processDebugManifest'.
> Manifest merger failed : Attribute meta-data#RONG_CLOUD_APP_KEY@value 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}" />
問題7:最低版本號設置過低,報錯
項目中使用了個視頻播放的第三方庫,最低版本號支持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
......
}
問題8: 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
......
}
問題9: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'
......
}
問題10: 項目函數數超過65535(即 64K 限制)
報錯信息:
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
解決方法:
官方解決方案地址:配置方法數超過 64K 的應用
在 build.gradle 增加配置,如下:
(1)如果您的 minSdkVersion
設置為 21 或更高值,您只需在模塊級 build.gradle
文件中將 multiDexEnabled
設置為 true
,如下所示:
android { defaultConfig { ... minSdkVersion 21 targetSdkVersion 25 multiDexEnabled true } ... }
(2)但是,如果您的 minSdkVersion
設置為 20 或更低值,則您必須按如下方式使用 Dalvik 可執行文件分包支持庫:
[1] 修改模塊級 build.gradle
文件以啟用 Dalvik 可執行文件分包,並將 Dalvik 可執行文件分包庫添加為依賴項,如下所示:
android { defaultConfig { ... minSdkVersion 15 targetSdkVersion 25 multiDexEnabled true } ... } dependencies { compile 'com.android.support:multidex:1.0.1' }
[2] 根據是否要替換 Application
類,執行以下操作之一:
如果您沒有替換 Application
類,請編輯清單文件,按如下方式設置 <application>
標記中的 android:name
:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application android:name="android.support.multidex.MultiDexApplication" > ... </application> </manifest>
如果您替換了 Application
類,請按如下方式對其進行更改以擴展 MultiDexApplication
(如果可能):
public class MyApplication extends MultiDexApplication { ... }
或者,如果您替換了 Application
類,但無法更改基本類,則可以改為替換 attachBaseContext()
方法並調用 MultiDex.install(this)
來啟用 Dalvik 可執行文件分包:
public class MyApplication extends SomeOtherApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(context); Multidex.install(this); } }
構建應用后,Android 構建工具會根據需要構建主 DEX 文件 (classes.dex
) 和輔助 DEX 文件(classes2.dex
和 classes3.dex
等)。然后,構建系統會將所有 DEX 文件打包到您的 APK 中。
運行時,Dalvik 可執行文件分包 API 使用特殊的類加載器來搜索適用於您的方法的所有 DEX 文件(而不是僅在主 classes.dex
文件中搜索)。
查詢包函數數的工具:https://github.com/mihaip/dex-method-counts
查看每個包的函數數,從而着手優化,哪些是廢棄代碼可以刪掉,解決超過65535限制的問題,但如果代碼無法再優化了,就只能采用上面的 multiDex打包了。
問題11:Error:(1, 1) 錯誤: 非法字符: '\ufeff'
問題原因:源代碼是 GBK 格式,Android Studio Encoding 方式是 UTF-8。
Android Studio 下方修改編碼格式:GBK Convert → UTF-8 Reload(Reload AnyWay) → GBK Reload → UTF-8 Convert
問題12:文件為 UTF-8 編碼格式,中文字符顯示亂碼
問題描述:此問題出現在導入后為 UTF-8 編碼,包含中文字符且中文字符顯示為亂碼的文件。
問題原因:源代碼是 GBK 格式,Android Studio Encoding 方式是 UTF-8。