AndroidX适配遇到的坑(终结篇)!
最近用户反馈新买的华为mate30 Pro在安装apk的时候异常退出了,按照国际惯例赶紧查看了统计的错误信息,原来是android10在作怪!没办法适配吧,经过了一天的时间,真是受尽了折磨终于适配完了,androidx的适配的相关资料也很少,只能硬着头皮看英文文档,尝试各种方法了,下面说一下适配步骤以及我遇到的坑,大家共勉,免得走冤枉路。
一、 什么是AndroidX?
AndroidX 对原始 Android 支持库进行了重大改进。与支持库一样,AndroidX 与 Android 操作系统分开提供,并与各个 Android 版本向后兼容。AndroidX 完全取代了支持库,不仅提供同等的功能,而且提供了新的库。此外,AndroidX 还包括以下功能:
AndroidX 中的所有软件包都使用一致的命名空间,以字符串
androidx
开头。支持库软件包已映射到对应的androidx.*
软件包。有关所有旧类到新类以及旧编译工件到新编译工件的完整映射与支持库不同,AndroidX 软件包会单独维护和更新。
androidx
软件包使用严格的语义版本控制,从版本 1.0.0 开始。您可以单独更新项目中的 AndroidX 库。所有新支持库的开发工作都将在 AndroidX 库中进行。这包括维护原始支持库工件和引入新的 Jetpack 组件。
首先你的gradle版本至少为3.2.0以上,以及compileSdkVersion为28以上。
classpath 'com.android.tools.build:gradle:3.2.0+'
二、适配步骤
1、引入AndroidX
implementation 'androidx.core:core:1.1.0'
2、添加安装apk的权限,不然会报错
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
3、androidManifest.xml中provider的配置
<application
android:theme="@style/AppTheme"
android:appComponentFactory="emm"
tools:replace="android:label,android:appComponentFactory"
>
<provider android:authorities= "${applicationId}.fileprovider"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepath" />
</provider>
</application>
与9之前的对比更改的地方:
android:name="androidx.core.content.FileProvider"
4、在gradle.properties中添加如下代码
如果要在新项目中使用 AndroidX,则需要将编译 SDK 设置为 Android 9.0(API 级别 28)或更高版本,并在 gradle.properties
文件中将以下两个 Android Gradle 插件标记设置为 true
。
android.useAndroidX
:如果设置为true
,Android 插件会使用相应的 AndroidX 库,而非支持库。如果未指定,则该标记默认为false
。-
android.enableJetifier
:如果设置为true
,Android 插件会重写其二进制文件,自动迁移现有的第三方库以使用 AndroidX。如果未指定,则该标记默认为false
。 如果你是一个新项目,如果使用AndroidX相关依赖,需要在gradle.properties文件里添加配置:
android.useAndroidX=true
android.useAndroidX=true
如果不添加会出现一堆的如下的报错信息
总之就是androidx里边的类跟项目里现有的support包冲突了。
5、安装代码调整,与之前不一样的地方就是androidx.core.content.FileProvider.getUriForFile换成androidx里边的FileProvider了。
6、然后重新rebuild下,没有万事大吉,你会发现项目里原有的引用supportV4包的方法都报错了,挨个改吧,根据报错信息都改成androidx里边的引用。
如果一个一个去替换当然很麻烦了,所以在Android Studio 3.2 Canary中添加了一键迁移的功能Refactor -> Migrate to AndroidX。
7、检查你项目里有没有使用反射的方法,有的话换个写法吧(原因见三、Q 行为变更:以 Android Q 为目标平台的应用)。
8、老项目建议
除非之前的版本就大于26,否则影响获取IMEI以及后台服务和相关定位问题。
经过以上几步一般的项目基本可以编译通过,没啥问题了,有的项目引用的第三方的sdk可能还没做androidx 的适配是个比较大的坑!这时候编译就报错了,遇到那种几年都不维护的就等着坑死吧,没办法了,有办法的欢迎留言指出啊,不行就等着换sdk吧。
三、Q 行为变更:以 Android Q 为目标平台的应用
非 SDK 接口限制
非SDK接口限制在Android P中就已提出,但是在Q中,被限制的接口的分类有较大变化。
非SDK接口介绍
为了确保应用稳定性和兼容性,Android 平台开始限制您的应用可在 Android 9(API 级别 28)中使用哪些非 SDK 接口。Android Q 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。
非SDK接口限制就是某些SDK中的私用方法,如private方法,你通过Java反射等方法获取并调用了。那么这些调用将在target>=P或target>=Q的设备上被限制使用,当你使用了这些方法后,会报错:
获取方法
报错信息
还有遇到其他的坑的欢迎留言讨论!
热文推荐:
2、面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然回答不上来...
3、程序员疑似出bug被吊打!菲律宾的高薪工作机会了解一下?
4、“一键脱衣”的DeepNude下架后,我在GitHub上找到它涉及的技术
8、腾讯新开源一吊炸天神器—零反射全动态Android插件框架正式开源
喜欢 就关注吧,欢迎投稿!
上一篇: 大数据工程人员知识图谱
下一篇: 7-103 链表去重 (25分)