升級Android Studio到最新版本鞋喇,升級Gradle到最新声滥,遷移Androidx之路。

隨著Android手機(jī)的發(fā)展确徙,Android系統(tǒng)版本的不斷更新醒串,遷移Androidx成了繞不開的步驟。如果是新項目鄙皇,那
一切好說芜赌,但如果是老項目,坑死人不償命(尤其是中途接手別人的項目的開發(fā))伴逸。
我是那種被項目需求逼著升級的缠沈,升級過程花了很多心思,最后發(fā)現(xiàn)其實也并不是很難错蝴,分享一下洲愤,希望幫你躺點坑。

一顷锰、升級Android Studio(3.3.2 to 3.6.3)
  • help → check for updates

升級Android Studio不會有任何問題柬赐,如果有問題那么就去Android Studio官網(wǎng)下載,也不需要翻墻

二官紫、升級Gradle(3.4.0 to 3.6.3)
  • 升級Android Studio之后打開老項目肛宋,Studio 就會提醒你升級你的Gradle了,如圖之類的束世。
    錯誤提示

    提示說酝陈,當(dāng)前項目使用了不合適的Gradle 插件版本,請更新到3.6.3毁涉。其實更新到3.5.0以上就可以了沉帮。
    接下來就是更新gralde 版本到3.6.3。我們都知道更新gradle 和gradle.wrapper是對應(yīng)的(gradle對應(yīng)表贫堰,這個很重要穆壕,一定要對應(yīng),不然會出現(xiàn)其他問題)其屏。所以需要修改兩個地方
    • 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 要看自己項目里面是使用本地的還是官網(wǎng)的粱檀,官網(wǎng)直接使用我這種方式,本地的file 開頭的漫玄,需要自己去下載gradle版本,當(dāng)然改成都直接使用官網(wǎng)的也可以)

修改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版本汗盘,所以我們直接更新到最新的皱碘,強(qiáng)調(diào)一下,最新butterknife要求Java 8隐孽,所以還需要修改你的compileOptions到j(luò)ava 8

// Butterknife requires Java 8.
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

不會修改請查閱butterknife官方說明,然后繼續(xù)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

編譯出現(xiàn)Androidx包沖突的問題熊痴,這里有兩種選擇蚊逢,要么過濾Androidx的包,要么把包全部遷移Androidx晴及。適配Androidx是趨勢都办,所以我們肯定一往無前選擇適配Androidx。

  • Refactor → Migrate to Androidx → Migrate
    Migrate

    其中那個選項虑稼,顧名思義就是將原來的項目打包成一個壓縮包琳钉,相當(dāng)于備份,對于有版本控制的項目來說蛛倦,這個都不重要歌懒,畢竟我們還可以回滾嘛。 然后繼續(xù):
    migrate之后

    要影響近兩千個文件溯壶,別被嚇到了及皂,這都很正常,繼續(xù)點擊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;
這里有其他方法也可以解決躲庄,但這個不是每個人都會遇到的,就簡單解決钾虐。然后咱們繼續(xù)

4噪窘、資源文件編譯出錯

 AAPT: error: resource attr/tl_indicator_end_color (aka ***.***.***:attr/tl_indicator_end_color) not found.

找到對應(yīng)資源文件,加上format效扫,我的這里加上format="color",繼續(xù)

5倔监、華為基礎(chǔ)包找不到

????: ?????com.huawei.hms.activity??????
import com.huawei.hms.activity.BridgeActivity;

項目里面用了華為做離線推送,這種情況菌仁,添加華為基礎(chǔ)包的依賴就好了
implementation('com.huawei.android.hms:base:2.6.3.301')這個也是和項目有關(guān)浩习,可能大部分人不會有,接下來最難的問題來了

6济丘、Gradle版本出錯

gradle版本問題

這個錯誤很坑谱秽,不管點多少次Re-download dependencies and sync project (requires network)或者Stop Gradle build processes (requires restart)都沒有用洽蛀,甚至clean,刪除.gradle 刪除.idea 然后再 invalidate and restart都沒有用疟赊。
這個錯誤我查詢了很多資料郊供,但是都與我的實際情況不符合。他就是表示gradle版本不對應(yīng)近哟,按理說我們的3.6.3對應(yīng)4.6.4是完全沒有任何問題的驮审。沒辦法仔細(xì)分析錯誤,有一條是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吉执,然后我打開了
查看成功步驟
發(fā)現(xiàn)項目在編譯到data模塊的時候出現(xiàn)錯誤疯淫,然后去data模塊發(fā)現(xiàn)里面引用了apply plugin: 'me.tatarka.retrolambda'插件,這是啥玩意兒戳玫,我都Android 3.6+和java 8了還需要你個玩意兒熙掺,刪除相關(guān)依賴,然后編譯通過

7量九、 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/R$string; 錯誤
當(dāng)所有編譯都通過的時候适掰,美滋滋,臉都笑開了花荠列,但是一運行出現(xiàn)閃退

 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+引起的类浪,其實這樣說也不對,這個錯誤是一個檢測錯誤肌似,就是插件不兼容费就。一般是一種數(shù)據(jù)庫引起的,其他人大部分都是realm-db引起的川队,我這里是objectbox引起的力细。
解決辦法有兩種:

  • 更新插件版本到最新
  • 將gradle 降級到3.5
    我肯定選擇更新插件版本,但是我發(fā)現(xiàn)我項目里面使用的數(shù)據(jù)庫是LitePal所以我直接將這個插件刪掉固额,至于它為什么會被引用到到這里眠蚂,鬼知道上一任開發(fā)腦子里再想什么。

好了斗躏,至此項目運行起來了逝慧,升級成功。因為大家項目里面依賴和插件都大不相同啄糙,肯定遇到的問題也不一樣笛臣,歡迎大家留言交流。最后隧饼,如果這篇對你有一丁點幫助沈堡,請點個贊再走吧,謝謝了喂燕雁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诞丽,一起剝皮案震驚了整個濱河市鲸拥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌率拒,老刑警劉巖崩泡,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猬膨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)呛伴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門勃痴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人热康,你說我怎么就攤上這事沛申。” “怎么了姐军?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵铁材,是天一觀的道長。 經(jīng)常有香客問我奕锌,道長著觉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任惊暴,我火速辦了婚禮饼丘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辽话。我一直安慰自己肄鸽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布油啤。 她就那樣靜靜地躺著典徘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪益咬。 梳的紋絲不亂的頭發(fā)上逮诲,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音础废,去河邊找鬼汛骂。 笑死,一個胖子當(dāng)著我的面吹牛评腺,可吹牛的內(nèi)容都是我干的帘瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蒿讥,長吁一口氣:“原來是場噩夢啊……” “哼蝶念!你這毒婦竟也來了抛腕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤媒殉,失蹤者是張志新(化名)和其女友劉穎担敌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廷蓉,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡全封,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桃犬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刹悴。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖攒暇,靈堂內(nèi)的尸體忽然破棺而出土匀,到底是詐尸還是另有隱情,我是刑警寧澤形用,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布就轧,位于F島的核電站,受9級特大地震影響田度,放射性物質(zhì)發(fā)生泄漏妒御。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一每币、第九天 我趴在偏房一處隱蔽的房頂上張望携丁。 院中可真熱鬧,春花似錦兰怠、人聲如沸梦鉴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肥橙。三九已至,卻和暖如春秸侣,著一層夾襖步出監(jiān)牢的瞬間存筏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工味榛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留椭坚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓搏色,卻偏偏與公主長得像善茎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子频轿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355