AndroidX升级踩坑

作者: 丶切切切切梨 | 来源:发表于2019-07-01 17:59 被阅读227次

一、AndroidX介绍

鉴于Android support包版本依赖混乱,对实际开发不是很友好,经常出现依赖包重复或者项目本身与三方库的support包版本不一致等情况,google在发布support library最后一个版本 28的同时,发布了androidx第一个版本,AndroidX是对Support的整理,解决了support包混乱不堪的状况,所以将项目迁移到androidx也是势在必行的,本文记录一下自己迁移到androidx的过程。

二、迁移准备

AndroidX的迁移要求在在AndroidStudio 3.2 或更高版本中执行,要求的targetSdkVersion版本为28(android9.0),classpath 'com.android.tools.build:gradle:3.2.0'要3.2.0或者更高。本人迁移前AS版本为3.0,最新版本为3.4。所以直接升级到最新。

三、开始迁移

1、将Android Studio 升级到3.4(3.2以上即可),并且将gradle升级到3.4.1(3.2.0以上即可),设置targetSdkVersion 28,Project的build.gradle中classpath 'com.android.tools.build:gradle:3.4.1'。

2、修改gradle.properties
android.useAndroidX=true 表示启用 androidx
android.enableJetifier=true 表示将依赖包也迁移到androidx 。如果取值为false,表示不迁移依赖包到androidx,但在使用依赖包中的内容时可能会出现问题,如果项目中没有使用任何三方依赖,可以设置为false。

使用android.enableJetifier=true将项目中使用的第三方库也迁移到 Androidx,迁移后还需要 Flie -> Invalidate Caches /Restart 一下。

android.useAndroidX=true
android.enableJetifier=true

3、在AS中执行Refactor->Migrate to AndroidX。

四、修改项目代码

执行以上操作后,以为就这么简单就迁移完成了,然鹅,事情并没有这么简单,项目里一万个报红看得头皮发麻,额。。。。慢慢改吧。。。这里列举改动及几个典型地方.

1、库依赖

三方依赖compile改为api,implementation等的改动,会报错按照提示修改即可。

2、Activity/Fragment/XML等的改动(最头大的环节)

Activity/Fragment/XML(包括涉及到使用support包的工具类等),原来引用support包中的类,在Migrate后并不能完全对应,会有很多错误(方便还是有代价的,通往幸福的路总是充满坎坷),所以需要改成对应的androidX中的类引用。
全局替换: Edit ->Find -> Replace in path

列举了一些常用的:

2.1、Activity

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

2.2、布局文件xml

<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/>

即使全局替换页可能有遗漏或者错误的情况,剩下的应该是在少数了,可以再全局Find in Path ,搜索support基本就能找出残党修改即可。

五、其他遇到的坑

1、注解处理器冲突

运行报错发现是因为项目中有用到butterknife,使用的版本没有androidX支持,去看了下Gayhub发现JK大神早就出了兼容androidX的版本了,更新到最新的10.1.0,OVER。(Dagger之类的也会出现)

2、ERROR: Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.10

这个错是kotlin版本升级的错,跟androidX没啥关系,但是发生在这里了就顺便记录下。
ERROR: Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.10
改成-> api "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

3、Android Studio3.2以上+androidX严格检查引起的问题

3.1、AndroidManifest.XML文件报错

居然是注释问题,原本上面这种ZZ注释是没问题的,升级后就炸了

3.2、同一个xml中出现控件同名

没啥说的,改个名就行。话说自己写的重名自己能认识吗(虽然自己写的代码也经常自己不认识)

3.3、去除 attr.xml 中重复的属性名称

自定义控件中属性与系统已有属性重名

<declare-styleable name="RoundImageView">
    <!-在迁移到androidx之前,这样写虽然不规范,但是能用,不报错->
    <attr name="textSize" format="Integer" />
</declare-styleable>
<declare-styleable name="RoundImageView">
    <!-迁移到androidX之后,必须使用android:xxx 属性,不能定义android已有的属性->
    <attr name="android:textSize" />
</declare-styleable>
3.4、包名不规范

包名以小写或者“_”的形式,不要用大写等。

4、Android 9.0不能访问网络,报错java.io.IOException: Cleartext HTTP traffic to **** not permitted

升级androidX需要targetSdkVersion28,即android 9.0。Google为了推进网络请求时数据的安全性,在Android 9.0系统默认都不能用http协议,而要使用https协议,提高数据传输的安全性。直接使用http协议传输数据则会报以上错误。解决方法有三种:
1、APP改用https请求
2、targetSdkVersion 降到27以下
3、(简单粗暴有效)在AndroidManifest.XML中Application节点下添加:
android:usesCleartextTraffic="true"

相关文章

网友评论

    本文标题:AndroidX升级踩坑

    本文链接:https://www.haomeiwen.com/subject/xffncctx.html