Eclipse项目移植到AndroidStudio爬坑记

从EC移植到AS有两种方式
**
一种是:直接Eclipse中File –> Export–>Generate Gradle build files,修改一系列配置,然后在AndroidStudio中导入,再对错误进行一一修改
第二种是:在AndroidStudio中新建工程,将Eclipse中的应用目录下资源文件、代码、类库、动态加载库一一拷贝到新建的工程中,再引入依赖库,之后修改配置文件,修改编译时错误,打包时错误,运行时错误
**
这里只介绍第二种方式:
一、新建空工程,包名保持一致,例如:EC包名com.qige.www这里创建的工程包名也要如此;

二、复制包名下源代码,libs下jar包,如EC中有使用assets则新建assets并复制文件夹内容,复制res下所有文件夹

三、在src/main下新建libs(或jniLibs),将EC中libs下存放so文件的文件夹复制到src/main/libs中

四、通过import module导入依赖库,File–>New…–>Import Module…,将EC项目中的依赖库作为module依次导入

五、File–>Project Structure–>Dependencies–>+–>Module Dependency为主module引入依赖

六、修改app下build.gradle文件

apply plugin: 'com.android.application'

android {
    //这里sdk版本跟你自己可使用的版本有关,也可自行升级到最新版
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    //android6.0不支持Httpclient,项目中有用到Httpclient才添加这行代码,添加后不必再添加org.apache.http.legacy.jar
    useLibrary 'org.apache.http.legacy'
    //避免crunching failed错误,如添加后依然报此错误,请根据gradle console的log检查.9图片,AS对.9图片检查比较严格,如你的项目未出现此错误可以不加以下aaptOptions 
    aaptOptions {
        cruncherEnabled = false
        useNewCruncher = false
    }
    //避免打包时出现:“XXX”is not translated in of "af"(Afrikaans),"am"(Amharic)...如你的项目未出现此错误可以不加以下lintOptions
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
    defaultConfig {
        //包名
        applicationId "com.qige.www"
        //最低版本,跟项目要求及你代码中使用的代码有关
        minSdkVersion 16
        //是为了android6.0权限问题才设置到22,如你已在代码中动态申请,可自行设置target版本
        targetSdkVersion 22
        versionCode 66
        versionName "2.0.2"
        //如不需要multidex,可以不加下面这行代码
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {

        release {
            //这里使用你在EC上的签名文件,如果之前没有,可以在AS中生成.jks格式签名
            storeFile file('qige.keystore')
            //签名文件密码
            storePassword "qige2017"
            //签名别名
            keyAlias "qige"
            //签名密码
            keyPassword "qige2017"
        }
        debug {
            /*   storeFile file('qige.jks')
               storePassword "qige2017"
               keyAlias "qige"
               keyPassword "qige2017"*/
        }
    }
    buildTypes {
        release {
            //开启混淆,此时可先关闭,在你测试没问题,需要添加混淆时再打开
            minifyEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //是否开启debug日志
            buildConfigField "boolean", "LOG_DEBUG", "false"// 显示Log
            //指定混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // 签名配置
            signingConfig signingConfigs.release 
        }
        debug {
            minifyEnabled false
            shrinkResources false
            buildConfigField "boolean", "LOG_DEBUG", "true"
            signingConfig signingConfigs.debug
        }
    }
    sourceSets {
        main {
            //指定assets目录位置
            assets.srcDirs = ['src/main/assets']
            //指定你的动态加载库,目录如上面第三条所说
            jniLibs.srcDirs = ['src/main/libs']
        }
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    //如不需要multidex,可以不加下面这行代码
    compile 'com.android.support:multidex:1.0.1'
    //下面不需要你自己填写,会在你添加依赖库时自动添加
    compile project(':IMKit')
    compile project(':library')
    compile project(':Library_PullToRefreshSwipeMenuListView')
}

七、修改依赖的module下build.gradle文件,SDK版本与主module保持一致

```
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
}
```

八、此时配置基本完成,因为AS相比EC对代码的检查更为严格,所以代码中会有不少报红的部分,有的需要修改后才能正确运行,有些不影响运行,但是AS不建议那样写,比如我移植的项目中遇到的有:
1.setImageResource(R.drawable.loading)找不到变量R.anim.loading
解决办法:将anim中loading移到drawable中,AS中不允许anim文件夹下存放图片资源
2.setBackgroundResource(Color.parseColor(“#ffffff”))报错
解决办法:将setBackgroundResource改为setBackgroundColor,AS检查比较严格
3.部分id,color重复,style重复
解决办法:删除重复的代码,只保留一个
4.不同module中对同一jar包进行了重复引用
解决办法:删除项目中对jar包的引用,通常是v4,v7,v13包冲突
5.不同jar中包括相同的类
解决办法:只保留一个包含该类的jar
6.android6.0不支持httpClient
解决办法:可以如上面build.gradle中配置useLibrary ‘org.apache.http.legacy’,也可以在libs中引入jar包
7.代码中使用了org.apache.http.entity.ContentType
解决办法:在libs中引入导入httpcore-4.2.1.jar
8.非法字符:‘\ufeff’
解决办法:将出错的类导出修改为以UTF-8无BOM格式编码
9.com.intellij.openapi.project.IndexNotReadyException错误
解决办法:打开File–>Invalidate Cache / Restart重启后好了
10.部分第三方SDK必须升级才能使用,我移植的项目中极光推送报错
解决办法:使用AS自动导包功能升级到最新版
先删除jPush相关jar包,so包,以及清单文件中非自定义jPush相关类、jPush的AppKey,

//在build.gradle中使用自动导包,首先确保项目project下build.gradle中已加入
    buildscript {
      repositories {
         jcenter()
      }
       dependencies {
        //这个跟你自己使用的gradle版本有关,我的是2.3.3
        classpath 'com.android.tools.build:gradle:2.3.3'
        }
    }

    allprojects {
      repositories {
            jcenter()
      }
    }
    //然后在主module下build.gradle中加入:
    //defaultConfig下: 
    ndk {
        //选择要添加的对应cpu类型的.so库。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a','x86', 'x86_64', 'mips', 'mips64'
        }
    manifestPlaceholders = [
            JPUSH_PKGNAME : applicationId,
            JPUSH_APPKEY : "你自己的appkey", //JPush上注册的包名对应的appkey.
            JPUSH_CHANNEL : "自定义channel", //?户渠道统计的渠道名称
        ]
    //dependiencies下:
    compile 'cn.jiguang.sdk:jpush:3.0.6' // 此处以JPush 3.0.6 版本为例。
    compile 'cn.jiguang.sdk:jcore:1.1.3' // 此处以JCore 1.1.2 版本为例。
自动集成极光推送完成!
**这是我项目移植中遇到的部分问题,还有一些比如Toast中不能使用0,1只能用Toast.LENTH_SHORT和Toast.LENTH_LONG,但是不改的话运行也不会错,会报红,具体的项目不同遇到的问题也不一样,其他的坑就要自己填了**

九、这时候打包应该没问题了,还差的就是可能需要对代码进行混淆,在build.gradle中设置minifyEnabled true开启混淆,混淆文件可以上网搜一些基本的,再针对自己引用的各种第三方SDK增加官方要求的混淆代码,然后就是打包的时候根据错误日志,在混淆文件中增加相应的,如:-dontwarn uk.co.senab.photoview.**

十、写到这基本签名打包运行都没问题了,移植就算成功了,接着就要对各种第三方SDK进行升级,在这只写一个简单的,友盟SDK的升级到最新版6.4.4
1.替换libs下sdk,删除mta-sdk-1.6.2.jar,open_sdk_r5778_lite.jar,umeng_social_tools.jar(用来加水印),
这三个如果有就删除,如果你需要图片加水印就保留tools,
增加wechat-sdk-android-with-mta-1.1.6.jar,open_sdk_r5781.jar,
更新SicialSDK_QQ_Full.jar,SicialSDK_Sina_Full.jar,SicialSDK_WeiXin_Full.jar,
umeng_social_api.jar,umeng_social_net.jar,微博核心SDK不变weiboSDKCore_3.1.4.jar
2.更新jniLibs下关于新浪微博的so文件:libweibosdkcore.so
3.使用时注意com.tencent.mm.sdk.openapi包改为了com.tencent.mm.opensdk.openapi
4.分享的时候,

```
    UMImage image = new UMImage(act, share_image_url);
    new ShareAction(act).setPlatform(SHARE_MEDIA.WEIXIN)
                        .setCallback(umShareListener)
                        .withTitle(share_title)
                        .withTargetUrl(share_url)
                        .withText(share_content)
                        .withMedia(image).share();
```
 修改为:
```
   UMImage image = new UMImage(act, share_image_url);
   UMWeb web = new UMWeb(share_url);
   web.setTitle(share_title);
   web.setThumb(image);
   web.setDescription(share_content); 
   new ShareAction(act).setPlatform(SHARE_MEDIA.WEIXIN)
                    .setCallback(umShareListener)
                    .withMedia(web).share();
```

OK ! 还有一些SDK需要升级,就先写到这儿啦~

你可能感兴趣的:(Android)