5.20日在深圳现场听了Google Android Team组织的Android Q Labs的分享,简单做了个纪要,关注的朋友可以了解下。
(机缘巧合,官方工程师有看这篇文章,指出其中device ID的截图有错,SDK深灰名单的描述有错,感谢纠错,但是因为要休假旅行,所以没有时间详细再看回放修改,6.10号以后会更正为正确的内容。)
完整内容可以看这个视频直播:https://juejin.im/e/android-q-labs?from=groupmessage&isappinstalled=0
虽然直播是上海现场的,但是日程和内容和深圳场是一样的。
支持Android Q的手机,国内几大厂商已经都支持了,梳理了一下品牌及分布,如下方表格。
小米
VIVO
OPPO
OnePlus
其他
LG
Pixel /XL
小米 MI 9
Vivo NEX S
OPPO Reno
OnePlus 6T
Tecno Spark 3 Pro
LG G8
Pixel 2/XL
小米 MIX 3 5G
Vivo X27
Realme 3 Pro
Pixel 3/XL
ASVS ZenFone SZ
Pixel 3a
Sony Xperia XZ3
Android Q 优化
分享:支持生成分享的shortcut,即可预览展示分享的内容,快速复制
通知:支持高、弱优先级的通知设置,遵循用户设置为主。系统同时会对应用的通知状态进行预判断,比如会认为通话、message等是高优先级的通知。
通知处理:系统支持通知的一些回复的预测,以及默认处理。并且这个预判和处理不会发送到云端,仅在设备处理,保证用户的隐私。
隐私:为用户提供透明度、可控制性及数据上的保护
性能:改善性能有关的痛点,游戏开发、UI开发等
可更新性:把主要组件放在OS版本升级时同步更新
WI-FI权限:
APP不能自行开关WI-FI,设备政策控制程序(Device Policy Controller)才能调用网络配置API。WifiManager.setWifiEnabled()方法始终返回false。
如果需要,请使用设置面板提示用户启用和禁用Wi-Fi。使用getConfiguredNetwork()、updateNetwork()
Telephony、Wi-Fi、蓝牙扫描API,需要获得精确位置许可,即必须先获取ACCESS_FINE_LOCATION权限,否则在Android Q上运行时,应用将无法在Wi-Fi,Wi-Fi Aware或蓝牙API中使用多种方法。
设备ID访问限制:
仅系统应用才可读取IMEI 和Build serial,系统预装的应用,可通过 READ_PRIVILEGED_PHONE_STATE 获得设备ID。
targetSdk>=Q,将导致SecurityException
targetSdk<Q,获取了READ_PHONE_STATE的应用会返回NULL
常见问题的解决方案:
地址位置权限:
Pre Q:ACCESS_COARSE_LOCATIO
Android Q:ACCESS_COARSE_LOCATION、ACCESS_BACKGROUND_LOCATION
另外新增 ACCESS_MEDIA_LOCATION 权限。控制程序访问照片的位置。
Android Q 用户可通过以下三种方式对位置权限进行管理:
始终允许: 应用可在任何时段获取位置信息仅在使用期间允许: 应用只能在被使用时获取位置信息拒绝: 应用无法获取设备的位置信息权限获取的方式依然是在Android Manifest文件中
<manifest> <use-permission android:name=”android.permission.ACCESS_COARSE_LOCATION”/> <manifest>为了让用户体验更好,Google针对开发者做了适配处理,以targetSdkVersion来进行判断和控制。
示例:
地图APP,targetSdkVersion 为Android Q,希望始终访问位置信息功能时,需要开启ACCESS_COARSE_LOCATION 和ACCESS_BACKGROUND_LOCATION权限。
地图APP,targetSdkVersion为 Android 9 (API 等级 28) 或更低,当请求ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION时,系统会自动为应用添加ACCESS_BACKGROUND_LOCATION权限。
渐进式授权
通话记录:READ_CALL_LOG、WRITE_CALL_LOG、ROCESS_OUTGOING_CALLS
短信:READ_SMS、SEND_SMS、WRITE_SMS、RECEIVE_SMS、RECEIVE_WAP_PUSH、RECEIVE、RECEIVE_MMS
比如:允许APP获取该设备的位置信息吗?只有当您使用该应用时,该应用才有权访问您的信息。
存储授权
应用私有存储区保持不变,即Context.getDataDir()。
公有存储MediaStore:常见的MediaStore媒体文件有以下三类特定集合:音频 (Audio)、视频 (Video) 和图片 (Images)。新系统用了更细致的的媒体特定权限READ_MEDIA_IMAGES和READ_MEDIA_STORAGE权限,来限制访问。其它类型的文件,可储存在新的下载文件即Downloads集合中,并且MediaStore以外的文件需要通过系统文件管理器来访问。
在使用 MediaStore 的情况下,应用无需权限便可访问自己创建的文件,但是如果应用需要访问由其它应用提供的文件,则需请求权限。另外,在用户卸载应用之后又重新安装的情况下,原MediaStore的文件视为其他应用提供的文件。需要再次向用户请求权限,才能访问之前所提供的媒体文件。
targetSdkVersion
Android Q更新了对targetSdkVersion的要求。
至于更新的原因官方有简单说一下:
Google Play上的应用API级别依然26以下的占比趋向0%恶意软件的targetSdkVersion偏低,为绕过高版本的安全隐私改进国内市场也引入targetSdkVersion要求主流OEM厂商和应用商店已签高级API协议(自律公约)要求:
2018.5月:必须升级到26或以上2019.8月:新应用的targetSdkVersion必须升级到28或以上2019.11月:已有应用的新版本targetSdkVersion必须升级到28或以上另外,对如下情况进行了安装警告,以及运行警告。
安装警告出现在App安装时:
安装警告只对新安装的APK报警只在安装时报警适用于所有来源的安装用户仍可选择继续安装应用Google Play Protect条件:targetSdk<min(Build.VERSION.SDK_INT,26)
2019.8月:新应用的targetSdkVersion低于26时
2019.11月:已有应用的新版本targetSdkVersion低于26时2020年及以后:每年持续更新targetSdkVersion要求
运行警告出现在不满足要求的App运行时,并区分了国内和国外,国外依然是上述要求,而国内是:
Android P:针对targetSdkVersion<17的应用
Android Q:针对targetSdkVersion<23(Android M)的应用
另外,对于会弹出运行警告框的用户,开发需要对检查更新icon进行处理:ACTION_SHOW_APP_INFO(需安装程序支持处理intent)
SDK List
另外Android Q 也有一些SDK名单的更新。
名单
描述
影响
白名单
公开SDK
浅灰名单
检测到应用在使用的接口
允许访问,可能加入警告或日志
深灰名单
(maxTargetSDK = P)
接近浅灰名单的接口,并在Android新版本中已经增加了公开替代接口
当应用的targetSdkVersion 在P 或更早时允许访问;否则(应用的targetSdkVersion在Q或以后时)禁止访问
黑名单
我们认为没有应用的非SDK接口
禁止访问,抛出运行时错误
具体的非SDK接口更新文档可以在官网上看:
官方也给了开发者建议,可以通过如下三种方式测试用了哪些非SDK接口:
构建targetSdkVersion为Q的调试应用adb logcat
“Accessing hidden field Landroid/os/Message;->flags:l(light greylist,JNI)”件放在OS版本升级时同步更新
使用StrictMode APIdetectNonSdkApiUsage()+penaltyListener()
处理onVmViolation回调
Veridex静态分析工具AOSP中提供源代码及预编译可执行文件
跟随每次Q Beta 版本发布更新
不支持JNI调用,对反射调用的检测结果不完全准确
Android Q主要的变化还是围绕在隐私、性能和可更新性上。
关于折叠屏和背景主题的更新,参见另一篇文章:原 Android Q Labs 纪要(二):折叠屏和主题背景