升级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对应表,这个很重要,一定要对应,不然会出现其他问题)。所以需要修改两个地方
    • porject 的build.gradle → dependencies → classpath ‘com.android.tools.build:gradle:3.6.3’
    • gradle-wrapper.properties → distributionUrl → https://services.gradle.org/distributions/gradle-5.6.4-all.zip(这个Url 要看自己项目里面是使用本地的还是官网的,官网直接使用我这种方式,本地的file 开头的,需要自己去下载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所以我直接将这个插件删掉,至于它为什么会被引用到到这里,鬼知道上一任开发脑子里再想什么。

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值