Android9.0(androidP)系统API和行为变化

文章转自:https://blog.csdn.net/u011216417/article/details/80300821

感觉原文排版太乱了,此版本变动又比较大,在此记录。


这篇文章,是Android官方文档的中文版本。

注意事项(AndroidP 特性):

1 android.os.Build.VERSION.RELEASE ,需要当做字符串类型处理。

2 依赖的第三方 SDK (特别是加固和热修复框架) 会和系统底层紧密集成 (如使用非公开的接口),而导致应用在 Android 版本升级时无法正常运行。 注意三方sdk版本更新。

3 直接使用底层的非 SDK 接口有可能会绕过一些 Android 对用户的安全性和隐私性方面的保护,不但影响用户体验、妨害用户隐私,也很可能会被 Google Play Protect 判定为恶意软件而提示用户卸载应用。

在 Android N 当中,我们限制了 C/C++ 代码所能使用的符号,从而确保使用 C++ 代码的 app 能够始终对接稳定的 NDK 接口,而不会因使用不稳定的非 NDK 接口而频频奔溃。自 Android P 起,我们将进一步提升系统稳定性,扩展此类限制至 Java 语言 SDK 接口。

4 dex2oat 就被设计为系统内部使用的编译部署工具,Android 从来都未支持过开发者直接调用 dex2oat 的场景。

从 Android O 开始,BaseDexClassLoader 和 DexClassLoader 构造函数中的 “optimizedDirectory” 参数已废弃,并在加载 dex 文件时不起作用。

5 篡改 so 文件并不会带来安全性的提升 (很多工具可以重新生成元数据),反而可能导致应用无法在未来的 Android 版本中启动 (由于动态链接器可能执行更严格的检查)。。不要修改 Android Studio 生成的 dex 和 so 文件。

6 “This app was built for an older version of Android and may not work properly 升级您应用的 targetSdkVersion 至最新版本.

7 Android O 开始支持特长屏幕(全面屏)。

如果自适应式 UI 不适合您的场景,可以考虑在 manifest 中的 内设置 resizableActivity = false,并加上 android:MaxAspectRatio 来声明最大支持纵横比。这会在特长屏幕的设备上启用兼容模式,把应用边缘的显示空间以黑色填充。

发生的变更

(1) 加密变更1

从 Android P 开始,对于 AndroidOpenSSL (也称为 Conscrypt) 提供程序所重复的、来自于 BC 提供程序的部分功能,我们计划将予以弃用。此举的目的不是因为对 BC 提供程序的实施安全存在疑虑,而是因为重复功能会造成额外的成本和风险,却无法带来太多益处。

如果您按名称或实例指定提供程序 - 例如,Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC") 或Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC")) - 则 Android P 的行为将取决于您应用的目标 API 级别。对于目标级别为 Android P 或之后版本的应用,调用会抛出 NoSuchAlgorithmException。

(2) 加密变更2

Nougat 开始弃用 Crypto 提供程序。以 API 24 (Nougat) 或之后级别为目标的应用程序请求则会失败.

在 Android P 中,我们计划完全移除 Crypto 提供程序。在移除后,所有对 SecureRandom.getInstance("SHA1PRNG", "Crypto") 的调用都会抛出 NoSuchProviderException。

(3) 加密变更3

P中在Conscrypt中对算法加入了额外的实现,适合参数有AES,DESEDE,OPEP,和EC(仅支持命名的曲线)。此外Android P中已弃用以上参数以及许多算法的BouncyCastle版本。

(4) 其他加密变更

  • 在使用 PBE 密钥的情况下,若您的应用未能提供 Bouncy Castle 要求的初始化向量,那么您将收到警告信息;
  • ARC4的 Conscrypt 实现允许您指定 ARC4/ECB/NoPadding 或者 ARC4/NONE/NoPadding;
  • Android P 移除了 Crypto Java Cryptography Architecture (以下简称 JCA) 加密服务提供商。因此,若您的应用调用 SecureRandom.getInstance("SHA1PRNG", "Crypto"),将会引发 NoSuchProviderException 异常;
  • 应用从大于密钥结构的缓冲区中解析 RSA 密钥时,不再会引发异常。

(5) 后台应用程序用户输入以及数据隐私

Android P 设备上后台运行,将会受到来自系统的以下限制:

  1. 您的应用无法访问麦克风和摄像头。
  2. 处于 “连续模式 (continuous)” 的传感器 (如加速传感器或者陀螺仪) 将无法接收事件。
  3. 处于 “变化模式 (on-change)” 或者 “单次模式 (one-shot)” 的传感器无法接受事件。

若您的应用须在 Android P 设备上检测传感器事件,请使用前台服务。

(6) 设备安全变更

运行 Android P 的设备提供密钥轮替以及系统调用保护。不论您的应用针对哪个级别的 API,此类变更都能显著提升应用安全性。

(7) 应用兼容性变更

平台将限制使用非 SDK 接口。不论开发者是直接还是间接 (如通过反射、JNI 等) 试图访问这些接口都会受到限制。在开发者预览版 1 (DP1) 中,您的应用可以继续访问此类限制接口,不过平台会通过显示 Toast 以及记录日志消息引起开发者注意。若您的应用显示此类 Toast,您必须弃用限制接口并改用另一种实现策略。若您认为没有可行的替代接口,请在留言给谷歌官方,要求重新考虑该限制是否合理。

(8) 更新 ICU 库

平台使用的 ICU 库已更新至 ICU 58 版本;Android 8.0 (API 版本 26) 和8.1 (API 等级 27) 使用的 ICU 库则更新至 ICU 60 版本。

ICU 可将公开 API 迁移至 android.icu 软件包,同时 ICU 也供 Android 平台内部使用,用于支持国际化开源项目,譬如说,开发者可以利用 ICU 在 java.util、 java.text 和 android.text.format 中实现 Android 类。此版本 ICU 包括一系列小而实用的更改项,如 Emoji 5.0 数据支持、日期 / 时间格式优化 (详情可阅读 ICU 59 和 ICU 60 发布说明)。开发者们须要尤其注意以下几点:

  • 平台时区处理方式更变平台更好地处理 GTM (格林威治标准时间) 以及 UTC (协调世界时)

  • java.text.SimpleDateFormat 现使用 ICU 为 UTC 和 GMT 提供显示名称

  • 解析 zzzz 能识别诸如 "Universal Coordinated Time" 和 "Greenwich Mean Time" 的字符串 Asia/Hanoi 不再属于被认可的时区

  • 即使在解析合法 CURRENCY 文本时,android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String) 方法可能抛出 ParseException 异常。开发者可以调用NumberFormat.parseCurrency 规避该问题。Android 7.0 (API 等级 24) 版本开始引入NumberFormat.parseCurrency 函数,用于处理类似 PLURALCURRENCYSTYLE 的 CURRENCY 文本。

(9) 不再支持 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 的开发者预览版则彻底移除了安全加密文件功能。

(10) 测试套件构建行为变更

Android P 移除了 TestSuiteBuilder 类中的 addRequirements() 方法,并且将 TestSuiteBuilder 类标记为弃用。此 addRequirements() 方法要求开发者提供隐藏 API 类型的参数,使得 API 无效。

(11) 测试从平台中移除的库

在 Android 8.1 (API 等级 27) 或更低版本系统中,Android 平台提供一系列类,如 ActivityInstrumentationTestCase2,供开发者在应用内创建测试。进行编译时,开发者可以在构建android.jar 文件时可以获取这些类。内置测试架构尽管十分简便,但它要求开发者针对 android.jar 提供的 JUnit 版本进行测试,因此会对依赖其它版本 JUnit 进行的构建和测试造成一定困难。

为了让开发者能够灵活地构建以及测试定制化或三方逻辑,Android P 从平台中移除了测试类。不过,将测试库仍然作为可选依赖项提供。

// Required if using classes in android.test.runner useLibrary 'android.test.runner' // Required if using classes in android.test.base useLibrary 'android.test.base' // Required if using classes in android.test.mock useLibrary 'android.test.mock'

(12) 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 方法。

(13) 使用证书验证主机名称

RFC 2818 描述了两种方法匹配主机名与证书:使用 subjectAltName (SAN) 扩展中的已有名称;若无 SAN 扩展,则使用 commonName (CN)。

不过,RFC2818已弃用 CN;因此 Android 也不再支持使用 CN。要验证一个主机名,服务器必须提供含有匹配 SAN 的证书;若证书中的 SAN 和主机名不匹配,该证书不再被信任。

(14) 网络地址查找可能导致网络违规

涉及域名解析的网络地址查找可能须要使用网络 I / O,因而属于阻塞操作 (blocking operation);而阻塞造作是导致中断和卡顿 (jank) 的主要元凶。

StrictMode 类是一款帮助开发者检测代码问题的开发工具,它能够检测到由涉及域名解析的网络地址查找导致的网络违规。

开发者不可以在 StrictMode 激活状态下待机应用,否则,应用可能产生新的异常,比如:使用 detectNetwork() 或 detectAll() 方法获取策略来侦测网络违规时,会产生 NetworkOnMainThreadException 异常。

解析数字 IP 地址不属于阻塞操作,且 Android P 和更低版本 Android 系统采用同样的解析方法。

(15) Socket 标记

在版本低于 Android P 的平台中,如果用 setThreadStatsTag() 方法标记某个 socket,那么通过 ParcelFileDescriptor 容器使用 binder IPC 将该 socket 传送到其它线程时,该 socket 会被取消标记。

从 Android P 开始,即使使用 binder IPC 将标记的 socket 传送到其它线程中,此标记也不会被取消。该变更会影响网络流量统计数据,比如,在调用 queryDetailsForUidTag() 方法时。您可以在传送 socket 标记到其它线程之前,调用 untagSocket() 来保留以前的行为。

(16) 报告 socket 中可用字节数量

触发shutdownInput() 方法后,调用 available() 方法会返回 0 值。

(17) 更详细的 VPN 网络能力报告

在低于 Android P 版本的平台中, NetworkCapabilities 类仅报告部分 VPN 信息,如包含 TRANSPORT_VPN 但不含 NET_CAPABILITY_NOT_VPN。这让应用开发者难以确定 VPN 的使用是否对用户产生费用。比如说,检测 NET_CAPABILITY_NOT_METERED 并不能确定应用使用的网络是否按流量计费。

从 Android P 起,当 VPN 调用 setUnderlyingNetworks() 方法时,系统会合并所有底层网络的传输以及能力,并将合并后的结果作为 “VPN 网络的有效能力” 返回。

已经设定过 NET_CAPABILITY_NOT_METERED 的开发者们从 Android P 开始就可以接收到 VPN 以及底层网络的能力

(18) 应用不再能访问 xt_qtaguid 文件夹中的文件

应用不再能直接读取 /proc/net/xt_qtaguid 文件夹中的文件,这一举措是为了与部分发售时就运行 Android P 的设备保持一致,而这些设备根本没有此类文件。

诸如 TrafficStats 和 NetworkStatsManager 此类依赖这些文件的公开 API 不会受到影响。但是,不受支持的 cutils 功能,如 qtaguid_tagSocket(),可能无法在不同的设备上按预期工作 (或者完全不能工作)。

(19) 强制性 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 系统中的错误暂时导致此要求没有被强制执行。

(20) 屏幕旋转变更

Android O 用户可在快速设定或屏幕设定界面进行操作,在自动旋转和固定竖屏模式之间进行选择。Android P 对竖屏旋转模式引入几大重要变更。竖屏模式更名为 “旋转锁定”,并且只有当自动旋转模式关闭情况下,该模式才能被激活。自动旋转模式暂无变更。

当设备处于旋转锁定模式时,用户可以将屏幕锁定在顶层可见 Activity 支持的任何方向。Activity 不能假定屏幕永远处于竖屏状态。如果顶层 Activity 在自动旋转模式下支持多个方向,旋转锁定模式也应给予相同选项,但可根据 Activity 的 screenOrientation 设置规定列外情况 (详情见下表)。

请求特定方向 (如,screenOrientation=landscape) 的 Activity 会忽略用户锁定偏好,并与 Android O 行为一致。

可在 Android Manifest 中的 Activity 级别的选项中设置屏幕方向偏好,或者调用 setRequestedOrientation() 来设定。

WindowManger 在处理 Activity 旋转时会使用用户屏幕旋转偏好设置,而 “旋转锁定模式” 也是通过设置该偏好来工作的。在下列情况中,用户屏幕旋转偏好可能会发生更改。请注意,Activity 倾向于回到竖屏状态:

当用户接受旋屏建议时,屏幕旋转偏好会更改至建议状态;

当用户跳转到只支持竖屏的应用时 (包括锁屏或者桌面启动器),屏幕旋转偏好会更改至竖屏状态。

Android P 以及之后的变更

(21) 前台服务

针对 Android P 或更高平台开发的应用必须请求 FOREGROUND_SERVICE 权限才能使用前台服务。 FOREGROUND_SERVICE 属于普通级别请求,因此提出请求后,系统会自动授予。

若应用未提出 FOREGROUND_SERVICE 请求就试图创建前台服务,系统会抛出 SecurityException 异常。

(22) 设备序列号访问限制

Android 8.0 (API等级26) 已弃用 Build.SERIAL 字段;从 Android P 开始,Build.SERIAL 始终设定为 "UNKNOWN"。此项变更能够保护用户隐私。

若您的应用须要访问设备硬件序列号,您应该请求 READ_PHONE_STATE 权限,然后调用 getSerial()。

(23) 视图焦距

零区域视图 (即长或宽的值为 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 位十六进制颜色,这可能会导致渲染错误。

(24) 文档滚动元素

在 Android P 之前,滚动位置被设置在 body 元素上,而根元素的滚动值为 0。Android P 支持符合标准的行为,即滚动元素为根元素。

此外,根据目标 SDK 不同,直接访问 document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop 或 document.documentElement.scrollLeft 会产生不同行为。要访问视口滚动值,请使用 document.scrollingElement (如果可用)。

(25) 关于一个class.(这个是2018/11/20经过一个紧急上线,发现的P版本的问题)

java.lang.NoClassDefFoundError,Lorg/apache/http/ProtocolVersion;

Fatal Exception: java.lang.NoClassDefFoundError

Failed resolution of: Lorg/apache/http/ProtocolVersion;

Caused by java.lang.ClassNotFoundException

Didn't find class "org.apache.http.ProtocolVersion" on path: DexPathList[[zip file "/data/app/com.chope.gui-kMIcnlrITdDG4e-XmYiKMw==/base.apk"],nativeLibraryDirectories=[/data/app/com.chope.gui-kMIcnlrITdDG4e-XmYiKMw==/lib/arm, /data/app/com.chope.gui-kMIcnlrITdDG4e-XmYiKMw==/base.apk!/lib/armeabi-v7a, /system/lib, /product/lib]]

通过异常堆栈可以看出来,这是一个类没有加载到。原因就是如果你 target 28(P)build 28,新版本不在包含 httpClient的所有,关于httpClient不在多说,googleAndroidSdk在经历很多版本,从不支持到移除部分Api,到现在全部移除,可以说经历了很多,这下子终于拿掉了,但是很多三方SDK底层还在封装使用相关Class。 两种解决办法:

  1. target < 28P,编译时,带入相关jar包class.
  2. 在manifest 中,配置 如果不好使就改成true. 还有一个类似这个,就是在gradle中配置 useLibrary 'org.apache.http.legacy.'

CLEARTEST communication to life.115.com not permitted by network security policy


Android P 限制了明文流量的网络请求,非加密流量请求都会被系统禁止掉。必须使用 https ,禁止使用 http。

解决方案:

  1. 在资源文件中新建xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
	<base-config cleartextTrafficPermitted="true"/>
</network-security-config>
  1. manifest 添加:
<application
	android:networkSecurityConfig="@xml/network_security_config">
<uses-library
	android:name="org.apache.http.legacy"
	android:required="false"/>

</application>

java.lang.illegalArgumentException: Invalid Region.Oponly INTERSECT and DIFFERENCE are allowed

if(Build.VERSION.SDK_INT >= 26){
	canvas.clipPath(mPath);
}else{
	canvas.clipPath(mPath,Region.Op.REPLACE);
}


Android P Beta 版本:

Get Android P Beta on a Pixel 2, Pixel 2 XL, Pixel, or Pixel XL device Get Android P Beta on selected partner devices Set up an Android Emulator to run Android P Beta Android 2018 I/O 大会第一批正式分发手机品牌:

Pixel、Pixel XL、Pixel 2、Pixel 2 X,Nokia 7 Plus 6GB+64GB版本,OPPO R15,索尼Xperia XZ2,vivo X21,小米MIX 2S,

0评论