為什么要遷移
Google 發(fā)布 Android support library 28,同時也發(fā)布了 androidx 1.0.0 第一個正式版本,然后得知支持庫的 "28.0.0" 將會是最后一次更新,之后的更新都會遷移到 Androidx ,想用新的功能就要轉(zhuǎn)。官方文檔:https://developer.android.google.cn/jetpack/androidx/migrate
我是逼不得已,我要用一個第三方框架,不支持非AndroidX工程!
遷移條件
AS:將AS更新至 AS 3.2及以上,當(dāng)前3.6版本是最新的,建議不要用4.0的預(yù)覽版,我就入坑了
版本:compileSdkVersion 版本升級到 28及以上buildToolsVersion 版本改為 28.0.2及以上
Gradle 插件版本改為 4.6及以上
如何遷移
1.找到項目根目錄的gradle.properties 文件,添加如下代碼:
android.useAndroidX=true
android.enableJetifier=true
第一行含義是:Android 插件會使用對應(yīng)的 AndroidX 庫而非支持庫
第二行含義是:Android 插件會通過重寫現(xiàn)有第三方庫的二進(jìn)制文件,自動將這些庫遷移為使用 AndroidX
2.修改項目app目錄下的build.gradle依賴庫
劃重點:項目如果有配置版本統(tǒng)一管理的地方一定要先替換,大致的依賴替換如下,可以對于替換
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 工程會自動幫你轉(zhuǎn)換成AndroidX
劃重點:如果對自己的電腦信心不足的一定要先重啟,否則會很慢很卡,尤其是大工程
這個過程比較看自己工程和電腦有關(guān),我自己電腦很快,2分鐘左右,點擊后會彈窗讓你是否選擇備份,完成后就開始搜索全局的要替換的,等他完成后一般會在工程的左下角顯示等你確認(rèn)是否refactor, 點擊重構(gòu),等他完成,這期間很可能會報錯
會報錯使用了不同版本:

遇到這種情況一般是存在不同的版本沖突,比如我們公司的項目,是因為用了太多的第三方依賴,第三方aar有不同版本就解決:
在工程的根目錄的build.gradle文件添加制定版本的腳本,報錯沖突一一對應(yīng),具體用什么版本可以搜索一下關(guān)鍵字,最好是根項目中用的版本相同

如下,自己替換 ,完成后同步基本就會來一大堆代碼報錯了
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并不能全部把工程轉(zhuǎn)換成功,報錯信息入股要一處一處改,那就是煞筆!小工程還行,像我這種本地工程大的估計你會經(jīng)歷絕望,其實我之前就煞筆了,一個一個改,后面發(fā)現(xiàn)實在扛不住啊,在做這之前知道Cmnd+R可以替換一個文件內(nèi)的,但是全局的沒替換過,網(wǎng)上查了下,再加個shift,找到對應(yīng)的 import com.xxxxxxx.xxxx 全局替換為 import com.androidx.XXXXXX
不出意外,你需要替換下面的,先復(fù)制粘貼一個,全局搜索,全局替換成右邊的,爽的飛起:
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;
沒完:
全局搜索下,替換下下面的,至于替換什么一般可以找一個地方導(dǎo)入正確的粘貼
android.support.v7
android.support.v4
仍然沒完:
布局文件中存在大量的 沒轉(zhuǎn)換成功的,這些都需要替換
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
再運行有什么報錯繼續(xù)處理,直到成功
寫在最后
雖然說目前對我們沒有多大影響,我們可以不使用仍然使用舊版本的支持庫,畢竟沒有強制,但長遠(yuǎn)來看還是有好處的。AndroidX重新設(shè)計了包結(jié)構(gòu),旨在鼓勵庫的小型化,支持庫和架構(gòu)組件包的名字也都簡化了;而且也是減輕Android生態(tài)系統(tǒng)碎片化的有效方式