随着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
其中那个选项,顾名思义就是将原来的项目打包成一个压缩包,相当于备份,对于有版本控制的项目来说,这个都不重要,毕竟我们还可以回滚嘛。 然后继续:
要影响近两千个文件,别被吓到了,这都很正常,继续点击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.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
所以我直接将这个插件删掉,至于它为什么会被引用到到这里,鬼知道上一任开发脑子里再想什么。
好了,至此项目运行起来了,升级成功。因为大家项目里面依赖和插件都大不相同,肯定遇到的问题也不一样,欢迎大家留言交流。最后,如果这篇对你有一丁点帮助,请点个赞再走吧,谢谢了喂。