android.support升級(jí)到androidx踩坑記錄

年前想著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。

Migrate to AndroidX.png

所以接下來(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)力,謝謝!

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

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