年前想著Google老大之前提醒過將項目升級到androidx奸腺,所以年前一通操作猛如虎把Android Studio唰唰升級到3.2.1,自然也把gradle升級到gradle-4.10.1-all。
沒想到這只是開始作死的第一步悴务,gradle升級的痛相信升級過的人都懂钞艇。
升級完項目后,不出所料的Android Studio呈現(xiàn)滿江紅的樣式窍箍,十分酸爽串纺。在我一次次修改,不斷clean又build項目椰棘,天真的以為馬上可以編譯通過在運(yùn)行成功時纺棺,現(xiàn)實總是冷冷的抽打我的臉,依舊有報錯邪狞,R文件都無法生成祷蝌,談何運(yùn)行。
改了3天帆卓,才差不多將各種報錯問題修改完成巨朦,項目成功運(yùn)行。
下面記錄一下修改的內(nèi)容剑令,也方便以后查閱糊啡。
升級Android Studio后,在 Refactor ---> Migrate to AndroidX 路徑下可以將整個項目升級到AndroidX吁津。
所以接下來的修改也是在自動升級后的手動修改棚蓄。
文末參考文章是Google官方的說明,可以查看里面更詳細(xì)的指引和說明Migrating to AndroidX。
本文目錄:
1.手動配置gradle.properties
2.app/build.gradle修改
3.java文件修改
4.布局文件xml修改
5.部分view不可用修改
6.其他問題
7.gradle命令幫助查找問題
8.參考文章
1.手動配置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)然梭依,這部分主要是因為gradle升級后提示需要的更新挣柬。
沒寫全,只寫了主要的睛挚,Android Studio有提示邪蛔,根據(jù)提示更新就行。
android{
//省略扎狱。侧到。。淤击。
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
3.java文件修改
這里主要指import的修改匠抗,Android Studio自動幫助項目升級成androidx時,很多控件的路徑在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)整個項目因為未生成R文件滿江紅的時候,全局搜索替換這些常用控件會比較方便印机。
4.布局文件xml修改
在3.java文件修改中羅列了一些控件矢腻,同樣也是全局搜索把這些對應(yīng)的控件修改成androidx的就好。
列舉幾個:
修改前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/> |
注意I淙6喔獭疤孕!
不管是java還是xml也好耕魄,在Android Studio全局搜索的情況下還是有可能搜漏圈纺,所以可能還是需要挨個文件查看替換奋刽。
5.部分view不可用修改
之前手動拷貝了support包中的TabItem(TabLayout需要使用的一個類)出來使用,在升級到androidx后發(fā)現(xiàn)無法使用了茫藏。
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()都報錯沮趣,提示TintTypedArray.getText()或TintTypedArray.getDrawable()或TintTypedArray.getResourceId()只能在同一個library group(groupId=androidx.appcompat)中被調(diào)用屯烦,
從TintTypedArray的源碼可知,是在源碼中做了限制的原因:
@RestrictTo(LIBRARY_GROUP)
public class TintTypedArray {}
6.其他問題
app module所依賴的一些library我也升級到了androidx兔毒,在將library中的build.gradle里的compile修改成implementation的時候注意漫贞,如果這里依賴的對象需要全局使用的話,就要使用api關(guān)鍵字了育叁。
比如:
修改前:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
修改后:
dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
}
7.gradle命令幫助查找問題
在我一次又一次編譯項目時,始終找不到是java文件或者xml文件哪里出錯了芍殖,logcat豪嗽、message也不報錯,這種時候是最愁的。
直到我找到了大殺器:gradle命令
在terminal本項目路徑下使用下面這條命令來編譯項目:
./gradlew compileDebugJavaWithJavac
編譯不通過就會報錯龟梦,報錯信息里有報錯的文件以及錯誤的位置隐锭,這條命令幫了大忙,可以說是相當(dāng)感動了计贰,雙擊回車就是666钦睡。
以上就基本上寫完了,如果本文有錯誤或不妥之處歡迎大家指正和討論躁倒,謝謝荞怒。
參考文章
如果對你有幫助的話,點(diǎn)贊秧秉、評論褐桌、贊賞都是對我的鼓勵,也是支持我寫下去的動力象迎,謝謝荧嵌!