
Android 12 适配升级小结 原创
春节不停更,此文正在参加「星光计划-春节更帖活动」
Android 12 发布已经有 4 个月了,而且随着各大市场对应用适配的要求逐渐提高,小菜也尝试将一个历史的应用简单升级适配 Android 12;
Android 12
Android 12 对应 Build.VERSION_CODES.S,使用 Material You 打造的全新系统界面,富有表现力、活力和个性。使用重新设计的微件、AppSearch、游戏模式和新的编解码器扩展您的应用。支持隐私信息中心和大致位置等新的保护功能。使用富媒体内容插入功能、更简便的模糊处理功能、经过改进的原生调试功能等提高工作效率。
Android 12 相对我们的历史项目来说属于较大版本的更新,在适配过程中遇到一系列问题,小菜简单记录整理一下。
SDK 版本号升级
小菜首先对 SDK 版本号进行升级,之后对升级后的应用逐步进行适配更新;
当前版本
升级后版本
Q1: Gradle 不匹配
升级 SDK 后 sync 后遇到第一个 Gradle 不匹配问题;
A1: 升级 Android 12 对应 Gradle 版本
历史版本 Gradle 对应版本是 3.3.3,升级到最新的 7.0.4;
Q2: distributionUrl 不匹配
A2: 升级 Android 12 对应 distributionUrl Gradle 版本
小菜将本地 gradle-wrapper.properties 中升级到与 classpath 一致的 7.0.2-all 即可;
Q3: Marven 仓库不支持 Http
小菜历史项目中引入了很多公司内部仓库和部分非 Https 的线上库,在 Gradle 升级后,Marven 仓库建议使用 Https 安全的仓库;
A3: 升级 Https 线上库或解决安全警告
对于部分线上 Marven 仓库可以更新至 Https,对于不可更新的库可以通过添加 allowInsecureProtocol 属性解决 Gradle 仓库地址的不安全警告;
Q4: compile 弃用
小菜的历史项目中有个别 Module 中未及时修改 compile(),而 Gradle 升级之后已完全弃用 compile();
A4: 更新为 api 或 implementation
根据具体的业务需求将 compile() 更新为 api / implementation 即可;
Q5: Android 工程依赖的 Java 版本过低
A5: 更新 Android 依赖版本为 jdk 11.0.13
通过 AndroidStudio -> Preferences… -> Gradle 更新 jdk 版本即可;
Q6: AGCPluginTask 中 randomEncryptComponent 属性不应使用 @Optional 进行注释
小菜的历史项目中使用了 Huawei HMS 推送等,使用的 Marven 库版本较低,与升级后的 Gradle 不兼容;
A6: 升级华为 HMS 库版本
Q7: 使用 Intent 过滤器的 Service 需设置 exported 属性
此元素设置 Activity 是否可由其他应用的组件启动 —“true”表示可以,“false”表示不可以。若为“false”,则 Activity 只能由同一应用的组件或使用同一用户 ID 的不同应用启动。
如果您使用的是 Intent 过滤器,则不应将此元素设置为“false”。否则,在应用尝试调用 Activity 时,系统会抛出 ActivityNotFoundException 异常。相反,您不应为其设置 Intent 过滤器,以免其他应用调用 Activity。
如果没有 Intent 过滤器,则此元素的默认值为“false”。如果您将元素设置为“true”,则任何知道其确切类名的应用均可访问 Activity,但在系统尝试匹配隐式 Intent 时,该 Activity 无法解析。
此属性并非是限制 Activity 向其他应用公开的唯一方式。您还可使用权限来限制哪些外部实体能够调用 Activity
A7: 在所有 Module 中找到使用 Intent 过滤器的 Service 并按业务需求添加对应的 exported 属性
Q8: 使用 Intent 过滤器的 Receiver 需设置 exported 属性
A8: 在所有 Module 中找到使用 Intent 过滤器的 Receiver 并按业务需求添加对应的 exported 属性
Q9: 使用 Intent 过滤器的 Activity 需设置 exported 属性
A9: 在所有 Module 中找到使用 Intent 过滤器的 Activity 并按业务需求添加对应的 exported 属性
Q10: PendingIntent 需声明可变性
在 Android 12 中创建 PendingIntent 的时候,需要显示的声明是否可变,请分别使用 PendingIntent.FLAG_MUTABLE 或 PendingIntent.FLAG_IMMUTABLE 标志,如果您的应用试图在不设置任何可变标志的情况下创建 PendingIntent 对象,系统会抛出 IllegalArgumentException 异常;
A10: 根据业务设置 PendingIntent 可变性
PendingIntent 是一个可以给另一个应用程序使用的 Intent,PendingIntent 接收待处理意图的应用程序可以使用与产生待处理意图的应用程序相同的权限和身份执行待处理意图中指定的操作;
在 Adnroid 12 之前,默认创建一个 PendingIntent 它是可变的,因此其他恶意应用程序可能会拦截,重定向或修改此 Intent,
W11: 避免使用 flatDirs 提醒
Gradle 升级之后,提示避免使用 flatDir 提醒,因该方式不支持任何元数据方式;
A11: 使用 jniLibs.srcDirs 方式引入 libs 库
Gradle 升级之后使用 jniLibs.srcDirs 方式替代 flatDir 对 libs 库引入,并更新 aar 引入方式;
当前版本
升级后版本
W12: dexOptions 弃用提醒
A12: Gradle 升级后 dexOptions 已弃用,删除即可
Tips:
小菜在测试过程中,明明代码中所有涉及 intent-filter 过滤器的 Activity / Service / Receiver 都已经设置了 exported 属性,但依旧提示使用 Intent 过滤器的 XX 需设置 exported 属性;其原因在于引入了各类三方 SDK,在引入的各类三方库中可以存在对应的未设置 exported 属性的 Activity / Service / Receiver,单独设置处理一下即可;
Android 12 的初步升级到此位置,还有很多特有的属性,小菜会在后续的适配中进行完善;如有错误,请多多指导!
阿策小和尚
