安卓項目快速遷移到AndroidX總結(jié)

為什么要遷移

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),等他完成,這期間很可能會報錯
會報錯使用了不同版本:


image.png

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


image.png

如下,自己替換 ,完成后同步基本就會來一大堆代碼報錯了

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)碎片化的有效方式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容