年前想著Google老大之前提醒過(guò)將項(xiàng)目升級(jí)到androidx,所以年前一通操作猛如虎把Android Studio唰唰升級(jí)到3.2.1,自然也把gradle升級(jí)到gradle-4.10.1-all。
沒(méi)想到這只是開始作死的第一步,gradle升級(jí)的痛相信升級(jí)過(guò)的人都懂。
升級(jí)完項(xiàng)目后,不出所料的Android Studio呈現(xiàn)滿江紅的樣式,十分酸爽。在我一次次修改,不斷clean又build項(xiàng)目,天真的以為馬上可以編譯通過(guò)在運(yùn)行成功時(shí),現(xiàn)實(shí)總是冷冷的抽打我的臉,依舊有報(bào)錯(cuò),R文件都無(wú)法生成,談何運(yùn)行。
改了3天,才差不多將各種報(bào)錯(cuò)問(wèn)題修改完成,項(xiàng)目成功運(yùn)行。
下面記錄一下修改的內(nèi)容,也方便以后查閱。
升級(jí)Android Studio后,在 Refactor ---> Migrate to AndroidX 路徑下可以將整個(gè)項(xiàng)目升級(jí)到AndroidX。

所以接下來(lái)的修改也是在自動(dòng)升級(jí)后的手動(dòng)修改。
文末參考文章是Google官方的說(shuō)明,可以查看里面更詳細(xì)的指引和說(shuō)明Migrating to AndroidX。
本文目錄:
1.手動(dòng)配置gradle.properties
2.app/build.gradle修改
3.java文件修改
4.布局文件xml修改
5.部分view不可用修改
6.其他問(wèn)題
7.gradle命令幫助查找問(wèn)題
8.參考文章
1.手動(dòng)配置gradle.properties
android.enableJetifier=true
android.useAndroidX=true
2.app/build.gradle修改
| 修改前android.support | 修改后androidx |
|---|---|
| compile | implementation |
| testCompile | testImplementation |
| debugCompile | debugImplementation |
| releaseCompile | releaseImplementation |
當(dāng)然,這部分主要是因?yàn)間radle升級(jí)后提示需要的更新。
沒(méi)寫全,只寫了主要的,Android Studio有提示,根據(jù)提示更新就行。
android{
//省略。。。。
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
3.java文件修改
這里主要指import的修改,Android Studio自動(dòng)幫助項(xiàng)目升級(jí)成androidx時(shí),很多控件的路徑在androidx中都變更了,所以需要全局搜索一鍵替換。
全局替換: Edit ->Find -> Replace in path
列舉了一些常用的:
| 修改前android.support | 修改后androidx |
|---|---|
| import androidx.appcompat.widget.RecyclerView; | import androidx.recyclerview.widget.RecyclerView; |
| import androidx.core.view.ViewPager; | import androidx.viewpager.widget.ViewPager; |
| import androidx.core.view.PagerAdapter; | import androidx.viewpager.widget.PagerAdapter; |
| import androidx.core.app.Fragment; | import androidx.fragment.app.Fragment; |
| import androidx.core.app.FragmentManager; | import androidx.fragment.app.FragmentManager; |
| import androidx.core.app.FragmentTransaction; | import androidx.fragment.app.FragmentTransaction; |
| import androidx.core.content.LocalBroadcastManager; | import androidx.localbroadcastmanager.content.LocalBroadcastManager; |
| import androidx.appcompat.widget.DefaultItemAnimator; | import androidx.recyclerview.widget.DefaultItemAnimator; |
| import androidx.appcompat.widget.LinearLayoutManager; | import androidx.recyclerview.widget.LinearLayoutManager; |
| import androidx.appcompat.widget.GridLayoutManager; | import androidx.recyclerview.widget.GridLayoutManager; |
| import androidx.appcompat.widget.StaggeredGridLayoutManager; | import androidx.recyclerview.widget.StaggeredGridLayoutManager; |
| import android.support.design.widget.CoordinatorLayout; | import androidx.coordinatorlayout.widget.CoordinatorLayout; |
| import android.support.design.widget.CoordinatorLayout; | import androidx.coordinatorlayout.widget.CoordinatorLayout; |
| import android.support.design.widget.TabLayout; | import com.google.android.material.tabs.TabLayout; |
| import android.support.design.widget.AppBarLayout; | import com.google.android.material.appbar.AppBarLayout |
當(dāng)整個(gè)項(xiàng)目因?yàn)槲瓷蒖文件滿江紅的時(shí)候,全局搜索替換這些常用控件會(huì)比較方便。
4.布局文件xml修改
在3.java文件修改中羅列了一些控件,同樣也是全局搜索把這些對(duì)應(yīng)的控件修改成androidx的就好。
列舉幾個(gè):
| 修改前android.support | 修改后androidx |
|---|---|
| <android.support.v4.widget.NestedScrollView/> | <androidx.core.widget.NestedScrollView/> |
| <android.support.v4.widget.Space/> | <Space/> |
| <android.support.v7.widget.AppCompatTextView/> | <TextView/> |
| <androidx.appcompat.widget.CardView/> | <androidx.cardview.widget.CardView/> |
注意?。?!
不管是java還是xml也好,在Android Studio全局搜索的情況下還是有可能搜漏,所以可能還是需要挨個(gè)文件查看替換。
5.部分view不可用修改
之前手動(dòng)拷貝了support包中的TabItem(TabLayout需要使用的一個(gè)類)出來(lái)使用,在升級(jí)到androidx后發(fā)現(xiàn)無(wú)法使用了。
support中的代碼:
public TabItem(Context context, AttributeSet attrs) {
super(context, attrs);
final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
android.support.design.R.styleable.TabItem);
mText = a.getText(android.support.design.R.styleable.TabItem_android_text);
mIcon = a.getDrawable(android.support.design.R.styleable.TabItem_android_icon);
mCustomLayout = a.getResourceId(android.support.design.R.styleable.TabItem_android_layout, 0);
a.recycle();
}
a.getText()、a.getDrawable()、a.getResourceId()都報(bào)錯(cuò),提示TintTypedArray.getText()或TintTypedArray.getDrawable()或TintTypedArray.getResourceId()只能在同一個(gè)library group(groupId=androidx.appcompat)中被調(diào)用,
從TintTypedArray的源碼可知,是在源碼中做了限制的原因:
@RestrictTo(LIBRARY_GROUP)
public class TintTypedArray {}
6.其他問(wèn)題
app module所依賴的一些library我也升級(jí)到了androidx,在將library中的build.gradle里的compile修改成implementation的時(shí)候注意,如果這里依賴的對(duì)象需要全局使用的話,就要使用api關(guān)鍵字了。
比如:
修改前:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
修改后:
dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
}
7.gradle命令幫助查找問(wèn)題
在我一次又一次編譯項(xiàng)目時(shí),始終找不到是java文件或者xml文件哪里出錯(cuò)了,logcat、message也不報(bào)錯(cuò),這種時(shí)候是最愁的。
直到我找到了大殺器:gradle命令
在terminal本項(xiàng)目路徑下使用下面這條命令來(lái)編譯項(xiàng)目:
./gradlew compileDebugJavaWithJavac
編譯不通過(guò)就會(huì)報(bào)錯(cuò),報(bào)錯(cuò)信息里有報(bào)錯(cuò)的文件以及錯(cuò)誤的位置,這條命令幫了大忙,可以說(shuō)是相當(dāng)感動(dòng)了,雙擊回車就是666。
以上就基本上寫完了,如果本文有錯(cuò)誤或不妥之處歡迎大家指正和討論,謝謝。
參考文章
如果對(duì)你有幫助的話,點(diǎn)贊、評(píng)論、贊賞都是對(duì)我的鼓勵(lì),也是支持我寫下去的動(dòng)力,謝謝!