Android | android.support升级到androidx踩坑记录

android studio 教程 | 2019-02-14 15:42

阅读本文大概需要6分钟

年前想着Google老大之前提醒过将项目升级到androidx,所以年前一通操作猛如虎把Android Studio唰唰升级到3.2.1,自然也把gradle升级到gradle-4.10.1-all。

没想到这只是开始作死的第一步,gradle升级的痛相信升级过的人都懂。

升级完项目后,不出所料的Android Studio呈现满江红的样式,十分酸爽。在我一次次修改,不断clean又build项目,天真的以为马上可以编译通过在运行成功时,现实总是冷冷的抽打我的脸,依旧有报错,R文件都无法生成,谈何运行。

改了3天,才差不多将各种报错问题修改完成,项目成功运行。

下面记录一下修改的内容,也方便以后查阅。

升级Android Studio后,在 Refactor ---> Migrate to AndroidX 路径下可以将整个项目升级到AndroidX。

所以接下来的修改也是在自动升级后的手动修改。

文末参考文章是Google官方的说明,可以查看里面更详细的指引和说明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=trueandroid.useAndroidX=true2.app/build.gradle修改

可能没写全,Android Studio有提示,根据提示更新就行。

android{        //省略。。。。        compileOptions {            sourceCompatibility JavaVersion.VERSION_1_8            targetCompatibility JavaVersion.VERSION_1_8        } }

3.java文件修改

这里主要指import的修改,Android Studio自动帮助项目升级成androidx时,很多控件的路径在androidx中都变更了,所以需要全局搜索一键替换。

全局替换: Edit ->Find -> Replace in path

列举了一些常用的:

当整个项目因为未生成R文件满江红的时候,全局搜索替换这些常用控件会比较方便。

4.布局文件xml修改

在3.java文件修改中罗列了一些控件,同样也是全局搜索把这些对应的控件修改成androidx的就好。

列举几个:

注意!!!

不管是 java 还是 xml 也好,在 Android Studio 全局搜索的情况下还是有可能搜漏,所以可能还是需要挨个文件查看替换。

5.部分view不可用修改

之前手动拷贝了 support 包中的 TabItem ( TabLayout 需要使用的一个类)出来使用,在升级到androidx后发现无法使用了。

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)中被调用,

从 TintTypedArray 的源码可知,是在源码中做了限制的原因:

@RestrictTo(LIBRARY_GROUP)public class TintTypedArray {}6.其他问题

app module所依赖的一些library我也升级到了androidx,在将library中的build.gradle里的compile修改成implementation的时候注意,如果这里依赖的对象需要全局使用的话,就要使用api关键字了。

修改前: dependencies {    compile fileTree(dir: 'libs', include: ['*.jar']) } 修改后: dependencies {    api fileTree(dir: 'libs', include: ['*.jar']) }7.gradle命令帮助查找问题

在我一次又一次编译项目时,始终找不到是java文件或者xml文件哪里出错了,logcat、message也不报错,这种时候是最愁的。

直到我找到了大杀器:gradle命令

在terminal本项目路径下使用下面这条命令来编译项目:

./gradlew compileDebugJavaWithJavac

编译不通过就会报错,报错信息里有报错的文件以及错误的位置,这条命令帮了大忙,可以说是相当感动了,双击回车就是666。

以上就基本上写完了,如果本文有错误或不妥之处欢迎大家指正和讨论,谢谢。

参考文章

· Migrating to AndroidX

如果对你有帮助的话,好看就是对我的鼓励,也是支持我写下去的动力,谢谢!

阅读原文文章体验效果更佳。

一个贼爱折腾的码农,

有趣的人生需要大胆尝试!