老项目迁移AndroidStudio30带你踩完所有坑.docx
- 文档编号:7473753
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:11
- 大小:20.84KB
老项目迁移AndroidStudio30带你踩完所有坑.docx
《老项目迁移AndroidStudio30带你踩完所有坑.docx》由会员分享,可在线阅读,更多相关《老项目迁移AndroidStudio30带你踩完所有坑.docx(11页珍藏版)》请在冰豆网上搜索。
老项目迁移AndroidStudio30带你踩完所有坑
老项目迁移AndroidStudio3.0带你踩完所有坑~
AndroidStudio3.0刚刚发布两天(版本控的我~),便迫不及待的升级了,升级前也明白这次的版本跨度较大,老项目可能存在很多的问题,没成想还是从中午折腾到了晚上十点.不过结果还不错,成功的跑起来了项目.列出踩过的坑,希望后面要升级的小伙伴遇到类似的问题可以做个参考;
1.升级安装
升级方法:
1.直接用自带的更新工具
操作步骤:
>菜单栏>Help>CheckforUpdates..(前提网络要绝对的畅通,你懂的)2.手动的下载新的版本
下载地址(国内可以访问)
升级完成后,打开原有项目,在经过一段时间到indexing后
如果你的项目可以运行,OK,恭喜你,接下来的内容,你可以选择忽略,因为你的项目很nice,啥问题没有(我不相信你啥问题都没有~毕竟我踩了这么多的坑);
如果项目存在配置的问题,那么便可能产生如下问题:
2.问题
1.配置了腾讯的资源文件压缩插件导致的异常
我的项目在indexing后出现的第一个问题
CouldnotGET'http:
//oss.jfrog.org/artifactory/oss-snapshot-local/com/tencent/mm/AndResGuard-gradle-plugin/1.2.1/AndResGuard-gradle-plugin-1.2.1.pom'.Receivedstatuscode409fromserver:
ConflictEnableGradle'offlinemode'andsyncproject
12
看到这个异常我的第一反应就是项目中配置了腾讯的资源文件压缩插件,果断移除;
移除步骤:
1.在项目级别的build.gradle也就是最外层的build.gradle文件中的dependencies节点中,移除
//资源文件混淆压缩
classpath'com.tencent.mm:
AndResGuard-gradle-plugin:
1.2.1'12
2.在应用级别的build.gradle的顶部移除
applyplugin:
'AndResGuard'//资源文件混淆压缩1
3.第二条中提到build.gradle文件中相关的资源压缩配置需要一并的移除;
andResGuard{
//mappingFile=file("./resource_mapping.txt")
mappingFile=null
//当你使用v2签名的时候,7zip压缩是无法生效的。
use7zip=true
useSign=true
//打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
keepRoot=true
whiteList=[
//foryouricon
"R.drawable.icon",
//forfabric
"R.crashlytics.*",
//forumengupdate
"R.string.umeng*",
"R.string.UM*",
"R.string.tb_*",
"R.layout.umeng*",
"R.layout.tb_*",
//=========↓↓美洽↓↓=========
"R.layout.mq_*",
"R.drawable.mq_*",
"R.style.mq_*",
"R.string.mq_*",
"R.color.mq_*",
//=========↑↑美洽↑↑=========
//=========↓↓ping++↓↓=========
"R.layout.*pingpp*",
"R.drawable.pingpp*",
"R.drawable.tips_bg.9.png",
"R.style.*pingpp*",
"R.string.*pingpp*",
"R.id.pingpp*",
"R.color.*pingpp*",
//=========↑↑ping++↑↑=========
"R.drawable.umeng*",
"R.drawable.tb_*",
"R.anim.umeng*",
"R.color.umeng*",
"R.color.tb_*",
"R.style.*UM*",
"R.style.umeng*",
"R.id.umeng*",
//umengshareforsina
"R.drawable.sina*",
//forgoogle-services.json
"R.string.google_app_id",
"R.string.gcm_defaultSenderId",
"R.string.default_web_client_id",
"R.string.ga_trackingId",
"R.string.firebase_database_url",
"R.string.google_api_key",
"R.string.google_crash_reporting_api_key",
//umengshareforfacebook
"R.layout.*facebook*",
"R.id.*facebook*",
//umengshareformessager
"R.layout.*messager*",
"R.id.*messager*",
//umengsharecommond
"R.id.progress_bar_parent",
"R.id.webView"
]
compressFilePattern=[
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
"resources.arsc"
]
sevenzip{
artifact='com.tencent.mm:
SevenZip:
1.2.1'
//path="/usr/local/bin/7za"
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
上述操作完后,同步代码,该问题KO;
2.一直卡在Refreshing项目
第一条中的问题解决后,我出现了
这种提示,在正常的流程中,如果不出现第一个问题,会首先出现这个提示,意思是升级现在项目的编译插件,相信之前升级过AS版本的同学在第一次运行新版本的时候见过这个提示,直接点击update按钮就行了.如果不想接着踩坑那么点击Dont’treminmdmeagaingforthisproject按钮就可以了,它代表你还是用之前版本的插件来运行当前项目,也就不会出现后面一大串的问题;
这里直接点击update按钮;
点击之后如果你网络不畅通的话就会一直的
之所以会这样,是因为
点击该按钮后实际上做了两件事情
在主项目的build.gradle文件中的dependencies节点中更改了
//原先的插件版本
classpath'com.android.tools.build:
gradle:
2.3.3'
//更改后的插件版本
classpath'com.android.tools.build:
gradle:
3.0.0'1234在项目目录中的gradle>gradle-wrapper.properties文件中的distributionUrl字段更改了
//原先的插件版本
distributionUrl=https:
//services.gradle.org/distributions/gradle-3.3-all.zip
//更改后的插件版本
distributionUrl=https:
//services.gradle.org/distributions/gradle-4.1-all.zip1234
这两个文件修改后AS就会去下载https:
//services.gradle.org/distributions/gradle-4.1-all.zip这个文件,不用点什么奇技淫巧,就等AS下载完吧(基本完不了)
这里给出两种解决方案:
两种解决方案的前提条件是先把该文件下载下来,AS下载的奇慢,那么把https:
//services.gradle.org/distributions/gradle-4.1-all.zip扔到迅雷中,分分钟下载完成(迅雷功能不止于此~);
把文件放到本地的Tomcat服务器,或者IIS服务器中,或者免费的七牛云服务中,获取这个文件的下载地址,修改gradle-wrapper.properties文件中distributionUrl的值为你的下载地址,关闭AS,重新打开(亲测可行);找到.gradle文件夹路径:
windows一般在C:
\Users\.gradle,
mac是在:
用户/(当前用户目录)/.gradle,解压下载好的文件到该目录中,关闭AS,重新打开(未亲测);
3.修改输出apk的文件名导致的异常
第二条问题解决后,出现了Cannotsetthevalueofread-onlyproperty'outputFile'forApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN,fullName=tiger8shopDebug,filters=[]}}oftypecom.android.build.gradle.internal.api.ApkVariantOutputImpl.OpenFile1
点击OpenFile定位到应用级别的build.gradle文件中的这个位置
staticdefreleaseTime(){
returnnewDate().format("yyyy-MM-dd-HH-mm",TimeZone.getDefault())//包含时分秒
}
staticdefdebugTime(){
//returnnewDate().format("yyyy-MM-dd",TimeZone.getDefault())
returnnewDate().format("yyyy",TimeZone.getDefault())
}
//=============================上面的代码定义在android节点外,AS3.0版本如果需要输出apk文件名带上时间,上面代码你可以参考下===================================
//文件输出名增加版本号和时间
applicationVariants.all{variant->
variant.outputs.each{output->
defoutputFile=output.outputFile
if(outputFile!
=null&&outputFile.name.endsWith('.apk')){
deffileName
if(outputFile.name.contains("debug")){//debug版本,使用自己的文件名,方便记忆
fileName="$applicationId_v${defaultConfig.versionName}_${debugTime()}_code${defaultConfig.versionCode}_debug.apk"
output.outputFile=newFile(outputFile.parent,fileName)//OpenFile后定位到这个位置,这个配置,识别不出outputFile是啥了
}else{
fileName="$applicationId_v${defaultConfig.versionName}_code${defaultConfig.versionCode}_${releaseTime()}_${variant.productFlavors[0].name}_release.apk"
output.outputFile=newFile(outputFile.parent,fileName)
}
}
}
}123456789101112131415161718192021222324252627
这个是自己之前配置的可以控制AS输出的apk文件的名称,新版本不能这样配置了,看官方的引导可以改成
//AS3.0版本
android.applicationVariants.all{variant->
variant.outputs.all{
if(variant.name.endsWith("Debug")){
//debug包
outputFileName="$applicationId_v${defaultConfig.versionName}_${debugTime()}_code${defaultConfig.versionCode}_debug.apk"
}else{
//release包
outputFileName="$applicationId_v${defaultConfig.versionName}_code${defaultConfig.versionCode}_${releaseTime()}_release.apk"
}
}
}123456789101112
效果和之前差不多,直接更改,问题KO
4.之前项目中配置了第三方APT插件导致的异常
如上图这个异常是我折腾最长时间的问题,各种XX,Google最终得知和新版本AS3.0中自带了APT处理插件有关,因为自己之前配置的第三方的APT插件,所有它们冲突了~,那么移除则异常KO;
移除步骤
1.在项目级别的build.gradle也就是最外层的build.gradle文件中的dependencies节点中,移除
classpath'com.neenbedankt.gradle.plugins:
android-apt:
1.8'1
2.在应用级别的build.gradle的顶部移除
applyplugin:
'android-apt'1
3.在应用级别的build.gradle的dependencies节点中,替换所有用apt开头的引依赖为annotationProcessor例如
//替换之前
apt"com.jakewharton:
butterknife-compiler:
$rootProject.ext.globalButterKnifeAptVersion"
//替换之后
annotationProcessor"com.jakewharton:
butterknife-compiler:
$rootProject.ext.globalButterKnifeAptVersion"1234
上面三步操作完成后,同步项目,问题解决
5.BuildTool最低版本异常这个异常出现就显而易见了,AS3.0最低支持的BuildTools插件是26.0.2版本,别问我BuildTools是啥,我也不知道(顾名思义,AS的编译工具);BuildTools的版本改到26.0.2版本,同步代码就好了,如果你的SDK中没有下载BuildTools26.0.2版本,AS会自动的提示你去下载,下载完同步代码,即可;
6.BuildTool库项目版本不统一问题
AS3.0对于库项目的build.gradle的配置也进行了干预,官方说可以加快编译速度,想想也是,库项目都用不同版本的BuildTool,编译起来肯定慢;所以这里点击OpenFile之后,定位到的build.gradle文件,修改里面的buildToolsVersion节点为26.0.2即可
如果项目中的库项目较多,建议将buildToolsVersion版本配置到gradle.properties文件中,然后项目中的库项目都引用该配置,改一处,则整个项目的buildToolsVersion配置都改了,别问我咋配置的,因为这会跑题,自行XX
7.multidex版本异常
这个问题说的是AS3.0解析multidex1.0.2版本失败,为什么失败?
因为现在google自家的依赖,全部都收回到了自家的CDN服务器了,之前在项目级的build.gradle文件中的repositories节点中配置jenter(),就可以获取大部分的依赖(虽然慢了点),但是现在Google官方需要我们在repositories节点中配置上google(),作用就是获取自家的依赖,而原先的jcenter()不需要动;而multidex是Google的依赖所以只用之前的jcenter(),肯定是解析不到它了.
配置例如
repositories{
google()//新增的
jcenter()
}1234
项目级的build.gradle文件中的有两个repositories节点,都配置上google()
同步项目,问题KO
8.Lambda插件冲突
Warning:
OneofthepluginsyouareusingsupportsJava8languagefeatures.TotrythesupportbuiltintotheAndroidplugin,removethefollowingfromyourbuild.gradle:
applyplugin:
'me.tatarka.retrolambda'
Tolearnmore,goto
这个不用多说相信大家在准备升级AS3.0都知道,它的一大特性是支持了JAVA8,而项目之前为了能用Lambda,而用了第三方的插件,这里移除即可;
移除步骤
1.在项目级别的build.gradle也就是最外层的build.gradle文件中的dependencies节点中,移除
classpath'me.tatarka:
gradle-retrolambda:
3.2.0'//lambda表达式1
2.在应用级别的build.gradle的顶部移除
applyplugin:
'me.tatarka.retrolambda'//lambda表达式1
上面两步操作完成后,同步项目,问题解决
9.flavor配置异常Error:
Allflavorsmustnowbelongtoanamedflavordimension.Learnmoreat
这个可以参考官方给出的文档地址(网络要绝对的通畅~)
问题出现在之前的flavor配置不能用了,别问我flavor是啥,你自己配置的你不知道~(主要作用,多渠道打包)
//之前的配置
productFlavors{
_360{}
baidu{}
xiaomi{}
meizu{}
tencent{}
}
productFlavors.all{flavor->
flavor.manifestPlaceholders=[CLICK_CHANNEL_VALUE:
name]
}
//==============================分割线===================================
//改成如下配置,问题解决
flavorDimensions"tier"//新增的,值是数组
productFlavors{
_360{dimension"tier"}
baidu{dimension"tier"}
xiaomi{dimension"tier"}
meizu{dimension"tier"}
tencent{dimension"tier"}
}
productFlavors.all{flavor->
flavor.manifestPlaceholders=[CLICK_CHANNEL_VALUE:
name]
}12345678910111213141516171819202122232425
想知道为什么这样配置,可以看看官方文档
至此上述配置更改后,我的项目同步代码不报错了~,但是坑远远没有填完,继续
10.AAPT2编译异常
这一大串的异常在编译的时候报出,我在第一次导入项目的时候遇到了,第二次导入其它项目的时候,竟然没有遇到,对比之下得出问题是出在配置了高版本的support包的问题
当你把项目所有support包的版本配置到25.2.0的时候什么问题都没有,但是配置成26.0.0或者27.0.0版本的时候就会出现这个问题(亲测);
解决方案
1.使用低版本的support包,把项目所有support包的版本配置到25.2.0或者其它较低的版本
2.配置gradle.properties中关闭AAPT2编译,说人话就是在其中增加android.enableAapt2=false配置,再次编译问题解决(推荐),例如
android.enableAapt2=false1
同步代码,问题KO;
11.方法找不到异常/或者有点莫名其妙的异常这两个异常产生的的原因是因为第九条如果你升级了support包的版本的时候compileSdkVersion的版本没有更改,亲测如果你的support包更改到了26.0.0或以上的话,需要更改项目中所有的compileSdkVersion为26或以上
compileSdkVersion=261
更改好,同步代码,问题解决
到这我的项目可以运行,可以调试了,以为终于KO了所有问题了,但是但是编译输入release包的时候内存溢出了,WTF
12.生成release包异常
看到这个异常我是一脸的蒙蔽,各种XX,google都没有说这个问题,咋滴,不让用啦,手动打包啊~,但是到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 项目 迁移 AndroidStudio30 所有
![提示](https://static.bdocx.com/images/bang_tan.gif)