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