从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需要升级,就先写到这儿啦~