android Q 新特性

谷歌针对的Q预览版的特性分享,内容涉及比较多。遗憾的是没有提供PPT给参会者,如下内容根据提纲与回忆整理,如有缺失敬请谅解。

适配Q重点归纳

  • 限制后台拉activity
  • 非系统应用无法获取到IMEI
  • 外部存储的隔离存储;公共媒体文件的存储
  • 后台地理位置权限
  • 适配折叠屏
  • 全屏手势导航,应用充分利用全面屏,建议应用不要覆盖系统手势,否则可能导致手势冲突,影响用户使用习惯
  • 应用使用黑色主题,灵活动态变化
  • Android Q,受限制的非SDK接口数量增多了

android Q发布时间表

1.后台启动 Acitvity 限制

禁止无用户交互的后台启动activity。
在后台,通过Notification也可以启动activity,但是通过alarm定时器无法启动activity。

允许Activity Starts的条件:

  1. 该应用有可见的窗口,例如有一个activity在前台
  2. 该应用程序有一个activity在foreground task
  3. 可见的应用程序绑定到应用程序的service
  4. 可见的应用程序发送该应用程序的pending intent
  5. 系统发送该应用程序的pending intent
  6. 系统发送broadcast到该应用程序
  7. 系统绑定到应用程序的服务
  8. 应用程序与配套硬件设备相关联
  9. 改应用程序是Device Policy Controller

2.设备标识符(deviceId)

从 Android Q 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 签名权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。

原来的READ_PHONE_STATE权限已经不能获得IMEI和序列号,如果想在Q设备上通过如下代码获得设备ID,会返回空值(targetSDK<=P)或者报错(targetSDK==Q)。

((TelephonyManager) getActivity()
      .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()

IMEI 可以帮我们判断用户是否更换了设备。在 Android Q 里有没有合适的替代方案?
Android 官方唯一标识符最佳做法:https://developer.android.google.cn/training/articles/user-data-ids

image

3.Android Q 分区存储

官方文档:https://developer.android.google.cn/preview/privacy/scoped-storage

如下是Q Beta3版本的最新特性,目前网上大部分基于Beta1的存储分区解释有差异,以如下Beta3特性为准。

外部存储沙盒:
Android Q 在外部存储设备中为每个应用提供了一个“隔离存储沙盒”(例如 /sdcard)。任何其他应用都无法直接访问您应用的沙盒文件。卸载APK时也会删除SD卡沙盒内的数据,要想在卸载后保留文件,请将它们保存到MediaStore中.

访问自己文件:
当应用target Q时,它会进入分区存储模式,这意味着它不再能直接访问/sdcard。尝试直接访问将导致FileNotFoundException或EPERM错误。
可以无需任何权限,直接访问应用所属沙盒目录(例如Context.getExternalFilesDir()),要想访问沙盒目录以外的文件,需要使用MediaStore或存储访问框架SAF。
访问媒体文件:
要访问沙盒外的媒体共享文件,比如照片,音乐,视频等,需要通过MediaStore。MediaStore以外的文件需要通过系统的文件选择器应用来进行访问。

所有应用都可以在没有任何权限的情况下为MediaStore提供内容,但是要查看其他应用提供的内容,必须获取READ_EXTERNAL_STORAGE权限。
Metadata:
android Q开始,应用需要获取ACCESS_MEDIA_LOCATION权限才可以访问媒体文件的位置信息元数据。
MediaStore中的LATITUDE和LONGITUDE字段已废弃,请使用ExifInterface来替代。
适配:
当应用target Q时,默认会开启分区存储模式;Q以下,默认情况下,应用储存方式将不会发生任何改变,依旧采用与旧版本 Android 系统相同的储存机制。
主动开启或关闭分区特性,使用allowExternalStorageSandbox标签:

<manifest ... >
  <application android:allowExternalStorageSandbox="false" ... >
  </application>
</manifest>

明年的下个版本,与target SDK级别无关,所有应用都要支持分区存储。

4.Android Q 地理位置权限变更

Android 官方文档:https://developer.android.google.cn/preview/privacy/device-location
新增位置权限:ACCESS_BACKGROUND_LOCATION
除非应用的某个 Activity 可见或应用正在运行前台服务,否则应用将被视为在后台运行。如果应用需要在后台时也获得用户位置(比如滴滴),就需要动态申请ACCESS_BACKGROUND_LOCATION权限。

targetSDK <= P 应用如果请求了ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION权限,Q设备会自动帮你申请ACCESS_BACKGROUND_LOCATION权限。


image

5.非SDK接口限制

Android 官方文档:https://developer.android.google.cn/preview/non-sdk-q#greylist-now-restricted
在 Android Q 中,受限制的非 SDK 接口数量更多了,建议您在开发时选用相等功能的公开 SDK 接口。为了帮助您成功过渡,并防止应用出现崩溃等问题,仅当应用的目标平台为 Android Q 时,这些限制才会生效。

名单 描述 影响
白名单 公开SDK
浅灰名单 我们检测到有应用在使用的接口 允许访问,可能加入警告或日志
深灰名单
(maxTargetSDK = P)
"接近"浅灰名单的接口,并在android新版本中已经增加了公开替代接口 当应用的targetSDK在P或者更早时,允许访问,否则(Q以后)禁止访问
黑名单 我们认为没有应用在使用的非SDK接口 禁止访问,抛出运行时错误

6.ART性能优化

  • 云端配置JIT热路径(仅支持google play)
    从 Android Nougat 开始,ART 便引入了热代码profile优化机制,通过识别并预编译频繁执行的代码,达到缩短应用启动时间的目的。为了进一步加快应用的启动速度,Google Play 现在除了 APK 文件之外,还会交付一套基于云的配置文件。它是一套已经过匿名化处理的汇总 ATR 配置文件,允许 ART 在应用开始运行之前就预编译一部分代码,这有助于显著提升优化进程的整体效率。基于云的编译文件适用于所有应用,而且运行 Android P 或更高版本系统的设备目前已提供相关支持。
  • 分代垃圾回收(Generational Garbage Collection)
    在 ART 的并发复制垃圾收集器 (Concurrent Copying Garbage Collector) 中加入了分代收集机制 (Generational Garbage Collection)。分代算法可以将新生代的对象单独收集出来,这样效率更高,而且与 full-heap GC 相比成本更小,释放空间也十分可观。总体而言,引入分代算法后,ART 垃圾回收速度和 CPU 利用效率有了明显提升,在减少垃圾的同时,帮助应用在低端设备上流畅运行。

7.Jetpack 更新

Jetpack官方文档:https://developer.android.google.cn/jetpack
主要更新:使用函数生成UI。
正常开发界面是xml布局+code,二者耦合。使用jetpack可以用代码生成UI,无需xml。
具体参看谷歌文档,需要使用Kotlin进行代码生成UI。

8.折叠屏设备适配

折叠屏官方文档:https://developer.android.google.cn/preview/features/foldables

折叠屏适配比较细化,主要是折叠、展开时,在onConfigurationChanged()做界面调整,支持拖拽等,请需要适配的APP模块自行参阅谷歌文档吧。

9.网络连接API

  • APP不能自行开关wifi
  • 设备管理APP才能调用网络配置API
  • Telephony、WiFi、蓝牙的扫描API,必须获取FINE LOCATION权限

10.全屏手势导航

类似于我们现在的全屏手势,建议今后采用原生实现逻辑;建议应用不要覆盖系统手势,否则可能导致手势冲突。

11.深色主题

  • 入口:设置—显示—主题背景;下拉快捷键
  • 针对OLED屏幕的话,深色主题可以省电。

12.通用系统映像介绍

GSI通用系统映像是未经修改的 Android 开源项目 (AOSP) 代码编译出的“纯 Android”,是一个system.img,适用8.x后支持treble的机型。

GSI的意义:节约时间,提前适配。在没有pixel手机刷Q Beta的情况下,可以使用完全支持treble的机器刷Q GSI,体验Q的新特性。

刷GSI步骤:(适用pixel,其他具体咨询芯片商)

  1. 启动到 fastboot 模式,然后解锁bootloader。

  2. 通过刷写 vbmeta.img 停用验证启动 (AVB):
    $ fastboot --disable-verification flash vbmeta vbmeta.img

  3. 清空系统分区,然后将 GSI 刷写到系统分区:
    $ fastboot erase system

    $ fastboot flash system system.img

  4. 擦除用户数据:$ fastboot -w

  5. 重新启动:$ fastboot reboot

官方文档:https://source.android.google.cn/setup/build/gsi

13.Google Play 商店政策

详情参考:play.google.com/policy

  • DexClassLoder:
    GP允许使用动态加载等代码更新,但是jar、so必须经过GP下发,不能使用自己的服务器下发jar,也就是jar要经过GP审核。
  • 系统级permission:
    GP政策中心上并没有包含针对OEM APK的说明,咨询了谷歌的人,他们说的也比较含糊,说是针对OEM厂商上架APK发过说明,针对OEM厂商APK的政策跟普通APK是不太一样的。
  • 咨询GP政策的讲师,说放心用permission,有问题及时申诉就行。申诉周期比较快,2个工作日内会给答复。

14.其他更新点

  • 19年下半年开始,Google Play 将要求所有新应用及更新将 targetSdkVersion 设置为 28 (Android 9 Pie)。除此以外,当用户首次运行 API 低级低于 23 (Android Marshmallow) 的应用时,会受到来自 Android Q 的警告信息。
  • 所有应用必须满足 64 位要求
  • 新增Bubble,Q正式版本在开发者选项中,未来浮动窗口可用Bubble替代
  • AI SDK (ML KIT)增强
  • 通知优化:自动生成文本回复,URL链接,其他deep links
  • 系统分享框优化:提升速度、改良外观,增加描述信息和图标
  • 隐私与安全
    BiometricPrompt 是 Android 推出的统一验证框架,它能为生物识别提供层面的支持。
    BiometricPrompt:https://developer.android.google.cn/reference/android/hardware/biometrics/package-summary
    TLS 1.3 的支持。https://developer.android.google.cn/preview/features#tls-1.3

15.Bionic 库和动态链接器路径变更

从 Android Q 开始,多个路径不再采用常规文件形式,而是采用符号链接形式。如果应用一直以来依赖的都是采用常规文件形式的路径,则可能会出现故障:
/system/lib/libc.so -> /apex/com.android.runtime/lib/bionic/libc.so
/system/lib/libm.so -> /apex/com.android.runtime/lib/bionic/libm.so
/system/lib/libdl.so -> /apex/com.android.runtime/lib/bionic/libdl.so
/system/bin/linker -> /apex/com.android.runtime/bin/linker

为了确保兼容性,新符号链接会基于旧路径提供,例如 /system/lib/libc.so 现在是指向 /apex/com.android.runtime/lib/bionic/libc.so 的符号链接,等等。因此,dlopen(“/system/lib/libc.so”) 会继续工作,但当应用尝试通过读取 /proc/self/maps 或类似项来检测已加载的库时,将会发现不同之处。这并不常见,但我们发现一些应用会将这种做法作为对抗黑客攻击的一项举措。如果是这样,则应该将新的 /apex/… 路径添加为 Bionic 文件的有效路径。

16.系统二进制文件/库会映射到只执行内存

从 Android Q 开始,系统二进制文件和库会映射到只执行(不可读取)内存,作为应对代码重用攻击的安全强化技术。有意或意外读入已标记为只执行的内存段会抛出 SIGSEGV,无论此读入行为是来自错误、漏洞还是有意的内存自省都不例外。

您可以通过检查 /data/tombstones/ 中的相关 tombstone 文件来确定崩溃是否由变更改所导致。与只执行相关的崩溃包含以下中止消息:

Cause: execute-only (no-read) memory access error; likely due to data in .text.

要解决此问题,开发者可以通过调用 mprotect() 将只执行内存段标记为“读取+执行”,例如用于执行内存检查。不过,我们强烈建议您事后将其重新设为只执行,因为这样可以更好地保护您的应用和用户。

对 ptrace 的调用不会受到影响,因此 ptrace 调试也不会受到影响。

17.移除了应用主目录的执行权限

以 Android Q 为目标平台的不受信任的应用无法再针对应用主目录中的文件调用 exec()。这种从可写应用的主目录执行文件的行为违反了 W^X。应用应该仅加载嵌入到应用的 APK 文件中的二进制代码。

此外,以 Android Q 为目标平台的应用无法针对已执行 dlopen() 的文件中的可执行代码进行内存中修改。这包括含有文本重定位的所有共享对象 (.so) 文件。

18.Go 设备上的 SYSTEM_ALERT_WINDOW

在 Android Q(Go 版本)设备上运行的应用无法获得 SYSTEM_ALERT_WINDOW 权限。这是因为绘制叠加层窗口会使用过多的内存,这对低内存 Android 设备的性能十分有害。

如果在搭载 Android 9 或更低版本的 Go 版设备上运行的应用获得了 SYSTEM_ALERT_WINDOW 权限,则即使设备升级到 Android Q 也会保留此权限。不过,尚不具有此权限的应用在设备升级后便无法获得此权限了。

如果 Go 设备上的应用发送具有 ACTION_MANAGE_OVERLAY_PERMISSION 操作的 intent,则系统会自动拒绝此请求,并将用户转到设置屏幕,上面会显示不允许授予此权限,原因是它会减慢设备的运行速度。如果 Go 设备上的应用调用 Settings.canDrawOverlays(),则此方法始终返回 false。同样,这些限制不适用于在设备升级到 Android Q 之前便已收到 SYSTEM_ALERT_WINDOW 权限的应用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 用户控制app访问设备位置 如果您在后台请求访问设备位置,则会影响您的应用 在后台授予应用访问设备位置后,用户可能...
    youseewhat阅读 12,401评论 0 3
  • android Q 对ART的优化 简单说两大优化,提升性能 JIT优化Android Q 大幅改进了 ART 运...
    youseewhat阅读 3,221评论 0 4
  • 重要变化 用户隐私方面的特性更新 折叠屏增强项resizeableActivity 新网络连接 API 全新的媒体...
    youseewhat阅读 603评论 0 0
  • 大姑妈拿水杯、倒水、准备凳子、洗水果…… 一个八十几岁的独居老人面对我们一行19人的来访队伍, 迈着蹒跚的步子在人...
    幸运儿2004阅读 332评论 0 1
  • 举国同庆渡佳节 欢聚一堂万家乐 张贴春联洋洋喜 新春气氛好祥和 在外游子步履忙 千里万里奔家乡 归心似箭情切切 为...
    细雨蒙蒙A阅读 188评论 7 8