Android9.0(androidP)系统API和行为变化
android9.0(androidp)api和行为变化。这篇文章,是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 中的
发生的变更:
(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, 如
* 代理形式编码的 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,nokia7 plus6gb+64gb版本,oppo r15,索尼xperia xz2,vivo x21,小米mix2s,
上一篇: .NET 一维、二维码生成DEMO
下一篇: Dokcer-ce安装脚本