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增加如下配置

[java]  view plain  copy
  1. android {  
  2.     defaultConfig {  
  3.         ...  
  4.         //支持多个dex文件的编译  
  5.         multiDexEnabled true  
  6.         ...  
  7.     }  
  8. }  
  9.   
  10. dependencies {  
  11.     ...  
  12.     compile 'com.android.support:multidex:1.0.1'  
  13.     ...  
  14. }  

查看每个包函数数的工具:https://github.com/mihaip/dex-method-counts

查看每个包的函数数,从而着手优化,哪些是废弃代码可以删掉,解决超过65535限制的问题,但如果代码无法再优化了,就只能采用上面的 multiDex打包了