Android开发之Android9.0的特性
白羽 2018-06-27 来源 :网络 阅读 2067 评论 0

摘要:本文将带你了解Android开发之Android9.0的特性,希望本文对大家学Android有所帮助。


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

 


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

 



本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程