Android P 行为变更

     Android P 提出了许多Android系统的行为变更。很多这些变更影响着大多数应用(不管应用是以哪个Android版本开发)。但是,一些改变仅仅影响目标版本是Android P的应用。为了表述清晰,本文分为两个部分:一、影响各Android版本的应用的变更.。二、只影响Android P应用的变更。

所有运行在Android P设备的应用

     这些行为变更将在所有运行在Android P平台上生效,不管应用API是什么版本。开发者应该浏览这些变更并修改应用以兼容Android P设备。

输入和数据隐私对后台应用的影响

     Android P系统通过限制后台App访问用户输入和传感器数据来提高隐私安全。如果你的应用运行在后台,Android P系统将会对你的后台应用采取以下限制:
     1.你的应用无法访问话筒麦克风和相机。
     2.应用将不会接收到持续传递数据的传感器(如:加速度传感器、重力传感器)的事件。
     3.应用将不会接收到那些采用on-change和one-shot报告模式的传感器的事件。
     如果你的应用需要去监控传感器事件,请用前台服务。
注意:在SensorManager实例对象调用flush()方法不会受此行为变更影响。

关于设备安全的变更

     运行Android P系统的设备提供了密钥装置(key rotation)和系统调用保护(system call protection)。不管你的应用运行哪个版本的Android API。详情查看官方Android P安全行为变更

密码变更

     Android P 对密码算法的实现和处理进行了一些改变。

Conscrypt的参数和算法实现

     Android P提供了Conscrypt额外的算法和参数的实现。这些形式包括:AES,DESEDE,OAEP和EC。这些参数和算法在Bouncy Castle版本中已经被废弃掉了。
     如果你的应用API版本低于27(Android 8.1),当你使用Bouncy Castle上述废弃算法时将会接收到警告提示。如果你的应用API是Android P版本,你将会出现NoSuchAlgorithmException异常。

其他变更

     Android P 关于密码的其他变更:
     1.当使用PBE键,如果Bouncy Castle正需要初始向量(IV)而你又无法提供的话,将收到warning提示。
     2.ARC4加密的Conscrypt实现允许你指定ARC4/ECB/NoPadding或者ARC4/NONE/NoPadding。
      3.Crypto的JCA(Java密码学结构) 提供者已经被移除。因此,如果你的应用调用SecureRandom.getInstance(“SHA1PRNG”, “Crypto”)将出现NoSuchProviderException。
     4.如果你的应用从容量大于键结构的缓冲区(buffers)解析RSA键,将不会出现异常。

应用兼容性变更

     为了确保应用的稳定性和兼容性,平台限制了non-SDK的方法和属性的使用;这些限制在你尝试访问限制方法和属性时生效,例如通过反射或JNI访问私有对象。在开发者预览版,你的app虽然仍然可以访问这些被限制的接口,但是平台会通过log或者toast提醒你。如果你的应用弹出这类toast,你最好采用其他实现策略替代访问限制接口。如果你觉得没有其他可行的办法,你可能要用文件记录bug去向官方请求再考虑是否限制。
     限制Non-SDK接口包含很多重要信息。最好打开了解一下。

ICU库的更新

     ICU库的版本已经从ICU 58(在Android 8.0和Android 8.1使用)升级到ICU60。
     ICU用来提供在android.icu包下的共有方法并用来在Android平台内部对国际化进行支撑。例如,过去常常在java.util,java.text和android.text.format包实现Android类。这更新包含很多小的但很有用的变更如表情5.0数据支持和改进日期/时间格式,在ICU 59和ICU 60的文档中。你应该关注如下内容:
     1.平台处理时区的方式已经改变。
     2.java.text.SimpleDateFormat现在用ICU去提供UTC/GMT名字显示。
     3.java.text.DateFormatSymbols.getZoneStrings()行为改变。
     4.Asia/Hanoi 不在被认为的时区。因为java.util.TimeZones.getAvailableIds()不再返回这个值,
同时java.util.TimeZone.getTimeZone()不承认它。这行为和android.icu保持一致。
     android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String)方法可能抛出一个ParseException,甚至当解析正确货币文本也会出现异常。

Android 不再支持ASECs

     ASECs起初从Android 2.2(API level 8)开始用来支持原始apps-on-SD-card特性。Android 6.0(API level 23)取代并废弃ASECs,替代为”adptable SD card”特性。
     Android8.0(API level 26)阻止了安装新的app到ASECs的能力。

测试套件构建改变

     addRequirements()方法在TestSuiteBuilder类中已经移除,并且TestSuiteBuilder类本身也被废弃。

测试库从框架层中移除

     在Android 8.1(API level 27)或更低,Android框架层提供一些用于创建应用测试用例的类,如ActivityInstrumentationTestCase2。在编译时期,这些类在靠android.jar包构建有用。这种嵌入测试结构,虽然方便,需要你去测试靠android.jar提供的Junit的版本,这使得构建和测试第三方依赖需要依赖不同版本的JUnit变得困难。
     为了给开发者更多构建和测试自定义和第三方库逻辑的可行性。Android P从框架层移除测试库。测试库仍然可行在可选择依赖。Legacy testing libraies描述了如何在Android P使用它们。
     学习更多关于测试Android应用的知识,查看Testing Apps on Android

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页