首先声明,老项目升级androidx存在一定的风险和不确定性,即使调整后也需要相当长的一段时间进行测试,所以在自己的项目中本次只是简单的验证了一下可行性。
关于Androidx
- Androidx其实就是将Android Support Library中的代码改包名移到了androidx,为了解决support-v4、v7包依赖的混乱问题。
- 关于什么是Androidx可以看下郭神的这篇博客
- 谷歌官方文档提供了support包与Androidx库的对应关系等,这是传送门
迁移的前提
- compileSdkVersion改为28(因为AnroidX 1.0.0版本是与Support Library 28.0.0一致的二进制文件,support最新的是28,所以可以直接迁移)
- buildToolsVersion改为28.0.2以上(笔者使用的是 28.0.3 ,仅供参考)
- gradle插件版本4.6及以上(gradle-wrapper.properties中修改distributionUrl)
- Android Studio版本升级到3.2及以上,建议直接改为最新(笔者目前使用的是Android 4.0,可以通过Help -> About 查看当前AS版本)。其实gradle为4.6对应的AS版本就是3.2.0-3.2.1,因此只要AS版本大于3.2,gradle就相应的大于4.6
迁移总结
-
Android Studio菜单:
Refactor > Migrate to AndroidX
,一路点确定即可,然后运行项目,如果报错就对了。 -
迁移完后
gradle.properties
文件会多出这两句:-
android.useAndroidX=true
,这个不解释 -
android.enableJetifier=true
,这个的官方解释是:Android 插件会通过重写其二进制文件来自动迁移现有的第三方库以使用 AndroidX。意思是如果你的第三方库依赖了support包且其没有升级到Androidx,没关系,AndroidStudio在打包的时候会把这些support包都改为Androidx包。 所以这个值设为ture后那些依赖了support包的第三方依赖可以不用改。但是,那些通过注解等方式在build目录中生成的代码如果依赖support包的话就不行了。那么哪些第三方依赖会有这种问题呢?
-
-
有问题的第三方依赖:
- butterknife
- glide
- deeplinkdispatch,这个依赖主要是用于外部链接跳转指定页面
-
解决方法也很简单,将它们升级到新版本
-
butterknife
插件版本:
classpath 'com.jakewharton:butterknife-gradle-plugin:10.0.0'
依赖版本:
api "com.jakewharton:butterknife:10.0.0" annotationProcessor "com.jakewharton:butterknife-compiler:10.0.0"
-
glide,依赖版本:
api "com.github.bumptech.glide:glide:4.10.0" annotationProcessor "com.github.bumptech.glide:compiler:4.10.0" api "com.github.bumptech.glide:okhttp3-integration:4.10.0"
-
deeplinkdispatch, 依赖版本:
api "com.airbnb:deeplinkdispatch:4.1.0" annotationProcessor "com.airbnb:deeplinkdispatch-processor:4.1.0"
以上升级的版本有些不是最新版,因为最新版可能对gradle插件版本有要求。目前我的gradle版本是
gradle-4.6-all.zip
,插件版本是'com.android.tools.build:gradle:3.2.1'
-
-
改到这里应该就可以运行的,但是还是出现
dontwarn
报错,发现是混淆的问题,这种情况可能是升级的第三方依赖混淆有改动,看官方文档即可。 -
最重要的:全局搜索
support
、v4
、v7
、design
、app:layout_behavior
等,确保都改了。尤其是用到CoordinatorLayout
的地方,他的app:layout_behavior
属性值引用的可能还是support包的。 -
最后,附上我的项目中不需要改动的第三方依赖不完全名单:
项目 | Value |
---|---|
gson | ‘com.google.code.gson:gson:2.7’ |
greendao | ‘org.greenrobot:greendao:3.2.0’ |
joda-time | ‘joda-time:joda-time:2.9.7’ |
SmartRefreshLayout | ‘com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-5’ |
leakcanary-android | ‘com.squareup.leakcanary:leakcanary-android:1.6.3’ |
leakcanary-android-no-op | ‘com.squareup.leakcanary:leakcanary-android-no-op:1.6.3’ |
blockcanary-android | ‘com.github.markzhai:blockcanary-android:1.5.0’ |
blockcanary-no-op | ‘com.github.markzhai:blockcanary-no-op:1.5.0’ |
bugly | ‘com.tencent.bugly:crashreport:latest.release’ |
bugly | ‘com.tencent.bugly:nativecrashreport:latest.release’ |
wechat-sdk-android-without-mta | ‘com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+’ |
tencent tbssdk | ‘com.tencent.tbs.tbssdk:sdk:43697’ |
高德map2d | ‘com.amap.api:map2d:latest.integration’ |
高德地图搜索 | ‘com.amap.api:search:latest.integration’ |
zxing-library | ‘cn.yipianfengye.android:zxing-library:2.1’ |
rxjava | ‘io.reactivex.rxjava2:rxjava:2.2.1’ |
rxandroid | ‘io.reactivex.rxjava2:rxandroid:2.1.0’ |
arouter-api | ‘com.alibaba:arouter-api:1.4.1’ |
arouter-compiler | ‘com.alibaba:arouter-compiler:1.2.2’ |
glide-transformations | ‘jp.wasabeef:glide-transformations:4.1.0’ |
flexbox | ‘com.google.android:flexbox:1.0.0’ |
walle | ‘com.meituan.android.walle:library:1.1.6’ |
multitype | ‘me.drakeet.multitype:multitype:3.4.4’ |
oneapm | ‘com.oneapm.agent.android:agent:5.5.4.0’ |