Android 8.1(API 级别 27)引入了各种 为用户和开发者提供新功能。 本文重点介绍面向开发者的新变化。
Android Oreo(Go 版本)
<ph type="x-smartling-placeholder"></ph> Android Go 是一项旨在优化 Android 体验的计划, 全球数十亿网络用户从 Android 8.1 开始 我们正努力将 Android 打造成适合入门级设备的理想平台。Android Oreo 中的功能 (Go 版本)配置包括:
- 内存优化。改进了整个平台的内存用量 确保应用在 RAM 不超过 1GB 的设备上高效运行。
- 灵活的定位选项。新 硬件功能 常量,以便您可以通过 Google Play。
- Google Play:所有应用都可以在搭载 Android Oreo 的设备上下载 (Go 版本),Google Play 将展示由开发者专门优化的应用 为数十亿人提供卓越体验,为数十亿人打造 <ph type="x-smartling-placeholder"></ph> 指南。
我们为数十亿用户更新了建筑 <ph type="x-smartling-placeholder"></ph> 指南中提供了额外的指南, <ph type="x-smartling-placeholder"></ph> 针对搭载 Android 系统的设备 Android Oreo(Go 版本)。对于大多数开发者来说,优化现有 APK 或使用 Google Play 的 多 APK 功能,将某个 APK 版本定位到低 RAM 设备 是准备搭载 Android Oreo(Go 版本)的设备的最佳方式。请注意, 应用程序 更轻巧、更高效让您的所有受众无论使用何种设备。
Neural Networks API
Neural Networks API 为设备上的机器提供加速计算和推理 TensorFlow 等学习框架 Lite - Google 的跨平台机器学习库,适用于移动设备。 以及 Caffe2 等。访问 TensorFlow Lite 开放源代码 repo 以获取下载内容和文档。 TensorFlow Lite 与 Neural Networks API 配合使用,以运行 MobileNets、 Inception v3、 和 在移动设备上高效智能回复。
自动填充框架更新
Android 8.1(API 级别 27)对自动填充 可集成到您应用中的框架。
BaseAdapter
类现在包含 setAutofillOptions()
方法,该方法可让您以字符串形式提供
适配器。这对于显示旋转图标非常有用
在其适配器中动态生成值的控件。例如:
您可以使用 setAutofillOptions()
方法提供字符串
表示用户可选择作为
信用卡失效日期。自动填充服务可以使用字符串表示法
以适当方式填充需要数据的视图。
此外,AutofillManager
类包含 notifyViewVisibilityChanged(View, int, boolean)
方法
您可以调用 来通知框架
虚拟结构中的视图对于非
虚拟结构。不过,非虚拟结构通常不要求您
并明确通知框架,因为
View
类。
Android 8.1 还为自动填充服务提供了更多自定义保存界面的能力
通过添加对 CustomDescription
and
Validator
的支持来实现
SaveInfo
内。
自定义说明有助于自动填充服务明确
正在保存;例如,当屏幕上包含信用卡时
显示信用卡发卡行的徽标,信用卡的最后四位数
以及到期日期如需了解详情,请参阅
CustomDescription
类。
Validator
对象用于避免在验证器出现时显示自动填充保存界面
条件。要了解详情,请参阅
Validator 类及其子类
LuhnChecksumValidator 和 RegexValidator。
通知
Android 8.1 对通知做出了以下更改:
- 现在,应用每秒只能发出一次通知提醒。超过此值的提示音 速率不会加入队列并丢失。此更改不会影响通知的其他方面 行为和通知消息仍会按预期发布。
-
NotificationListenerService
和 低 RAM 不支持ConditionProviderService
在以下情况下,返回true
的 Android 设备: 调用ActivityManager.isLowRamDevice()
。
EditText 更新
从 API 级别 27 开始,EditText.getText()
方法会返回 Editable
;之前
它返回了一个 CharSequence
。此次变更
向后兼容,因为 Editable
会实现
CharSequence
。
Editable
接口提供了宝贵的
功能例如,因为 Editable
还会导致
实现了 Spannable
接口,则可以将标记应用于
EditText
实例中的内容。
程序化安全浏览操作
通过使用
WebView
实现 Safe Browsing API 之后,您的应用可以
检测 WebView
实例何时尝试导航
Google 已归类为已知威胁的网址。默认情况下,
WebView
会显示一个插页,警告用户存在已知威胁。
通过该屏幕,用户可以选择仍然加载网址或返回到
返回上一页。
在 Android 8.1 中,您可以通过编程方式定义 对已知威胁做出响应:
- 您可以控制应用是否向安全浏览功能报告已知威胁。
- 您可以让应用自动执行特定操作,例如 返回安全状态时 每次检测到“安全浏览”功能的网址时 被归类为已知威胁。
注意:为了防范已知威胁,请耐心等候
您必须先初始化安全浏览功能,然后再调用
WebView
对象的 loadUrl()
方法。
以下代码段展示了如何指示应用的
在遇到危险事件后,WebView
一律返回安全状态
已知威胁:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
Kotlin
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
Java
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
Kotlin
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
Java
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
视频缩略图提取器
MediaMetadataRetriever
类有一个新方法 getScaledFrameAtTime()
,用于查找
给定时间位置附近的帧并返回相同宽高比的位图
与源帧的宽高比进行比较,但会进行缩放以适应指定宽度的矩形,
高度。这对于从视频生成缩略图非常有用。
我们建议使用此方法,而不要使用 getFrameAtTime()
,因为这会浪费内存
因为它会返回与源视频具有相同分辨率的位图。对于
例如,4K 视频中的一帧将是 16MB 的位图,
需要使用缩略图
Shared memory API
Android 8.1(API 级别 27)引入了一个新的
SharedMemory
API。通过该类,您可以创建、映射和管理匿名
SharedMemory
实例。您已设置内存保护
在
SharedMemory
对象进行读取和/或写入,并且由于
SharedMemory
对象是 Parcelable 时,您可以通过 AIDL 轻松将其传递给其他进程。
SharedMemory
API 能与
ASharedMemory
功能。
ASharedMemory
授予访问权限
文件描述符,之后可将其映射为读取和写入。非常棒
分享大量数据的方式
数据在不同应用之间或单个应用中的多个进程之间传输的数据。
WallpaperColors API
Android 8.1(API 级别 27)允许动态壁纸提供颜色
向系统界面提供信息为此,您可以创建一个 WallpaperColors
对象,或者使用三种手动选择的颜色。
您还可以检索此颜色信息。
如需创建 WallpaperColors
,请执行以下操作:
对象时,请执行以下任一操作:
- 如需创建
WallpaperColors
,请执行以下操作: 对象,请创建WallpaperColors
的实例 来传递该颜色。主 颜色不得为 null。 - 如需创建
WallpaperColors
,请执行以下操作: 对象,调用fromBitmap()
方法是将位图来源作为参数传递。 - 如需创建
WallpaperColors
,请执行以下操作: 对象时,调用fromDrawable()
方法是将可绘制对象来源作为参数传递。
要从 则调用以下方法:
getPrimaryColor()
用于返回壁纸中最具视觉代表性的颜色。getSecondaryColor()
返回壁纸中第二主要的颜色。getTertiaryColor()
方法用于返回壁纸中第三主要的颜色。
要通知系统动态壁纸的任何重大颜色变化,请执行以下操作:
打电话给notifyColorsChanged()
方法。此方法会触发 onComputeColors()
生命周期
您有机会提供新的WallpaperColors
对象。
如需为颜色变化添加监听器,您可以调用 addOnColorsChangedListener()
方法。您可以
还会调用 getWallpaperColors()
方法
来检索壁纸的主要颜色。
指纹更新
FingerprintManager
类包含
引入了以下错误代码:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– 用户已试过 使用指纹读取器解锁设备的次数过多。 -
FINGERPRINT_ERROR_VENDOR
- 供应商专用指纹 读取器出错。
加密更新
Android 8.1 在加密方面进行了多次更改。
- 在 Conscrypt 中实现了新的算法。Conscrypt
与现有的 Bouncy Castle 实现相比,
实施。新算法包括:
<ph type="x-smartling-placeholder">
- </ph>
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
人已拒绝 适用于使用 GCM 的算法。而应使用getParameterSpec(GCMParameterSpec.class)
。- 许多与传输层安全协议 (TLS) 相关的内部 Conscrypt 类都进行了重构。开始时间
开发者有时会反思使用它们,而系统保留了 shim
支持以前的用法,但部分详细信息已更改。例如,套接字
之前的类型是
OpenSSLSocketImpl
,但现在是类型ConscryptFileDescriptorSocket
或ConscryptEngineSocket
,两者都扩展OpenSSLSocketImpl
。 SSLSession
方法,用于抛出 在传递 null 引用时为IllegalArgumentException
,现在 抛出NullPointerException
。- RSA
KeyFactory
不再允许生成密钥 从大于编码密钥的字节数组中提取数据。调用generatePrivate()
和generatePublic()
,它提供KeySpec
,其中键结构未填充 将导致InvalidKeySpecException
。 - 当套接字读取因套接字关闭而中断时,系统会使用 Conscrypt
从读取返回 -1。现在,读取会抛出
SocketException
。 - 根 CA 证书集已更改,主要移除的是大型 删除过期证书的数量,同时删除 WoSign 和 StartCom。有关此决定的更多信息,请参阅 安全博文, 最终 移除对 WoSign 和 StartCom 证书的信任。