随着时间的推移,技术的推进,开发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#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
解决方法:
(1)在其中一个module钟删除,保留正确的那个;
(2)或者在主module中的meta-data中,加上 'tools:replace="android:value",如下:
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'
...
}
查看每个包的函数数,从而着手优化,哪些是废弃代码可以删掉,解决超过65535限制的问题,但如果代码无法再优化了,就只能采用上面的 multiDex打包了