Android 8.1 (API 級別 27) 為使用者和開發人員推出多種新功能和能力。本文件將重點介紹開發人員適用的新功能,
Android Oreo (Go 版本)
Android Go 是我們推出的計畫,旨在為全球數十億使用者提供最佳 Android 體驗。從 Android 8.1 開始,我們將 Android 打造為入門級裝置的絕佳平台。Android Oreo (Go 版本) 設定中的功能包括:
- 記憶體最佳化。改善各平台的記憶體用量,確保應用程式能在 RAM 為 1 GB 以下的裝置上順暢執行。
- 彈性指定目標選項新的硬體功能常數,可讓您透過 Google Play 將應用程式指定發布至一般或低 RAM 裝置。
- Google Play:所有應用程式都能在搭載 Android Oreo 的裝置上提供 (Go 版本)),Google Play 會呈現專為開發人員最佳化的應用程式 為數十億名使用者提供優質服務 規範。
我們為數十億名使用者更新了建築 指南,並提供更多 針對執行式裝置的裝置最佳化應用程式 Android Oreo (Go 版本)。對於大多數開發人員而言,針對搭載 Android Oreo (Go 版本) 的裝置進行最佳化,或是使用 Google Play 的多重 APK 功能,將 APK 版本指定給低 RAM 裝置,是最佳的準備方式。提醒您,製作 應用程式 輕而易舉則能滿足整個目標對象的各種需求。
Neural Networks API
Neural Networks API 可為裝置端機器提供加速運算和推論 例如 TensorFlow Lite:Google 的跨平台行動裝置機器學習程式庫, 和 Caffe2 等等造訪 TensorFlow Lite 開放原始碼 存放區。 TensorFlow Lite 搭配 Neural Networks API,可執行 MobileNets、 Inception v3, 和 在行動裝置上有效率地回覆。
自動填入架構更新
Android 8.1 (API 級別 27) 針對自動填入架構提供多項改善功能,可供您整合至應用程式。
BaseAdapter
類別現在包含 setAutofillOptions()
方法,可讓您在轉接程式中提供值的字串表示法。這對於Spinner 控制項而言十分實用,因為這些控制項會在其轉接器中動態產生值。例如:
您可以使用 setAutofillOptions()
方法提供字串
使用者可選擇的年數清單
信用卡到期日。自動填入服務可使用字串表示法,適當填寫需要資料的檢視畫面。
此外,AutofillManager
類別包含 notifyViewVisibilityChanged(View, int, boolean)
方法
您可用來呼叫
以虛擬結構的形式顯示畫面此外,我們也對
虛擬結構體系不過,非虛擬架構通常不需要
明確通知架構,因為
View
類別
Android 8.1 也讓自動填入服務更能自訂儲存 UI 可用性,方法是新增對 SaveInfo
內 CustomDescription
and
Validator
的支援。
自訂說明可協助自動填入服務釐清要儲存的內容,例如當畫面含有信用卡時,可以顯示信用卡銀行的標誌、信用卡號碼末四碼和到期日。詳情請參閱
CustomDescription
類別
Validator
物件用於避免在驗證工具時顯示自動填入儲存 UI
不符合條件如需更多資訊,請參閱 Validator 類別及其子類別 LuhnChecksumValidator 和 RegexValidator。
通知
Android 8.1 對通知做出了以下變更:
- 應用程式現在每秒只能發出一次通知警示音效。超過這個速率的快訊音效不會排入佇列,而是會遺失。這項異動不會影響通知行為的其他層面,通知訊息仍會如預期發布。
-
NotificationListenerService
和ConditionProviderService
不支援在低 RAM 的 Android 裝置上執行,因為這些裝置在呼叫ActivityManager.isLowRamDevice()
時會傳回true
。
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:valu>e=&qu<ot;true">;< / /a>pplication /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
API。這個類別可讓您建立、對應及管理匿名 SharedMemory
例項。您可以在 SharedMemory
物件上設定記憶體保護功能,以便讀取和/或寫入資料。由於 SharedMemory
物件是可分割的,因此您可以輕鬆透過 AIDL 將其傳遞至其他程序。
SharedMemory
API 會與
NDK 的 ASharedMemory
設施。
「ASharedMemory
」授予存取權
附加至檔案描述元,可對應至讀取及寫入。太棒了
傳輸大量資料的方法
或單一應用程式內多個程序之間的資料。
WallpaperColors API
Android 8.1 (API 級別 27) 允許動態桌布提供色彩
將資訊傳送至系統 UI您可以透過從點陣圖、可繪項目建立 WallpaperColors
物件,或使用三種手動選取的顏色來完成這項操作。您也可以擷取這項色彩資訊。
如何建立 WallpaperColors
物件,請執行下列任一操作:
- 如要使用三種顏色建立
WallpaperColors
物件,請傳遞主要、次要和三次色,建立WallpaperColors
類別的例項。主要顏色不得為空值。 - 如何建立
WallpaperColors
物件,呼叫fromBitmap()
方法。 - 如何建立
WallpaperColors
物件,呼叫fromDrawable()
方法將可繪項目來源做為參數傳遞。
如要從桌布擷取主要、次要或三次色詳細資料,請呼叫下列方法:
getPrimaryColor()
傳回具代表性的桌布色彩。getSecondaryColor()
會傳回桌布的第二個最主要顏色。getTertiaryColor()
方法會傳回桌布的第三大色彩。
如要讓動態桌布有重大色彩變更,系統會通知系統,
呼叫 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
類型,但現在屬於類型ConscryptFileDescriptorSocket
或ConscryptEngineSocket
,兩者都擴充至OpenSSLSocketImpl
。 SSLSession
方法在傳遞空參照時會擲回IllegalArgumentException
,但現在會擲回NullPointerException
。- RSA
KeyFactory
不再允許從大於經過編碼金鑰的位元組陣列產生金鑰。對generatePrivate()
和generatePublic()
的呼叫會提供KeySpec
,其中索引鍵結構不會填滿整個緩衝區,這會導致InvalidKeySpecException
。 - 當 Socket 讀取作業因 Socket 關閉而中斷時,Conscrypt 會從讀取作業傳回 -1。讀取作業現在擲回
SocketException
。 - 根 CA 憑證組合已變更,主要移除了大量過時的憑證,但也移除了 WoSign 和 StartCom 的根憑證。如要進一步瞭解這項決定,請參閱 Google 安全性網誌文章「最終移除對 WoSign 和 StartCom 憑證的信任」。