Android 8.1 功能與 API

Android 8.1 (API 級別 27) 推出了多種 為使用者和開發人員推出新功能 本文件將重點介紹開發人員適用的新功能,

Android Oreo (Go 版本)

Android Go 是我們推出的計畫,旨在為所有使用者提供更棒的 Android 體驗 全球有數十億人上網自 Android 8.1 起, 我們致力讓 Android 成為入門級裝置的絕佳平台。Android Oreo 的功能 (Go 版本) 設定包括:

  • 記憶體最佳化。改善整個平台的記憶體用量,確保 可讓應用程式在 RAM 小於 1 GB 的裝置上執行有效率地執行。
  • 靈活的指定目標選項:全新內容 硬體功能 常數,可讓您透過 Google Play。
  • Google Play:所有應用程式都能在搭載 Android Oreo 的裝置上提供 (Go 版本)),Google Play 會呈現專為開發人員最佳化的應用程式 為數十億名使用者提供優質服務 規範。

我們為數十億名使用者更新了建築 指南,並提供更多 針對執行式裝置的裝置最佳化應用程式 Android Oreo (Go 版本)。對大多數開發人員來說,為現有的 APK 進行最佳化或使用 Google Play 的 多個 APK 功能:可讓您針對 RAM 較少的裝置指定 APK 版本 是為搭載 Android Oreo (Go 版本) 的裝置做好準備的最佳方式。提醒您,製作 應用程式 輕而易舉則能滿足整個目標對象的各種需求。

Neural Networks API

Neural Networks API 可為裝置端機器提供加速運算和推論 例如 TensorFlow Lite:Google 的跨平台行動裝置機器學習程式庫, 和 Caffe2 等等造訪 TensorFlow Lite 開放原始碼 存放區。 TensorFlow Lite 搭配 Neural Networks API,可執行 MobileNetsInception v3, 和 在行動裝置上有效率地回覆

自動填入架構更新

Android 8.1 (API 級別 27) 為自動填入功能提供多項改善 可納入應用程式的架構。

BaseAdapter 類別現在包含 setAutofillOptions() 方法,讓您能在 轉接頭。這對於旋轉器來說非常實用 控制項,這些控制項會在轉接程式中動態產生值。例如: 您可以使用 setAutofillOptions() 方法提供字串 使用者可選擇的年數清單 信用卡到期日。自動填入服務可以使用字串表示法 以便正確填入需要資料的檢視畫面。

此外,AutofillManager 類別包含 notifyViewVisibilityChanged(View, int, boolean) 方法 您可用來呼叫 以虛擬結構的形式顯示畫面此外,我們也對 虛擬結構體系不過,非虛擬架構通常不需要 明確通知架構,因為 View 類別

Android 8.1 版還讓自動填入服務提供更多自訂儲存 UI 的功能 新增對 CustomDescription and Validator 的支援 在 SaveInfo內。

自訂說明有助於自動填入服務清楚瞭解內容 儲存中;舉例來說,如果畫麵包含信用卡 上面寫著信用卡銀行的標誌 (信用卡末 4 碼) ,以及到期日的到期日。詳情請參閱 CustomDescription 類別

Validator 物件用於避免在驗證工具時顯示自動填入儲存 UI 不符合條件詳情請參閱 驗證工具類別及其子類別 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>

我的 WebActivity.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!");
            }
        }
    });
}

我的 WebViewClient.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 影片的影格會是 16 MB 的點陣圖,比您大很多 不一定需要的是縮圖

共用記憶體 API

Android 8.1 (API 級別 27) 導入了 SharedMemory敬上 也能使用 Google Cloud CLI 或 Compute Engine API這個類別可讓你建立、對應及管理匿名 SharedMemory敬上 執行個體。設定記憶體保護功能 的 SharedMemory敬上 讀取和/或寫入物件,以及 SharedMemory 可透過 AIDL 將物件傳送至其他程序,

SharedMemory API 會與 NDK 的 ASharedMemory 設施。 「ASharedMemory」授予存取權 附加至檔案描述元,可對應至讀取及寫入。太棒了 傳輸大量資料的方法 或單一應用程式內多個程序之間的資料。

WallpaperColors API

Android 8.1 (API 級別 27) 允許動態桌布提供色彩 將資訊傳送至系統 UI方法是建立 WallpaperColors 物件從點陣圖、可繪項目中擷取 或手動選取三種顏色 您也可以擷取這項顏色資訊。

如何建立 WallpaperColors 物件,請執行下列任一操作:

如要從主要、次要或第三色 桌布,請呼叫下列方法:

如要讓動態桌布有重大色彩變更,系統會通知系統, 呼叫 notifyColorsChanged() 方法。這個方法會觸發 onComputeColors() 生命週期 讓你能夠提供新WallpaperColors的活動 物件。

如要新增顏色變更的事件監聽器,可以呼叫 addOnColorsChangedListener() 方法。你可以 也會呼叫 getWallpaperColors() 方法 擷取桌布的主要色彩。

指紋更新

FingerprintManager 類別有 導入了下列錯誤代碼:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT:使用者已嘗試 指紋感應器解鎖的次數過多。
  • FINGERPRINT_ERROR_VENDOR:供應商專屬指紋 讀取器發生錯誤。

密碼學更新

Android 8.1 有幾項密碼編譯變更:

  • Conscrypt 中已實作新的演算法,神秘祕密 比起現有的 Bouncy Castle 。新的演算法包括:
    • 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) 否 則較差。而是改用 getParameterSpec(GCMParameterSpec.class)
  • 已重構許多與 TLS 相關的內部 Conscrypt 類別。開始時間 開發人員有時會反思,而填充輔助程式的作用 可支援先前的使用情形,但部分詳細資料已變更。例如通訊端 先前是 OpenSSLSocketImpl 類型,但現在屬於類型 ConscryptFileDescriptorSocketConscryptEngineSocket,兩者都擴充至 OpenSSLSocketImpl
  • 用於擲回 SSLSession 方法 當傳遞空值參照時 IllegalArgumentException,它們現在 擲回 NullPointerException
  • RSA KeyFactory 不再允許產生金鑰 大於編碼鍵的位元組陣列。通話對象 「generatePrivate()」和 提供generatePublic() KeySpec,其中金鑰結構未填滿 整個緩衝區都會產生 InvalidKeySpecException
  • 當通訊端關閉通訊端而造成通訊端讀取中斷時,系統會使用 Conscrypt 從讀取作業傳回 -1。讀取作業現在擲回 SocketException
  • 變更一組根 CA 憑證,主要憑證已移除 但同時移除了過時憑證的根憑證 WoSign 和 StartCom。如要進一步瞭解這項決定,請參閱 安全性網誌文章 最終 移除 WoSign 和 StartCom 憑證的信任