AndroidX升级踩坑

一、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"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 修改gradle.properties 点击:Refactor > Migrate to AndroidX,如下图...
    主音King阅读 7,284评论 1 3
  • (1)常用依赖库对比: Old build artifact-->AndroidX build artifact ...
    anap阅读 2,199评论 0 6
  • 东西有点多,但是资源绝对nice,自己都全部亲身体验过了,大家可放心使用 github排名: https://gi...
    Rance935阅读 11,073评论 26 312
  • Android使用底部导航 Android底部导航停留在屏幕底部,提供应用中顶级视图之间的导航。这是在具有向后兼容...
    ListenToCode阅读 2,071评论 1 15
  • 希望简书一直都在,这样当我老了,可以回头看看年轻的我在这里都记录了些什么。 隔了几天我在微信发了条动态。 秀色可餐...
    弯弯love100阅读 171评论 0 0