600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 升级Android Studio到最新版本 升级Gradle到最新 迁移Androidx之路。

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

时间:2021-05-10 03:57:00

相关推荐

升级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 → /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.1Update pluginsAffected Modules: data

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

// Butterknife requires Java pileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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.0Affected Modules: presentation

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

Refactor → Migrate to Androidx → 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版本出错

这个错误很坑,不管点多少次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.mon.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:)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.mon.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.mon.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:)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所以我直接将这个插件删掉,至于它为什么会被引用到到这里,鬼知道上一任开发脑子里再想什么。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。