过滤视图
为了让用户更好地控制自己的文件,减少文件混乱情况,Android Q 更改了应用对设备外部存储设备中的文件(例如存储在路径 /sdcard 下的文件)的访问方式。
如果应用以 Android Q 为目标平台,则在访问外部存储设备中的文件时会进入过滤视图,此时只能查看特定目录(Context.getExternalFilesDir())和特定类型的文件
1、 访问自己创建的文件:始终拥有读/写权限,无论文件位于特定目录以内还是以外
2、 访问其他应用创建的文件,需满足:
a)已获得 READ_EXTERNAL_STORAGE 权限
b)文件位于一个明确定义的媒体集合(MediaStore)中:照片 (Images )、视频(Video)、音乐文件(Audio)
3、 访问另一应用创建的任何其他文件(包括“downloads”目录下的文件),必须使用存储访问框架(SAF),用户可以通过该框架选择特定文件
SAF文档:使用“存储访问框架”打开文件 | Android 开发者 | Android Developers
4、 过滤视图对媒体数据的限制:如未获取新的ACCESS_MEDIA_LOCATION权限,则无法查看照片的位置信息等元数据
-
情形1:卸载后保留应用的文件
如果应用在访问外部存储设备中的文件时是过滤视图,那么卸载该应用时,系统会清除特定于该应用的目录中的所有文件。
a) 如果需要卸载后保留文件,需要保存到媒体集合( MediaStore )中
b) 需要在应用的AndroidManifest.xml文件增加:,否则应用数据会被直接删除,设置后会提示是否删除
-
情形2:分享媒体文件
某些应用允许用户彼此分享媒体文件。例如,用户可以通过社交媒体应用与朋友分享照片和视频。而分享后可能提示文件不存在。
应用使用路径方式(file:// URI)分享文件,其他应用访问时可能提示文件不存在
建议使用FileProvider适配(content://URI)
2、设备位置1. Q之前只有ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION;
2. Q新增加了后台定位权限:ACCESS_BACKGROUND_LOCATION,该权限对应始终允许;老的权限:ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION代表仅前台使用允许;
3. 应用的targetSdkVersion=Q,如果应用必须要始终定位,可以只申请ACCESS_BACKGROUND_LOCATION即可;s
如果应用只需要申请前台定位,则只需要申请老的定位权限即可;如果都申请则出现三态权限弹框
5. 如果用户选择仅前台使用允许,应用的页面退后台,通过启动前台服务让应用处于前台状态,必须把前台服务标为:foregroundServiceType=“location”,才能获取位置信息。
3、后台应用启动针对在没有用户互动的情况下从后台启动活动的新限制。
特性说明:
Android Q 对应用可启动 Activity 的时间施加了限制。此项行为变更有助于最大限度地减少对用户造成的中断,并且可以让用户更好地控制其屏幕上显示的内容。
只要应用启动 Activity 是因用户互动直接引发的,该应用就极有可能不会受到此项变更的影响。
允许 Activity 启动的条件
在 Android Q 上运行的应用只有在满足以下一个或多个条件时才能启动 Activity:
- 该应用具有可见窗口,例如在前台运行的 Activity。 注意:为了启动 Activity,前台服务不会将应用限定为在前台运行。
- 该应用在前台任务的返回栈中具有一项 Activity。
- 该应用具有最近启动的 Activity。
- 该应用对最近的一项 Activity 调用了 finish()。这仅适用于在调用 finish() 时,应用在前台中具有一项 Activity,或在前台任务的返回栈中具有一项 Activity 的情况。
- 该应用的一项服务被系统绑定。该条件仅适用于以下服务(可能需要启动界面):AccessibilityService、AutofillService、CallRedirectionService、HostApduService、InCallService、TileService、VoiceInteractionService 以及 VrListenerService。
- 该应用的某一项服务被其他可见应用绑定。请注意,绑定到该服务的应用必须在后台对该应用保持可见,才能成功启动 Activity。
- 该应用会从系统收到通知 PendingIntent。如果存在针对服务和广播接收器的待定 intent,则该应用可以在待定 intent 发送后启动 Activity 几秒钟时间。
- 该应用会收到从其他可见应用发送的 PendingIntent。
- 该应用会收到系统广播,其中要求应用启动界面。示例包括 ACTION_NEW_OUTGOING_CALL 和 SECRET_CODE_ACTION。该应用可以在广播发送后启动 Activity 并持续几秒钟时间。
- 该应用已通过 CompanionDeviceManager API 与配套硬件设备相关联。借助此 API,该应用可以启动 Activity 以响应用户在配对设备上执行的操作。
- 该应用是在设备所有者模式下运行的设备政策控制器。示例用例包括完全托管的企业设备,以及数字标识牌和自助服务终端等专属设备。
- 该应用已获得用户授予的 SYSTEM_ALERT_WINDOW 权限。
Q版本将限制应用访问不可重设的设备识别码,如 IMEI、序列号等,所有获取设备识别码的接口都增加了新的权限:READ_PRIVILEGED_PHONE_STATE,该权限需要系统签名的应用才能申请,意味着三方应用无法获取设备识别码
(1)TargetSdkVersion=Q,获取device id会抛异常SecurityException;
(2)TargetSdkVersion=Q:除非应用具有ACCESS_FINE_LOCATION权限,否则在Android Q上运行时,应用无法在Wi-Fi,Wi-Fi Aware或蓝牙API中使用多种方法。
2. 应用的targetSdkVersion=Q的应用
三、非SDK接口管控 1、非SDK接口的定义SDK接口:https://developer.android.com/reference/packages,能查到的接口都是SDK接口;
非SDK接口:除了谷歌开放的SDK接口之外的其他JAVA接口都是非SDK接口。
2、应用滥用非SDK接口的危害这些非SDK接口在大版本之间的变化可能很频繁,带来兼容性问题。
名单类型
影响
greylist
targetSDK>=P时,警告。
greylist-max-o
targetSDK=P时,不允许调用。
greylist-max-p
targetSDK=Q时,不允许调用。
blacklist
所有三方应用不允许调用。
3、影响范围
所有三方应用都可能会受到影响,从名单变化来看,黑名单接口大大增加,Q版本有很多非SDK接口被删除,都会导致应用出现兼容性问题,影响评估很大,需要所有应用排查和整改。
4、检查应用的非SDK接口- 构建targetSdkVersion为Q的可调式应用
- adb logcat ---- “Accessing hidden field Landroid/os/Message…”
- 使用StrictMode API
- detectNonSdkApiUsage() + penaltyListener()
- 处理onVmViolation回调
- Veridex静态分析工具
- AOSP 中提供源代码及预编译可执行文件
- 跟随每次Q Beta 版本发布更新
- 不支持JNI调用,对反射调用的检测结果不完全准确