欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android9.0特性

程序员文章站 2022-12-19 19:58:00
这篇文章,是Android官方文档的中文版本。注意事项(AndroidP 特性): (1),android.os.Build.VERSION.RELEASE ,需要当做字符串类型处理。 (2),依赖的第三方 SDK (特别是加固和热修复框架) 会和系统底层紧密集成 (如使用非公开的接口),而导致应用 ......

这篇文章,是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 中的 <activity> 内设置 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'
<!-- You don't need to include android:required="false" if your app's
     minSdkVersion is 'P'. -->

<uses-library android:name="android.test.runner"  android:required="false" />

(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 倾向于回到竖屏状态:
        当用户接受旋屏建议时,屏幕旋转偏好会更改至建议状态;
        当用户跳转到只支持竖屏的应用时 (包括锁屏或者桌面启动器),屏幕旋转偏好会更改至竖屏状态。

Android9.0特性


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 (如果可用)。


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