升级Android Studio到最新版本,升级Gradle到最新,迁移Androidx之路。

随着Android手机的发展,Android系统版本的不断更新,迁移Androidx成了绕不开的步骤。如果是新项目,那
一切好说,但如果是老项目,坑死人不偿命(尤其是中途接手别人的项目的开发)。
我是那种被项目需求逼着升级的,升级过程花了很多心思,最后发现其实也并不是很难,分享一下,希望帮你躺点坑。

一、升级Android Studio(3.3.2 to 3.6.3)
  • help → check for updates

升级Android Studio不会有任何问题,如果有问题那么就去Android Studio官网下载,也不需要翻墙

二、升级Gradle(3.4.0 to 3.6.3)
  • 升级Android Studio之后打开老项目,Studio 就会提醒你升级你的Gradle了,如图之类的。
    错误提示

    提示说,当前项目使用了不合适的Gradle 插件版本,请更新到3.6.3。其实更新到3.5.0以上就可以了。
    接下来就是更新gralde 版本到3.6.3。我们都知道更新gradle 和gradle.wrapper是对应的(gradle对应表,这个很重要,一定要对应,不然会出现其他问题)。所以需要修改两个地方

修改gradle 版本编译之后一般会报错,这个时候有啥错就处理啥错就ok,比如我的

1、 butterKnife插件报错

ERROR: The Android Gradle plugin supports only Butterknife Gradle plugin version 9.0.0-rc2 and higher.
The following dependencies do not satisfy the required version:
root project 'DreambigCareer' -> com.jakewharton:butterknife-gradle-plugin:8.8.1
Update plugins
Affected Modules: data

Studio提示让我更新到9.0.0-rc2以上的版本,我查了最新butterknife版本是10.2.1版本,所以我们直接更新到最新的,强调一下,最新butterknife要求Java 8,所以还需要修改你的compileOptions到java 8

// Butterknife requires Java 8.
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

不会修改请查阅butterknife官方说明,然后继续sync

2、Androidx包冲突

ERROR: This project uses AndroidX dependencies, but the 'android.useAndroidX' property is not enabled. Set this property to true in the gradle.properties file and retry.
The following AndroidX dependencies are detected: androidx.collection:collection:1.0.0, androidx.versionedparcelable:versionedparcelable:1.0.0, androidx.core:core:1.0.0, androidx.lifecycle:lifecycle-common:2.0.0, androidx.arch.core:core-common:2.0.0, androidx.lifecycle:lifecycle-runtime:2.0.0, androidx.annotation:annotation:1.0.0
Affected Modules: presentation

编译出现Androidx包冲突的问题,这里有两种选择,要么过滤Androidx的包,要么把包全部迁移Androidx。适配Androidx是趋势,所以我们肯定一往无前选择适配Androidx。

  • Refactor → Migrate to Androidx → Migrate
    Migrate

    其中那个选项,顾名思义就是将原来的项目打包成一个压缩包,相当于备份,对于有版本控制的项目来说,这个都不重要,毕竟我们还可以回滚嘛。 然后继续:
    migrate之后

    要影响近两千个文件,别被吓到了,这都很正常,继续点击Do Refactor

3、org.jetbrains.annotations.NotNull;找不到

D:\AndroidProject\***********.java:5: ����: �����org.jetbrains.annotations������
import org.jetbrains.annotations.NotNull;

删除import org.jetbrains.annotations.NotNull;使用import androidx.annotation.NonNull;
这里有其他方法也可以解决,但这个不是每个人都会遇到的,就简单解决。然后咱们继续

4、资源文件编译出错

 AAPT: error: resource attr/tl_indicator_end_color (aka ***.***.***:attr/tl_indicator_end_color) not found.

找到对应资源文件,加上format,我的这里加上format="color",继续

5、华为基础包找不到

����: �����com.huawei.hms.activity������
import com.huawei.hms.activity.BridgeActivity;

项目里面用了华为做离线推送,这种情况,添加华为基础包的依赖就好了
implementation('com.huawei.android.hms:base:2.6.3.301')这个也是和项目有关,可能大部分人不会有,接下来最难的问题来了

6、Gradle版本出错

gradle版本问题

这个错误很坑,不管点多少次Re-download dependencies and sync project (requires network)或者Stop Gradle build processes (requires restart)都没有用,甚至clean,删除.gradle 删除.idea 然后再 invalidate and restart都没有用。
这个错误我查询了很多资料,但是都与我的实际情况不符合。他就是表示gradle版本不对应,按理说我们的3.6.3对应4.6.4是完全没有任何问题的。没办法仔细分析错误,有一条是Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.就是说你的项目使用的三方插件可能依赖了其他版本gradle,然后我打开了
查看成功步骤
发现项目在编译到data模块的时候出现错误,然后去data模块发现里面引用了apply plugin: 'me.tatarka.retrolambda'插件,这是啥玩意儿,我都Android 3.6+和java 8了还需要你个玩意儿,删除相关依赖,然后编译通过

7、 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/R$string; 错误
当所有编译都通过的时候,美滋滋,脸都笑开了花,但是一运行出现闪退

 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/R$string;
        at com.google.android.gms.common.internal.StringResourceValueReader.<init>(Unknown Source:12)
        at com.google.firebase.FirebaseOptions.fromResource(SourceFile:131)
        at com.google.firebase.FirebaseApp.initializeApp(SourceFile:277)
        at com.google.firebase.provider.FirebaseInitProvider.onCreate(SourceFile:37)
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1949)
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1923)
        at com.google.firebase.provider.FirebaseInitProvider.attachInfo(SourceFile:31)
        at android.app.ActivityThread.installProvider(ActivityThread.java:7273)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:6813)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6699)
        at android.app.ActivityThread.access$2000(ActivityThread.java:273)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2020)
        at android.os.Handler.dispatchMessage(Handler.java:112)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.R$string" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/***.***.***-p1Zp4cimg2rfhny7C1iZvg==/base.apk"],nativeLibraryDirectories=[/data/app//***.***.***-p1Zp4cimg2rfhny7C1iZvg==/lib/arm, /data/app//***.***.***-p1Zp4cimg2rfhny7C1iZvg==/base.apk!/lib/armeabi-v7a, /system/lib, /product/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.google.android.gms.common.internal.StringResourceValueReader.<init>(Unknown Source:12) 
        at com.google.firebase.FirebaseOptions.fromResource(SourceFile:131) 
        at com.google.firebase.FirebaseApp.initializeApp(SourceFile:277) 
        at com.google.firebase.provider.FirebaseInitProvider.onCreate(SourceFile:37) 
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1949) 
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1923) 
        at com.google.firebase.provider.FirebaseInitProvider.attachInfo(SourceFile:31) 
        at android.app.ActivityThread.installProvider(ActivityThread.java:7273) 
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:6813) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6699) 
        at android.app.ActivityThread.access$2000(ActivityThread.java:273) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2020) 
        at android.os.Handler.dispatchMessage(Handler.java:112) 
        at android.os.Looper.loop(Looper.java:216) 
        at android.app.ActivityThread.main(ActivityThread.java:7625) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987) 

这儿错误是升级gradle3.6+引起的,其实这样说也不对,这个错误是一个检测错误,就是插件不兼容。一般是一种数据库引起的,其他人大部分都是realm-db引起的,我这里是objectbox引起的。
解决办法有两种:

  • 更新插件版本到最新
  • 将gradle 降级到3.5
    我肯定选择更新插件版本,但是我发现我项目里面使用的数据库是LitePal所以我直接将这个插件删掉,至于它为什么会被引用到到这里,鬼知道上一任开发脑子里再想什么。

好了,至此项目运行起来了,升级成功。因为大家项目里面依赖和插件都大不相同,肯定遇到的问题也不一样,欢迎大家留言交流。最后,如果这篇对你有一丁点帮助,请点个赞再走吧,谢谢了喂。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345