Android 8.1 功能和 API

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 配合使用,以运行 MobileNetsInception 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 类及其子类 LuhnChecksumValidatorRegexValidator

通知

Android 8.1 对通知做出了以下更改:

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一律返回安全状态 已知威胁:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</manifest>

MyWebActivity.java

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!");
            }
        }
    });
}

MyWebViewClient.java

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,请执行以下操作: 对象时,请执行以下任一操作:

要从 则调用以下方法:

要通知系统动态壁纸的任何重大颜色变化,请执行以下操作: 打电话给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,但现在是类型 ConscryptFileDescriptorSocketConscryptEngineSocket,两者都扩展 OpenSSLSocketImpl
  • SSLSession 方法,用于抛出 在传递 null 引用时为 IllegalArgumentException,现在 抛出 NullPointerException
  • RSA KeyFactory 不再允许生成密钥 从大于编码密钥的字节数组中提取数据。调用 generatePrivate()generatePublic(),它提供 KeySpec,其中键结构未填充 将导致 InvalidKeySpecException
  • 当套接字读取因套接字关闭而中断时,系统会使用 Conscrypt 从读取返回 -1。现在,读取会抛出 SocketException
  • 根 CA 证书集已更改,主要移除的是大型 删除过期证书的数量,同时删除 WoSign 和 StartCom。有关此决定的更多信息,请参阅 安全博文, 最终 移除对 WoSign 和 StartCom 证书的信任