Android P 9浅谈
领导突然吩咐研究一下Android P 9,一脸懵逼对Android O 8都没有普及和了解过就直接AndroidAndroid P 9,一直在搞车载系统开发用的还是Android K 4.4,但是最新的车载系统要搭载Android P 9,所以领导希望深入了解一下Android P 9的变化分享一下,没说的研究吧!
Android P 9 新特性亮点
在开发者模式中,原生系统已经可以模拟“刘海屏”的凹口并对拥有通知栏进行了适配和优化(时间移动到了左边),系统中的名称翻译过来可以 把“刘海屏”称之为“凹口屏”。
新的Android系统还改进了通知栏的功能性和可见性,简单来说,就是让通知栏的实用性更高,比如直接在这个地方进行回复信息,而也能查看更多的图片、消息等,同时新系统还允许同时接收多个摄像头的数据流,这样可以用来进行焦外成像、建立立体视觉等功能。
加入了WiFi Round-Trip-Time技术,这样可以即便设备进入了室内,也能通过多个WiFi连接点间的距离来实现定位
可以在支持HDR VP9的设备上,HEIF允许更高质量的图片压缩,同时,Android P的多媒体APIs也重新编写了,增加了可用性。
Android P还进一步优化了系统的效率,ART 性能提升,根据 Google 官方的说法平均能够减少 11% 的运行内存占用和应用储存空间占用。
更加好的后台运行和唤醒管理机制,缓存的后台应用在 P 上将无法访问包括麦克风,摄像头在内的大部分传感器数据,不仅可以进一步优化耗电,还能阻止流氓应用获取用户的隐私信息,而且Android P将会有更强大的来电防火墙,
安装应用时间更快,系统整体运行更流畅,设备续航性上进一步提升,添加指纹授权模块,来在本地设备中更好的管理指纹。
一些操作的优化:截图支持即时裁剪和编辑、支持连接同时多个音频设备了、JobScheduler 中的数据费用敏感度、神经网络 API 1.1、用于 NFC 支付和安全交易的 Open Mobile API等
Android 共用特性对开发的影响和注意事项
后台执行限制(非P特性)
谷歌海外TargetSdkVersion策略要求,应用必须升级TargetSdkVersion到26+才允许上架google play,所以后台执行限制这个针对TargetSdkVersion>=26生效的功耗管控特性
TargetSdkVersion>=26的应用将受到广播管控:应用无法收到通过静态注册的隐式广播,动态注册方式不受影响,显示广播不受影响
TargetSdkVersion>=26的应用将受到后台服务管控:应用处于前台时,可以自由创建和运行前台服务与后台服务。 进入后台时,在一个持续数分钟的时间窗内,应用仍可以创建和使用服务。在该时间窗结束后,应用将被视为处于 空闲 (idle)状态。 此时,系统将停止应用的后台服务,就像应用已经调用服务的“Service.stopSelf()”方法,另外应用处于空闲(idle)状态将不再允许应用再启动服
应用待机模式(非P特性)
- 应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态(idle)。当用户有一段时间未触摸应用时,系统便会作出此判定
低电耗模式(非P特性)
进入低电耗模式条件:用户设备未插接电源、处于静止状态一段时间且屏幕关闭,设备会进入低电耗模式,O版本进入低电耗模式时间是15分钟左右,P版本减少到5分钟左右;
低电耗模式限制:
- 暂停访问网络。
- 系统将忽略 wake locks。
- 标准 AlarmManager 闹铃(包括 setExact() 和 setWindow())推迟到下一维护时段。
- 系统不执行 Wi-Fi 扫描
- 系统不允许运行同步适配器
- 系统不允许运行 JobScheduler
Android P 9特性对开发的影响和注意事项
P版本新增FAS管控
用户设置限制后台活动之后的限制:
- 应用退后台,1分钟就会被停止Service(包括正在执行的前台任务,前台服务)
- 限制访问网络
- 限制Alarm触发
- 限制JobScheduler执行
兼容性影响
- 在 Android 8.0 之前,创建前台服务的方式通常是先创建一个后台服务,然后将该服务推到前台。Android 8.0 有一项复杂功能;系统不允许后台应用创建后台服务。 因此,Android 8.0 引入了一种全新的方法,即 Context.startForegroundService(),以在前台启动新服务。在系统创建服务后,应用有五秒的时间来调用该服务的 startForeground() 方法以显示新服务的用户可见通知。如果应用在此时间限制内未调用startForeground(),则系统将停止服务并声明此应用为 ANR。
Doze白名单
通过Doze白名单豁免所有的功耗方案管控:
加入doze白名单:
用户可以在 Settings > Battery > Battery Optimization 中手动配置该白名单。或者,系统会为应用提供请求用户将应用加入白名单的方式应用可以触发 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS Intent,让用户直接进入 Battery Optimization,他们可以在其中添加应用。
具有 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限的应用可以触发系统对话框,让用户无需转到“设置”即可直接将应用添加到白名单。应用将通过触发 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent 来触发该对话框。
用户可以根据需要手动从白名单中移除应用。
用户授权加入doze白名单
Apache HTTP 客户端弃用
此变更对大多数不以 Android 9 或更高版本为目标的应用没有任何影响。 不过,此变更会影响使用非标准 ClassLoader结构的某些应用,即使这些应用不以 Android 9 或更高版本为目标平台。
如果应用使用显式委托到系统 ClassLoader 的非标准 ClassLoader,则应用会受到影响。 在 org.apache.http.* 中查找类时,这些应用需要委托给应用 ClassLoader。 如果它们委托给系统 ClassLoader,则应用在 Android 9 或更高版本上将失败并显示 NoClassDefFoundError,因为系统 ClassLoader 不再识别这些类。 为防止将来出现类似问题,一般情况下,应用应通过应用 ClassLoader 加载类,而不是直接访问系统 ClassLoader。
所有的targetSdkVersion>=P的应用不适配的话,继续按照之前的方式使用apache http客户端会导致应用因为找不到apache http类抛异常崩溃;
小部分targetSdkVersion<P的应用,如果应用使用了非标准的classloader,不适配的话也是会导致闪退的问题。
建议使用HttpURLConnection替代apache-http,如必用apache-http有适配方案
蓝牙后台扫描管控
减少功耗,减少后台占用CPU,提供更加智能的扫描策略来降低功耗,对后台应用、灭屏场景下的扫描作限制,提供更加低功耗的扫描间隔和窗口。
管控措施:
后台:降低扫描的空占比;
灭屏:禁止蓝牙扫描。
Art的CDEX新特性
对加固应用有影响,加固动态加载以及后台优化之后都会触发cdex,加固方案不适配cdex,可能出现兼容性问题
新增dex2oat参数:–compact-dex-level=<none/fast>,其中:
none:不生成CompactDex
fast:生成CompactDex,并会做一些优化
只要dex2oat时没有指定–compact-dex-level=none,就都会采用cdex编译,目前看到的只有在前台job中(比如应用安装/BOOT_COMPLETE时触发的编译JOB/hota升级)才会指定 –compact-dex-level=none参数
限制内联方法不能跨dex
- Google在P版本新增检测:在resolve inline method的时候,如果检测到caller 与 callee处于不同的dex file, 就会主动发起abort(inline不允许跨dex文件),导致应用crash。
Camera、sensor和麦克风后台管控
增加Camera、sensor和麦克风的background限制,对所有targetSdkVersion的应用都生效;主要是考虑隐私安全的原因,功耗不是主要动机;对应用来说是很大的变化。
- Android 9 限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9 设备的后台运行,系统将对您的应用采取以下限制:
- 您的应用不能访问麦克风或摄像头。
- 使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
- 使用变化或一次性报告模式的传感器不会接收事件。
targetSdkVersion政策
Google Play的TargetSdkVersion要求
2018年8月 新发布应用-必现为26或更高
2018年11月 升级现有应用-必须为26或者更高
2019年之后 新发布或升级应用-必须为一年内发布的Android版本
国内TargetSdkVersion政策,谷歌要求P版本上面应用设置的targetSdkVersion需要>=17,否则会弹出警告对话框提示用户,并且谷歌有明确的CDD要求,该提示无法去掉。
其他对所有targetSdkVersion生效的变更
FLAG_ACTIVITY_NEW_TASK
被强制要求;在P版本,如果不在Intent添加FLAG_ACTIVITY_NEW_TASK
,将无法通过非Activity的Context启动一个Activity,并且会抛异常。从P版本开始,Crypto JCA provider被去掉了,调用SecureRandom.getInstance(“SHA1PRNG”,“Crypto”) 将会报NoSuchProviderException。
限制访问 Wi-Fi 位置和连接信息,在 Android 9 中,应用进行 Wi-Fi 扫描的权限要求比之前的版本更严格。 除了需要下面权限外:
1. ACCESS_FINE_LOCATION 2. ACCESS_COARSE_LOCATION 3. CHANGE_WIFI_STATE
还需要用户开启位置开关:
只对targetSdkVersion>=28生效的变更
使用前台服务的应用必须请求 FOREGROUND_SERVICE 权限
只需要在manifest中声明,系统自动授予,无需动态授权
若无此权限运行前台服务,会发生SecurityException
隐私权变更( 对设备序列信息和 DNS 信息进行的这些更新可增强用户隐私保护。)
去除通过Build.SERIAL获取设备序列号的方法,在 Android 9 中,Build.SERIAL 始终设置为 “UNKNOWN” 以保护用户的隐私。如果您的应用需要访问设备的硬件序列号,您应改为请求 READ_PHONE_STATE 权限,然后调用 getSerial()
DNS 隐私,以 Android 9 为目标平台的应用应采用私有 DNS API。 具体而言,当系统解析程序正在执行 DNS-over-TLS 时,应用应确保任何内置 DNS 客户端均使用加密的 DNS 查找与系统相同的主机名,或停用它而改用系统解析程序。
框架安全性变更
默认情况下启用网络传输层安全协议 (TLS),如果您的应用以 Android 9 或更高版本为目标平台,则默认情况下 isCleartextTrafficPermitted() 函数返回 false。 如果您的应用需要为特定域名启用明文,您必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true。
WebView数据目录不允许共享
- 即使是同一个应用的不同进程也不行
- 建议:只在一个进程中调用WebView,其他进程disableWebView()
- 不同进程的WebView数据目录名必须使用不同的后缀
- 如果应用中的多个进程需要访问同一WebView数据,您需要自行在这些进程之间复制数据。 例如,您可以调用 getCookie() 和 setCookie(),在不同进程之间手动传输 Cookie 数据。
应用间不可以使用全局的Unix权限共享数据
- 每个应用数据目录都由selinux保护
- 应用可以继续使用ContentProvider或者外部存储共享数据
视图焦距
零区域视图 (即长或宽的值为 0) 不再能够设定焦点。
另外,在 touch-mode 下 Activity 不再隐式分配初始焦点,而是要求开发者在需要的情况下对初始焦点提出显式要求。
Android P 应用允许 CSS Color Module Level 4 行为,用于操作 4 位和 8 位十六进制 CSS 颜色。
Chrome 从 52 版本开始支持 CSS Color Module Level 4,但是 WebView 目前暂时禁用该功能,因为存在现有 Android 应用在 Android ordering (ARGB) 中包含 32 位十六进制颜色,这可能会导致渲染错误。
文档滚动元素
在 Android P 之前,滚动位置被设置在 body 元素上,而根元素的滚动值为 0。Android P 支持符合标准的行为,即滚动元素为根元素
根据目标 SDK 不同,直接访问 document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop 或 document.documentElement.scrollLeft 会产生不同行为。要访问视口滚动值,请使用 document.scrollingElement (如果可用)
屏幕旋转变更
- Android P 对竖屏旋转模式引入几大重要变更。竖屏模式更名为 “旋转锁定”,并且只有当自动旋转模式关闭情况下,该模式才能被激活。自动旋转模式暂无变更。
应用不再能访问 xt_qtaguid 文件夹中的文件
- 应用不再能直接读取 /proc/net/xt_qtaguid 文件夹中的文件
- TrafficStats 和 NetworkStatsManager 此类依赖这些文件的公开 API 不会受到影响。但是,不受支持的 cutils 功能,如 qtaguid_tagSocket(),可能无法在不同的设备上按预期工作 (或者完全不能工作)
Java UTF 解码器
UTF-8 是 Android 的默认字符集。开发者可利用类似 String(byte[] bytes) 的字符串构造函数解码 UTF-8字节串。Android P 中 UTF-8 解码器更为严格,同时遵循 Unicode 标准,即:
非最短形式编码的 UTF-8, 如 <C0, AF>,现在属于不规范编码;
代理形式编码的 UTF-8,如 U+D800..U+DFFF,现在属于不规范编码;
最大字节部分由 U+FFFD 代替,拿字节串 “41 C0 AF 41 F4 80 80 41” 为例,该字节串最大字节为 “C0”,“AF” 和 “F4 80 80” 。字节串 “F4 80 80 80” 的起始部分可以是 “F4 80 80”,但是任何规范字节串都不能以 “C0” 开头。因此,输出应为 “A\ufffd\ufffdA\ufffdA”;
若要在 Android P 上解码修正 UTF-8 / CESU-8 代码,请调用 DataInputStream.readUTF() 方法或者 NewStringUTF() JNI 方法。
不再支持 Android 安全加密文件
Android 加密文件 (ASEC) 最早在 Android 2.2 (API 等级 8) 引入,用于支持 apps-on-SD-card 功能。Android 6.0 (API 等级 23) 已替换并弃用了安全加密文件,同时引入了 “可采用的 SK 卡 (adoptable SD card)” 功能;
Android 8.0 (API 等级 26) 阻止往安全加密文件中安装新应用。Android P 的开发者预览版则彻底移除了安全加密文件功能。
加密变更
参考文档
https://blog.csdn.net/u011216417/article/details/80300821
https://developer.huawei.com/consumer/cn/devservice/doc/50115