为什么要迁移
Google 发布 Android support library 28,同时也发布了 androidx 1.0.0 第一个正式版本,然后得知支持库的 "28.0.0" 将会是最后一次更新,之后的更新都会迁移到 Androidx ,想用新的功能就要转。官方文档:https://developer.android.google.cn/jetpack/androidx/migrate
我是逼不得已,我要用一个第三方框架,不支持非AndroidX工程!
迁移条件
AS:将AS更新至 AS 3.2及以上,当前3.6版本是最新的,建议不要用4.0的预览版,我就入坑了
版本:compileSdkVersion 版本升级到 28及以上buildToolsVersion 版本改为 28.0.2及以上
Gradle 插件版本改为 4.6及以上
如何迁移
1.找到项目根目录的gradle.properties 文件,添加如下代码:
android.useAndroidX=true
android.enableJetifier=true
第一行含义是:Android 插件会使用对应的 AndroidX 库而非支持库
第二行含义是:Android 插件会通过重写现有第三方库的二进制文件,自动将这些库迁移为使用 AndroidX
2.修改项目app目录下的build.gradle依赖库
划重点:项目如果有配置版本统一管理的地方一定要先替换,大致的依赖替换如下,可以对于替换
appCompatVersion: "com.android.support:appcompat-v7:28.0.0",
appDesignVersion: "com.android.support:design:28.0.0",
constraintLayoutVersion: "com.android.support.constraint:constraint-layout:1.1.3",
appSupportVersion: "com.android.support:support-v4:28.0.0",
recyclerViewVersion: "com.android.support:recyclerview-v7:28.0.0",
materialVersion: "com.google.android.material:material:1.0.0",
eventbusVersion: "org.greenrobot:eventbus:3.0.0",
gsonVersion: "com.google.code.gson:gson:2.8.5",
ArouterCompilerVersion:"com.alibaba:arouter-compiler:1.2.2",
zhyFlowlayoutVersion:"com.zhy:flowlayout-lib:1.0.3",
appPaletteVersion:"com.android.support:palette-v7:28.0.0",
appPreferenceVersion:"com.android.support:preference-v7:28.0.0",
autoSize:"me.jessyan:autosize:1.1.2",
cardviewVersion:"com.android.support:cardview-v7:28.0.0",
lottieVersion:"com.airbnb.android:lottie:2.7.0",
lubanVersion:"top.zibin:Luban:1.1.8",
fastjsonVersion:"com.alibaba:fastjson:1.1.70.android",
rxandroidVersion:"io.reactivex.rxjava2:rxandroid:2.0.1",
rxjavaVersion:"io.reactivex.rxjava2:rxjava:2.1.8"
替换为:
appCompatVersion: "androidx.appcompat:appcompat:1.0.0",
appDesignVersion: "com.google.android.material:material:1.0.0",
constraintLayoutVersion: "androidx.constraintlayout:constraintlayout:1.1.3",
appSupportVersion: "androidx.legacy:legacy-support-v4:1.0.0",
recyclerViewVersion: "androidx.recyclerview:recyclerview:1.0.0",
materialVersion: "com.google.android.material:material:1.0.0",
eventbusVersion: "org.greenrobot:eventbus:3.0.0",
gsonVersion: "com.google.code.gson:gson:2.8.5",
ArouterCompilerVersion:"com.alibaba:arouter-compiler:1.2.2",
zhyFlowlayoutVersion:"com.zhy:flowlayout-lib:1.0.3",
// appPaletteVersion:"com.android.support:palette-v7:28.0.0",
// appPreferenceVersion:"com.android.support:preference-v7:28.0.0",
autoSize:"me.jessyan:autosize:1.1.2",
cardviewVersion:"androidx.cardview:cardview:1.0.0",
lottieVersion:"com.airbnb.android:lottie:2.7.0",
lubanVersion:"top.zibin:Luban:1.1.8",
fastjsonVersion:"com.alibaba:fastjson:1.1.70.android",
rxandroidVersion:"io.reactivex.rxjava2:rxandroid:2.0.1",
rxjavaVersion:"io.reactivex.rxjava2:rxjava:2.1.8"
3.点击工程的:Refactor > Migrate to AndroidX 工程会自动帮你转换成AndroidX
划重点:如果对自己的电脑信心不足的一定要先重启,否则会很慢很卡,尤其是大工程
这个过程比较看自己工程和电脑有关,我自己电脑很快,2分钟左右,点击后会弹窗让你是否选择备份,完成后就开始搜索全局的要替换的,等他完成后一般会在工程的左下角显示等你确认是否refactor, 点击重构,等他完成,这期间很可能会报错
会报错使用了不同版本:
遇到这种情况一般是存在不同的版本冲突,比如我们公司的项目,是因为用了太多的第三方依赖,第三方aar有不同版本就解决:
在工程的根目录的build.gradle文件添加制定版本的脚本,报错冲突一一对应,具体用什么版本可以搜索一下关键字,最好是根项目中用的版本相同
如下,自己替换 ,完成后同步基本就会来一大堆代码报错了
project.configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'androidx.recyclerview'
&& !details.requested.name.contains('multidex') ) {
details.useVersion "1.0.0"
}else if(details.requested.group == 'androidx.media'){
details.useVersion "1.0.0"
}
}
}
4.看到报错的是代码你就先放心你成功了一半了
划重点:AS并不能全部把工程转换成功,报错信息入股要一处一处改,那就是煞笔!小工程还行,像我这种本地工程大的估计你会经历绝望,其实我之前就煞笔了,一个一个改,后面发现实在扛不住啊,在做这之前知道Cmnd+R可以替换一个文件内的,但是全局的没替换过,网上查了下,再加个shift,找到对应的 import com.xxxxxxx.xxxx 全局替换为 import com.androidx.XXXXXX
不出意外,你需要替换下面的,先复制粘贴一个,全局搜索,全局替换成右边的,爽的飞起:
import androidx.core.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.core.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import android.support.annotation.NonNull; import androidx.annotation.NonNull;
import android.support.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.widget.DrawerLayout; import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.appcompat.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.appcompat.widget.StaggeredGridLayoutManager; import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import androidx.appcompat.widget.helper.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.core.app.Fragment; import androidx.fragment.app.Fragment;
import android.support.annotation.ColorInt; import androidx.annotation.ColorInt;
import android.support.annotation.ColorRes; import androidx.annotation.ColorRes;
import android.support.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import android.support.annotation.IdRes; import androidx.annotation.IdRes;
import android.support.annotation.StringRes; import androidx.annotation.StringRes;
import android.support.v7.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import android.support.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.core.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
没完:
全局搜索下,替换下下面的,至于替换什么一般可以找一个地方导入正确的粘贴
android.support.v7
android.support.v4
仍然没完:
布局文件中存在大量的 没转换成功的,这些都需要替换
android.support.v7.widget.Toolbar
android.support.v7.widget.RecyclerView
android.support.v4.widget.SwipeRefreshLayout
androidx.constraintlayout.ConstraintLayout
import android.support.annotation.RequiresApi;
androidx.appcompat.widget.RecyclerView
再运行有什么报错继续处理,直到成功
写在最后
虽然说目前对我们没有多大影响,我们可以不使用仍然使用旧版本的支持库,毕竟没有强制,但长远来看还是有好处的。AndroidX重新设计了包结构,旨在鼓励库的小型化,支持库和架构组件包的名字也都简化了;而且也是减轻Android生态系统碎片化的有效方式