Android P 新特性及兼容性适配注意事项
*影响所有应用 (无论TargetApi 是否 28+)
1.非SDK接口限制(参考https://www.cnblogs.com/huaweiopenlab/p/9056298.html)
SDK 接口是指在Android框架软件包索引中记录的接口。(https://developer.android.google.cn/reference/packages能够在谷歌网站查询到的接口都是SDK 接口)
非SDK接口:除以上的 SDK 接口外,其他都是非SDK接口应用
滥用 non-SDK interfaces 的危害:非SDK接口在版本之间可能有所变化,将带来兼容性问题。非SDK接口调用警告所有私有API均在Logcat 中显示警告。DP版本在Activity 开始时会显示Toast警告。
名单分类 查看名单https://android.googlesource.com/platform/frameworks/base/+/master/config/
Light grey list: targetSDK>=P时,警告;
Dark grey list: targetSDK<P时,警告;>=p时,不允许调用;
Black list:三方应用不允许调用;
2.默认情况下启用网络传输层安全协议
Android P 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。 即默认禁掉http请求
解决方法: manifest application android:usesCleartextTraffic="true"
3.androd P Apache HTTP 客户端弃用影响采用非标准 ClassLoader 的应用(即 androd P Apache HTTP API 不可用)
解决方法: Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml 添加以下内容:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
4.Android O 开始支持特长屏幕.
如果自适应式 UI 不适合您的场景,可以考虑在 manifest 中的 <activity> 内设置 resizableActivity = false,并加上 android:MaxAspectRatio 来声明最大支持纵横比。这会在特长屏幕的设备上启用兼容模式,把应用边缘的显示空间以黑色填充。
注:目前最高屏占比为红米6 Pro 19:9 = 2.111 android:name="android.max_aspect" android:value="2.2"
5.限制非Activity场景启动Activity(强制性 FLAG_ACTIVITY_NEW_TASK 要求)
在 Android P 中,除非使用了 FLAG_ACTIVITY_NEW_TASK intent flag,您不能在非 Activity 场景下启动 Activity。若您未使用这个 intent flag 就尝试启动 Activity,系统无法正常开启活 Activity,并会在日志中留下相应信息。
* 注意:FLAG_ACTIVITY_NEW_TASK 标签的要求属为预期行为,并且从 Android N 就对此作了强制要求。但是 Android N 系统中的错误暂时导致此要求没有被强制执行。
6.限制静态广播的接收
升级安卓9.0之后,隐式广播将会被全面禁止,在AndroidManifest中注册的Receiver将不能够生效
7.前台服务
针对 Android P 或更高平台开发的应用必须请求 FOREGROUND_SERVICE 权限才能使用前台服务。 FOREGROUND_SERVICE 属于普通级别请求,因此提出请求后,系统会自动授予。
若应用未提出 FOREGROUND_SERVICE 请求就试图创建前台服务,系统会抛出 SecurityException 异常。
8.移除对 Build.serial 的直接访问
Android 8.0 (API等级26) 已弃用 Build.SERIAL 字段;从 Android P 开始,Build.SERIAL 始终设定为 "UNKNOWN"。此项变更能够保护用户隐私。
若您的应用须要访问设备硬件序列号,您应该请求 READ_PHONE_STATE 权限,然后调用 getSerial()。
9.依赖的第三方 SDK (特别是加固和热修复框架) 会和系统底层紧密集成 (如使用非公开的接口),
而导致应用在 Android 版本升级时无法正常运行。。。注意三方sdk版本更新
10.不允许共享 WebView 数据目录
Android P 应用无法再让多个进程共用同一 WebView 数据目录
若多个进程中使用 WebView 的实例,则必须先利用 WebView.setDataDirectorySuffix() 函数为每个进程指定唯一的数据目录后缀,然后再在该进程中使用 WebView 的给定实例
若多个进程需要访问同一网络数据,您需要自行在这些进程之间复制数据。 例如,您可以调用 getCookie() 和 setCookie(),在不同进程之间手动传输 Cookie数据
11.全面屏检测特殊适配
Android P 里官方收归了全面屏的判断逻辑,Android P 和之后的版本完全可以使用官方 API 来判断全面屏,当然前提是第三方厂商按照 google 官方接口去实现。Android P 版本判断全面屏代码很简单
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowInsets windowInsets = decorView.getRootWindowInsets();
if (windowInsets != null) {
DisplayCutout displayCutout = windowInsets.getDisplayCutout();
if (displayCutout != null) {
List<Rect> rects = displayCutout.getBoundingRects();
//通过判断是否存在rects来确定是否刘海屏手机
if (rects != null && rects.size() > 0) {
isNotchScreen = true;
}
}
}
}
12.应用待机分组策略
应用待机群组 参考https://developer.android.com/about/versions/pie/power
受此影响为主要为应用的后台行为受限制,特别如闹钟,地图导航,后台下载
13.省电模式改进 影响 后台执行限制 位置服务及广播限制等
14.视图焦距
零区域视图 (即长或宽的值为 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 位十六进制颜色,这可能会导致渲染错误。
15.权限组变更
Android P 引入 CALL_LOG 权限组并将 READ_CALL_LOG、WRITE_CALL_LOG 和 PROCESS_OUTGOING_CALLS 权限移入该组。 在之前的 Android 版本中,这些权限位于 PHONE 权限组
16.wifi扫描权限变更
Android 8.0和Android 8.1:成功调用 WifiManager.getScanResults() 需要以下任何一项权限:
ACCESS_FINE_LOCATION;ACCESS_COARSE_LOCATION;CHANGE_WIFI_STATE
Android 9及更高版本:成功调用 WifiManager.startScan() 需要满足以下所有条件:
ACCESS_FINE_LOCATION;ACCESS_COARSE_LOCATION;CHANGE_WIFI_STATE
成功调用 WifiManager.getScanResults() 需要满足以下所有条件:
ACCESS_FINE_LOCATION;ACCESS_COARSE_LOCATION;CHANGE_WIFI_STATE;设备上启用了位置服务(在“设置”>“位置”下)
17.新的图片解码ImageDecoder
替代 BitmapFactory 可以从 流、file、byte buffer、 uRL 加载 Bitmap 和 Drawable 支持精确尺寸缩放, 并且支持加载 gif 、 Webp, 以及圆角等样式设置。
18.复杂文本显示PrecomputedText
显示复杂的,包含多种字体,行间距,字母间距,文本方向,换行符,连字符等功能。
19.文本放大镜Magnifier
Android P android P 引入了文本放大镜 <P不兼容
20.非全屏透明Activity禁用设置orientation
非全屏透明页面不允许设置方向,否则会抛Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation异常,解决方案:android:windowIsTranslucent设置为false。
21.刘海屏挖孔屏API支持
谷歌P版本提供了统一的挖孔屏方案和三方适配挖孔屏方案:对于有状态栏的页面,不会受到挖孔屏特性的影响;全屏显示的页面,系统挖孔屏方案会对应用界面做下移避开挖孔区显示;已经适配的P的应用的全屏页面可以通过谷歌提供的适配方案使用挖孔区,真正做到全屏显示。
P版本三方适配挖孔屏方案:
1.新增挖孔屏挖孔尺寸和位置接口:WindowInsets DisplayCutout
2.新窗口布局模式,允许应用程序请求是否在挖孔区域布局:WindowManager.LayoutParams
int layoutInDisplayCutoutMode:
final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;默认情况下,全屏窗口不会使用到挖孔区域
final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;窗口声明使用挖孔区域
final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;窗口声明不使用挖孔区域
22.sensor和麦克风后台管控
限制sensor event向后台应用或服务的传输,对前台应用无影响;主要是考虑隐私原因;对应用来说是很大的变化。影响范围:应用处于idle和gone的状态就会被管控,切换到后台一分钟应用就会进入idle状态,但是有前台服务的不会进入idle状态。
23.利用 Wi-Fi RTT 进行室内定位
在室内,IEEE 802.11 MC WI-FI protocol 测量与附近wifi 链接点的距离(2~3个),通过 RTT,来测量距离, 能精确到 1~2米 在提供硬件支持的 Android P 设备上,应用可以使用全新的 RTT API 来测量与附近支持 RTT 的 Wi-Fi 接入点 (AP) 的距离,设备不需要连接至 AP 即可使用 RTT使用uses-feature来标注:<uses-feature android:name="android.hardware.wifi.rtt" />
24.禁止空闲应用访问相机、麦克风和传感器
Android 9 限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9 设备的后台运行,系统将对您的应用采取以下限制:
(1)应用不能访问麦克风或摄像头。
(2)使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
(3)使用变化或一次性报告模式的传感器不会接收事件。
25. Crypto JCA 提供程序已被移除,弃用 Bouncy Castle 加密
AndroidP后,不再允许应用直接读取 /proc/net/xt_qtaguid 文件夹中的文件。 这样做是为了确保与某些根本不提供这些文件的设备保持一致。应用应该采用标准 API TrafficStats 和 NetworkStatsManager 进行访问,此限制对所有运行AndroidP系统上的应用生效。
26.SELinux 禁止访问应用的数据目录
对于targetsdkversion>=28的应用,系统强制每个应用的 SELinux 沙盒对每个应用的私有数据目录强制执行逐个应用的 SELinux 限制。现在,不允许直接通过路径访问其他应用的数据目录。应用可以继续使用进程间通信 (IPC) 机制(包括通过传递 FD)共享数据,例如可以采用FileProvider。
android P 新增及改动是非常大的,而且对以前版本已做的限制和警告现在P版本是强制的,更多新特性需深入发掘。