隨著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版本出錯
這個錯誤很坑谱秽,不管點多少次
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吉执,然后我打開了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ā)腦子里再想什么。
好了斗躏,至此項目運行起來了逝慧,升級成功。因為大家項目里面依賴和插件都大不相同啄糙,肯定遇到的問題也不一樣笛臣,歡迎大家留言交流。最后隧饼,如果這篇對你有一丁點幫助沈堡,請點個贊再走吧,謝謝了喂燕雁。