androidx导致的一次车祸现场

看下车祸前的现场:android studio版本3.2,gradle-wrapper用的4.6,gradle插件用的3.2.0.项目targetSdkVersion设置为28,相应控件用的还是com.android.support包下的,版本为28.0.0.

某年某月某日某时,项目突然编译报错:

Android resource linking failed Output: error: resource style/CardView

查过各种资料,试过各种方法,好吧,我把targetSdkVersion设置为27,com.android.support版本改为27.0.0总该可以了吧,CardView异常是消失了,却又报了以下异常:

error: resource android:attr/dialogCornerRadius not found
error: resource android:attr/fontVariationSettings not found
error: resource android:attr/ttcIndex not found

查过各种资料,试过各种方法,总算知道Androidx和Android support库不能共存。所以,如果你现在项目的targetSdkVersion为28,com.android.support版本为28.0.0的话,在AS尚未莫名其妙的给你爆出上述两大异常之前,建议你在gradle.properties文件里加入下面两个配置:

#是否使用AndroidX库
android.useAndroidX=false
#是否迁移第三方库
android.enableJetifier=false

上述配置可以抑制你的AS暗地里背着你偷偷地去找Androidx下的相应控件及资源,当然,如果你有时间,也有想法把com.android.support包下的控件统一升级为androidx下的,只需要把上述配置改为true,再执行操作:AS菜单栏 Refactor -> Migrate to Androidx 就可以了,Android Studio 会自动把你项目中的依赖切换到 Androidx,并且修改项目中使用到依赖库的路径。

然鹅,现实总是残酷的,有时候AS并不会完全、彻底的找到所有的依赖库并切换到Androidx下,这时候只能你手动去切换了,比如以下组件、控件:

1.AppCompatActivity

android.support.v7.app.AppCompatActivity —>
androidx.appcompat.app.AppCompatActivity

2.Fragment

android.support.v4.app.Fragment ——>
androidx.fragment.app.Fragment

3.RecyclerView

android.support.v7.widget.RecyclerView ——>
androidx.recyclerview.widget.RecyclerView

4.CardView

com.android.support:CardView ——>
androidx.cardview.widget.CardView

5.ConstraintLayout

android.support.constraint.ConstraintLayout ——>
androidx.constraintlayout.widget.ConstraintLayout

6.NestedScrollView

android.support.v4.widget.NestedScrollView——>
androidx.core.widget.NestedScrollView

7.ViewPager

android.support.v4.view.ViewPager ——>
androidx.viewpager.widget.ViewPager

8.AppBarLayout

android.support.design.widget.AppBarLayout ——>
com.google.android.material.appbar.AppBarLayout

9.CoordinatorLayout

android.support.design.widget.CoordinatorLayout ——>
androidx.coordinatorlayout.widget.CoordinatorLayout

10.glide

升级后,glide可能会报下面异常(找不到):

import android.support.annotation.CheckResult;
import android.support.annotation.DrawableRes;

此时,只需要添加下面依赖即可:

annotationProcessor 'androidx.annotation:annotation:1.0.0'

当然,你也可以将glide升级到最新的版本,最新版已支持了androidx。

劫后重生感悟:

1.在你还没有弄清楚Android Studio、gradle等新版特性前,谨慎升级、谨慎升级、谨慎升级!!!

2.不管是依赖的官方的或第三方的库,版本号最好指明,不要用+号替代,避免一些你尚未知道的新特性引起车祸,二来可以提升编译、运行速度

题外话:想看你的项目和第三方依赖库都有哪些依赖,在AS的Terminal中输入如下命令:

gradlew app:dependencies

其中,gradlew后有个空格, app是你想看的module名称。

相关博文

Android-AndroidX迁移及踩坑

Androidx和Android support库共存问题解决

Android Studio:resource android:attr/dialogCornerRadius not found 出错解决方案

support v4/design/v7依赖的冲突的解决

你可能感兴趣的:(Android异常)