全面适配 Android12

news2024/11/24 13:57:25

本文目录

  • 背景
  • 技术分析
  • 实战
  • 总结与展望

背景

2021 年 10 月 5 日 Google 发布 Android12 操作系统,安全性和隐私性大幅提升,各手机厂家陆续更新 Android12 操作系统。

2022 年随着各大 APP 应用市场推动 Android12 适配工作,开发者积极响应,一股技术升级浪潮来袭。

适配 Android 12

流利说旗下三大 APP “流利说英语”,“流利说阅读”,“流利少儿英语” 在 2019 年适配了Android X (API28),时隔 3 年全面适配 Android12 工作启动。

技术方案选型

原则

流利说 APP 工程较为庞大,适配工作原则应优先考虑减少变动量,低成本过渡到 Android12,后续迭代中再依序升级各项组件。

在此原则基础上思考两条主线 1. 工程环境适配。2. 系统特性适配。

线路

图片

工程环境适配目标是让 Android12 工程可以顺利完成项目的编译、调试、打包等各项链路。开发环境涉及 Android studio、JDK、Gradle 升级,CI/CD 主要是 ci-runner JDK 环境升级。

系统特性适配目标是解决各类编译和运行错误。 涉及第一方和第三方 SDK 升级,APP 权限调整,针对系统新特性调整业务代码,适配 UI 等工作。

按照这个两条主线我们开始实战升级。

实战

开发环境

AS升级

开发工具 Android studio 升级到 Chipmunk 版本, 升级全家桶, Android API,PlatformTools, BuildTools。

流利说工程 Gradle 版本比较老 AGP-3.4.3, Gradle-5.5.1 ,在 JDK 8 编译时报错。这是因为 Android12 中使用了JDK8 中没有的一个注解 - MODULE,进而导致的出错。

升级 JDK1.8 到 JDK11(Perferences→ Build Tools→ Gradle → GradleJDK 切换版本)。

java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE

配置 Gradle 文件

compileSdkVersion = 31buildToolsVersion = '31.0.0'minSdkVersion = 21targetSdkVersion = 31

CI/CD 环境

配置 Gitlab-Runner 环境

流利说使用 ansible 管理多台 runner 机器,将其中一台机器 runner 的 dockerfile 升级到 JDK11

FROM ubuntu:16.04LABEL de.mindrunner.android-docker.flavour="built-in"COPY --chown=root:root ./source.list /etc/apt/sources.listRUN apt-get updateRUN apt-get install -y openjdk-11-jdk git curl unzip lib32stdc++6
RUN apt-get install -y python3-pip python3-dev \    && pip3 install --upgrade pipRUN apt-get install -y wget expect vim python \    && apt-get install -y python-pip python-dev build-essential \    && pip install pathlib \    && pip install configparser
RUN apt-get clean

启用 Runner

在 gitlab 中的 setting→ Runners → Enable for this project 启用上述 CI Runner。

Android 工程 gitlab.yml 中 指定 tag 和 image

完成以上操作后 Android 12 项目环境搭建基本完成,本地编译和 CI 编译可以顺利通过。

API

这一小节需要适配 Android12 API , 解决工程各种 crash 和编译异常问题。

Exported

使用 的 activity、服务或广播接收器,需要显式的申明 exported 属性,如果组件需要在应用外启动就设置为‘true’,否则尽可能设置为’false’进而增加安全性。(不适配情况下APP安装时会提示:解析软件包出现问题)。可以跟着 Lint 报错(也可以手动搜索)在 AndroidManifest.xml 中一个个改动。比较隐形的是一些第三方库可能没有设置 exported 属性。可以将 APK 文件解压缩,然后用 AXMLPrinter2.jar 反编译明文输出 AndroidManifest.xml ,找到那些包含 但没有申明 exported 的 Activity。

java -jar AXMLPrinter2.jar AndroidManifest.xml  > test.xml

再利用 menifest 可合并的方式来解决, 比如添加下面这行。

<activity android:name="com.github.moduth.blockcanary.ui.DisplayActivity" android:exported="false" />

PendingIntent

PendingIntent 必须声明可变性来增加应用安全性,Android12 上每一个PendingIntent必须设置可变性 FLAG,可以是 FLAG_MUTABLE 或者 FLAG_IMMUTABLE。例:

val pi = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {    PendingIntent.getActivity(context, 0, intent,        PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE)} else {    PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT )}

Kotlin 判空

Kotlin 和 JDK 升级之后,判空检测升级,原代码中有相当一部分未判空的代码都添加了 ?.let{}、?.apply{} 等相关判空检测。这个工作会比较繁琐,改动地方比较多,编译时 AS 提供很好的错误定位,逐一修复,是个体力活。

SingleInstance 模式 和 taskAffinity

举例说明:A-Activity 是 standard 模式,由他启动的 B-Activity 是 singleInstance 模式。当进入 B 后,退到桌面再次点击 Icon,又重新启动了主 Activity。原因:B-Activity 是位于新的 task 栈内,然后当回到桌面后,Android11 会清理不活跃的后台栈,所以之前的 activity 都被干掉了。经测试,当在 B-Activity 页面直接回到桌面,确实 A 走了onDestroy。但是如果给 B-Activity 设置了不同于 application 的 taskAffinity,当退到后台时,系统就不会杀死 A-Acitivty 所在的栈。

权限和限制

SCHEDULE_EXACT_ALARM:Android12 上对精确闹钟的使用添加了最新限制,必须申明 SCHEDULE_EXACT_ALARM 权限才可以使用,例如提醒通知要在每天的八点触发,就需要声明此权限。

SENSOR_DELAY:限制加速度传感器、陀螺仪、磁力传感器等运动或位置传感器的采样率,一般为200HZ。可以根据业务需要设置(比如 SENSOR_DELAY_NORMAL) 如需 SENSOR_DELAY_FASTEST 需要声明权限HIGH_SAMPLING_RATE_SENSORS

trampoline:响应通知点按操作的服务或广播接收器这种组件,被称为 trampoline,12 之前 trampoline 中可以调用 startActivity 来启动最终的Activity,Android 12 上限制了此行为,如果要达到同样的效果,需要通过设置通知或通知操作按钮的 PendingIntent 的来达到同样的目的,不要忘了设置 PendingIntent 的可变性。

更多问题

项目不同差异较大,解决方案可以网上搜索 都有比较明确的答案

getSystemService(Context.WINDOW_SERVICE): Tried to access visual service WindowManager from a non-visual Context
JAX-DataBinding: 从 jdk9 开始 JAX-B 就从 jdk 中移除了
getLifecycle(): returned null in ComponentActivity's constructor
WebView: Binary XML file line... Error inflating class android.webkit.WebView
FOREGROUND_SERVICE: Permission Denial: ... requires android.permission.FOREGROUND_SERVICE
org.apache.http.legacy: Didn't find class "org.apache.http.impl.client.DefaultHttpClient"
android.graphics.FontFamily:  androidx.core.graphics.TypefaceCompatApi26Impl.obtainFontFamilyCtor
network security policy:  CLEARTEXT communication to dev-account.thellsapi.com not permitted by network security policy...

升级第一方和第三方

这部分也是项目差别较大,最近一年配合应用市场规范整改,已经有一部分 SDK 更新到了新版本,但适配工作依旧是黑盒,需要QA测试阶段才能发现。 注意:升级 SDK 混淆配置可能有差异。

UI

Notification 样式修改

自定义内容视图的通知将不再使用完整通知区域,系统会应用标准模板来确保自定义通知在所有状态下都与其他通知相同。我们一般使用的是 setCustomContentView,12 上还需要使用 setBigCustomContentView,以确保收起状态和展开状态保持一致。大致样式如下:

图片
图片

SplashScreen

App在每次启动时,系统都会为我们加上一个默认的启动画面。

图片

1.应用图标。2 背景图标。3 前景遮罩。4windows 窗口背景。找设计师要素材,在 style.xml 设定:

<item name="android:windowSplashScreenBackground">@color/bg_gray</item><item name="android:windowSplashScreenAnimatedIcon">@drawable/icon_splash_screen_animated</item><item name="android:windowSplashScreenAnimationDuration">1000</item>

总结与展望

以上内容为流利说各 APP 适配 Android12 改动范围。Android12 本身改变内容还有很多,比如定位精度、应用休眠、前台服务、蓝牙权限等等。2022年8月 Android13 正式版发布,更细化的权限和更多后台运行限制, 总体上感觉 Google 花了很大精力在提升 Android 安全性(当然还有稳定性),作为开发者很高兴看到 Android 生态越来越健康, 流利说作为保护用户隐私典范企业一直积极响应政策走在规范行业前沿,为我们的用户提供安全可靠的服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应用性能监控管理工具

应用程序性能监控 Application Manager 的应用程序性能监控&#xff08;APM Insight&#xff09; 使应用程序开发人员和 DevOps 工程师能够了解应用程序性能&#xff0c;并帮助他们在问题影响最终用户之前对其进行故障排除。在应用程序性能问题影响收入之前监控、查明并解决它…

计算机毕设Python+Vue校园社团管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

PiL测试实战(下)| PiL阶段的闭环测试

前言 上篇我们介绍了单元级软件的PiL测试&#xff0c;对于集成级的PiL测试&#xff0c;其流程和单元阶段基本一致。然而&#xff0c;对于一些带有反馈控制逻辑的集成测试&#xff08;如电机控制器MCU&#xff09;&#xff0c;PiL阶段会将控制算法&#xff08;Controller Model…

HeidiSQL连接MySQL失败

HeidiSQL连接MySQL失败故障现象解决方案方案一方案二故障现象 在使用非本地盘的位置上的Heidi SQL工具&#xff0c;远程连接MySQL&#xff0c;发现连接失败&#xff0c;错误的原因是“plugin caching_sha2_password.dll could not be loaded”的解决办法。 解决方案 我们可…

Linux进度条小程序与git

gitLinux进度条小程序缓冲区问题回车换行倒计时小程序进度条程序git什么是gitgit的发展史git的基本操作创建仓库与本地仓库建立联系Linux中git提交代码的三板斧git基础指令Linux进度条小程序 缓冲区问题 编译运行后发现延迟了两秒才出现数字&#xff0c;我们都知道程序中的代码…

83-137-springcloud-stream-nacos-sentinel

83-137-springcloud-stream-nacos-sentinel&#xff1a; Stream 常见MQ(消息中间件)&#xff1a;ActiveMQ&#xff0c;RabbitMQ&#xff0c;RocketMQ&#xff0c;Kafka Cloud Stream&#xff1a;屏蔽底层消息中间件的差异&#xff0c;降低切换成本&#xff0c;统一消息的编程…

WSL_02 WSL配置强大的 zsh

文章目录1 ZSH简介2 安装zsh2.1 准备阶段2 基础安装3 zsh更换主题3.1 使用vscode 打开 .zshrc4 自定义支持插件4.1 修改配置5 安装第三方插件autosuggestion5. 1 下载参考1 ZSH简介 zsh是Linux命令行界面&#xff0c;可以为帮助我们自定义配置命令行窗口&#xff0c;并且具有许…

vue引入iconfont/引入svg原理

前言 本文撰写的初衷是为了向组内成员推行使用svg sprites的方式管理项目的图标,由于实际工作中很多项目仍然采用font class的方式,这样不自觉带来一个痛点. 当项目一期开发完毕后,过段时间进入到项目二期。新增的开发需求不可避免的会增加新的图标,而font class需要全量打包…

Redis数据结构及命令详解

个人博客地址&#xff1a; http://xiaohe-blog.top/ 文章目录0. 简述1. 通用命令1.1 keys1.2 del1.3 type1.4 exists1.5 expire1.6 ttl2. string 类型2.1 set2.2 get2.3 mset2.4 mget2.5 setnx2.6 setex2.4 incr2.5 incrby2.6 incrbyfloat3. hash 类型3.1 hset3.2 hget3.3 hmse…

互联网时代,云计算的6大特征

1 云计算的定义 云计算是目前业内的热点概念&#xff0c;它以开放的标准和服务为基础&#xff0c;以互联网为中心&#xff0c;提供安全、快速、便捷的数据存储和网络计算服务&#xff0c;让互联网这片“云”上的各种计算机共同组成数个庞大的数据中心及计算中心。它可以被看成…

Observability:我们该选 Beats 还是 Elastic Agents 来采集数据?

除了 Logstash 之外&#xff0c;Elastic 提供了两种主要的方式来向 Elasticsearch 发送数据&#xff1a; 我们可以选择直接把数据从 Beats 发送至 Elasticsearch。当然我们也可以通过 Logstash 更进一步处理再发送至 Elasticsearch。 另外一种方式是使用 Elastic Agents 来发送…

[附源码]Nodejs计算机毕业设计基于的二手车交易平台Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

[附源码]Python计算机毕业设计Django课室预约系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Jmeter简单入门

背景 我们项目中一般测试接口都是用vscode中的REST Client插件&#xff08;推荐好用&#xff09;或者的话postman(适合写一些脚本和文件的上传) 但是他们都有一个不太行的功能&#xff0c;那就是多线程并发测试&#xff0c;其他市面上的什么apipost也都是不支持&#xff0c;网…

带你在Ubuntu 18.04上编译Linux内核

【推荐阅读】 一文了解Linux上TCP的几个内核参数调优 一文剖析Linux内核中内存管理 分析linux启动内核源码 一、环境说明 编译环境我选择了Ubuntu 18.04的虚拟机&#xff0c;内核截止2018-10-14最新版为4.18.14&#xff0c;笔者即将编译这个版本。 请确保磁盘空间足够&am…

Phoenix 对 Hbase 中表的映射

目录1&#xff09;表的关系2&#xff09;Hbase中创建表 test3&#xff09;视图映射4&#xff09;表映射数字类型说明1&#xff09;表的关系 默认情况下&#xff0c; HBase 中已存在的表&#xff0c;通过 Phoenix 是不可见的。 如果要在 Phoenix 中操作 HBase 中已存在的表&…

java计算机毕业设计基于安卓Android的车位服务管理APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把车位服务管理与现在网络相结合,利用java技术建设车位服务管理APP,实现车位服务管理的信息化。则对于进一步提高车位服务管理发展,丰富车位服务管理经验能起到不少的促进作用。 车位服务管理APP能够通过互联网得到广泛的、…

Python 爬虫库 urllib 使用详解!

一、Python urllib库 Python urllib 库用于操作网页 URL&#xff0c;并对网页的内容进行抓取处理。 Python3 的 urllib。 urllib 包 包含以下几个模块&#xff1a; urllib.request - 打开和读取 URL。 urllib.error - 包含 urllib.request 抛出的异常。 urllib.parse - 解析 …

自学了半个月python,感觉没用,怎么办?

本人从零基础开始学习python&#xff0c;已有两年之久&#xff0c;虽然一路上磕磕绊绊&#xff0c;但学习了一段时间之后&#xff0c;日常很多繁琐的工作&#xff0c;在python的助力下确实得到了很好的解决&#xff0c;工作效率也大大提高。 回到问题上来&#xff0c;自学了半…

Windows11如何通过附近共享发送文件,附近共享传输文件到电脑

Windows11如何通过附近共享发送文件&#xff1f;2018年&#xff0c;微软推出了名为Nearear Share&#xff08;附近共享&#xff09;的新功能。Near share是一种在PC之间传输文件的新方式&#xff0c;类似Airdrop的功能&#xff0c;只需要开启蓝牙和WiFi就能分享照片/影片/文件给…