X

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的设备上被限制使用,当你使用了这些方法后,会报错:

获取方法

报错信息

还有遇到其他的坑的欢迎留言讨论!

热文推荐:

1、大厂又有新的开源项目了,赶紧来领取…

2、面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然回答不上来…

3、程序员疑似出bug被吊打!菲律宾的高薪工作机会了解一下?

4、“一键脱衣”的DeepNude下架后,我在GitHub上找到它涉及的技术

5、原生Android开发的路该怎么走

6、太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

7、腾讯开源超实用的UI轮子库,我是轮子搬运工

8、腾讯新开源一吊炸天神器—零反射全动态Android插件框架正式开源

                      喜欢 就关注吧,欢迎投稿!

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/androidx适配遇到的坑(终结篇)!/
Categories: Android
admin: