最近用户反馈新买的华为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的权限,不然会报错
3、androidManifest.xml中provider的配置
与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的设备上被限制使用,当你使用了这些方法后,会报错:
获取方法
报错信息
还有遇到其他的坑的欢迎留言讨论!
热文推荐:
1、大厂又有新的开源项目了,赶紧来领取...
2、面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然回答不上来...
3、程序员疑似出bug被吊打!菲律宾的高薪工作机会了解一下?
4、“一键脱衣”的DeepNude下架后,我在GitHub上找到它涉及的技术
5、原生Android开发的路该怎么走
6、太厉害了,终于有人能把TCP/IP 协议讲的明明白白了
7、腾讯开源超实用的UI轮子库,我是轮子搬运工
8、腾讯新开源一吊炸天神器—零反射全动态Android插件框架正式开源
喜欢 就关注吧,欢迎投稿!