Android9功能和API

原文:https://developer.android.com/about/versions/pie/android-9.0

Android 9(API級(jí)別28)為用戶和開發(fā)者引入了眾多新特性和新功能糙箍。本文重點(diǎn)介紹面向開發(fā)者的新功能田轧。

要了解新API,請(qǐng)閱讀 API差異報(bào)告或訪問 Android API參考洪燥。請(qǐng)務(wù)必查閱 Android9行為變更以了解平臺(tái)變更可能對(duì)應(yīng)用產(chǎn)生影響的各個(gè)方面疗绣。

利用Wi-Fi RTT進(jìn)行室內(nèi)定位

Android 9增加了對(duì)IEEE 802.11mc Wi-Fi協(xié)議(也稱為Wi-Fi往返時(shí)間(RTT))的平臺(tái)支持详拙,從而讓您的應(yīng)用可以利用室內(nèi)定位功能奸腺。

在運(yùn)行 Android 9 且具有硬件支持的設(shè)備上师妙,應(yīng)用可以使用 RTT API來(lái)測(cè)量與附近支持 RTT 的 Wi-Fi 接入點(diǎn) (AP) 的距離。 設(shè)備必須已啟用位置服務(wù)并開啟 Wi-Fi 掃描(在 Settings > Location 下)镀虐,同時(shí)您的應(yīng)用必須具有 ACCESS_FINE_LOCATION 權(quán)限箱蟆。

設(shè)備無(wú)需連接到接入點(diǎn)即可使用 RTT。 為了保護(hù)隱私刮便,只有手機(jī)可以確定與接入點(diǎn)的距離空猜;接入點(diǎn)無(wú)此信息。

如果您的設(shè)備測(cè)量與 3 個(gè)或更多接入點(diǎn)的距離恨旱,您可以使用一個(gè)多點(diǎn)定位算法來(lái)預(yù)估與這些測(cè)量值最相符的設(shè)備位置辈毯。 結(jié)果通常精準(zhǔn)至 1 至 2 米。

通過這種精確性搜贤,您可以打造新的體驗(yàn)谆沃,例如樓內(nèi)導(dǎo)航、基于精細(xì)位置的服務(wù)仪芒,如無(wú)歧義語(yǔ)音控制(例如唁影,“打開這盞燈”),以及基于位置的信息(如 “此產(chǎn)品是否有特別優(yōu)惠掂名?”)据沈。

有關(guān)更多信息,請(qǐng)參閱 Wi-Fi位置:使用RTT進(jìn)行測(cè)距饺蔑。

新的RTT API支持您的應(yīng)用中的室內(nèi)定位锌介。

顯示屏缺口支持

Android 9 支持最新的全面屏,其中包含為攝像頭和揚(yáng)聲器預(yù)留空間的屏幕缺口猾警。 通過 DisplayCutout 類可確定非功能區(qū)域的位置和形狀孔祸,這些區(qū)域不應(yīng)顯示內(nèi)容。 要確定這些屏幕缺口區(qū)域是否存在及其位置肿嘲,請(qǐng)使用 getDisplayCutout() 函數(shù)。

全新的窗口布局屬性 layoutInDisplayCutoutMode 讓您的應(yīng)用可以為設(shè)備屏幕缺口周圍的內(nèi)容進(jìn)行布局筑公。 您可以將此屬性設(shè)為下列值之一:

可以按以下方法在任何運(yùn)行 Android 9 的設(shè)備或模擬器上模擬屏幕缺口:

  1. 啟用開發(fā)者選項(xiàng)雳窟。
  2. Developer options 屏幕中,向下滾動(dòng)至 Drawing 部分并選擇 Simulate a display with a cutout匣屡。
  3. 選擇屏幕缺口的大小封救。

注:我們建議您通過使用運(yùn)行 Android 9 的設(shè)備或模擬器測(cè)試屏幕缺口周圍的內(nèi)容顯示。

通過使用模擬器測(cè)試屏幕缺口

通知

Android 9 引入了多個(gè)通知增強(qiáng)功能捣作,可供以 API 級(jí)別 28 及以上版本作為目標(biāo)平臺(tái)的開發(fā)者使用誉结。

提升短信體驗(yàn)

從 Android 7.0(API 級(jí)別 24)開始,您可以添加一個(gè)操作以回復(fù)短信或直接從通知中輸入其他文本券躁。 Android 9 通過下列增強(qiáng)提升了該功能:

  • 簡(jiǎn)化了針對(duì)對(duì)話參與者的支持:Person 類可用于識(shí)別參與對(duì)話的人員惩坑,包括他們的頭像和 URI掉盅。 現(xiàn)在,許多其他 API(如 addMessage())均可利用 [Person] 類而不是 CharSequence以舒。Person 類也支持構(gòu)建器設(shè)計(jì)模式趾痘。

  • 支持圖像:現(xiàn)在,Android 9 可在手機(jī)的“短信通知”中顯示圖像蔓钟。 您可以使用對(duì)短信使用 setData()來(lái)顯示圖像永票。 以下代碼段演示了如何創(chuàng)建 Person 和包含圖像的短信。

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • 將回復(fù)另存為草稿:當(dāng)用戶無(wú)意中關(guān)閉一個(gè)短信通知時(shí)滥沫,您的應(yīng)用可以檢索系統(tǒng)發(fā)送的 EXTRA_REMOTE_INPUT_DRAFT侣集。 您可以使用此 extra 預(yù)填充應(yīng)用中的文本字段,以便用戶可以完成他們的回復(fù)兰绣。

  • 確定對(duì)話是否為群組對(duì)話世分。您可以使用 setGroupConversation() 以明確確定對(duì)話是否為群組對(duì)話。

  • 為 Intent 設(shè)置語(yǔ)義操作:setSemanticAction() 函數(shù)允許您為操作提供語(yǔ)義含義狭魂,如“標(biāo)記為已讀”罚攀、“刪除”和“回復(fù)”等。

  • SmartReply:Android 9 支持在您的短信應(yīng)用中提供相同的建議回復(fù)雌澄。 使用 RemoteInput.setChoices() 為用戶提供一組標(biāo)準(zhǔn)回復(fù)斋泄。

附帶了照片的 MessagingStyle
MessagingStyle與回復(fù)和對(duì)話

渠道設(shè)置、廣播和請(qǐng)勿打擾

Android 8.0 引入了通知渠道镐牺,允許您為要顯示的每種通知類型創(chuàng)建可由用戶自定義的渠道炫掐。 Android 9 通過下列變更簡(jiǎn)化通知渠道設(shè)置:

  • 屏蔽渠道組:現(xiàn)在,用戶可以針對(duì)某個(gè)應(yīng)用在通知設(shè)置中屏蔽整個(gè)渠道組睬涧。 您可以使用 isBlocked() 函數(shù)確定何時(shí)屏蔽一個(gè)渠道組募胃,從而不會(huì)向該組中的渠道發(fā)送任何通知。

    此外畦浓,您的應(yīng)用可以使用全新的 getNotificationChannelGroup() 函數(shù)查詢當(dāng)前渠道組設(shè)置痹束。

  • 全新的廣播 Intent 類型:現(xiàn)在,當(dāng)通知渠道和渠道組的屏蔽狀態(tài)發(fā)生變更時(shí)讶请,Android 系統(tǒng)將發(fā)送廣播 Intent祷嘶。 擁有已屏蔽的渠道或渠道組的應(yīng)用可以偵聽這些 Intent 并做出相應(yīng)的回應(yīng)。 有關(guān)這些 Intent 操作和 extra 的更多信息夺溢,請(qǐng)參閱 NotificationManager 參考中更新的常量列表论巍。 有關(guān)響應(yīng)廣播 Intent 的信息,請(qǐng)參閱廣播风响。

  • NotificationManager.Policy 有 3 種新的“請(qǐng)勿打擾”優(yōu)先級(jí)類別:

  • NotificationManager.Policy 還有 7 種新的“請(qǐng)勿打擾”常量双泪,可以用來(lái)抑制視覺中斷:

多攝像頭支持和攝像頭更新

在運(yùn)行 Android 9 的設(shè)備上,您可以通過兩個(gè)或更多物理攝像頭來(lái)同時(shí)訪問多個(gè)視頻流邑滨。] 在配備雙前置攝像頭或雙后置攝像頭的設(shè)備上日缨,您可以創(chuàng)建只配備單攝像頭的設(shè)備所不可能實(shí)現(xiàn)的創(chuàng)新功能,例如無(wú)縫縮放掖看、背景虛化和立體成像匣距。 通過該 API,您還可以調(diào)用邏輯或融合的攝像頭視頻流哎壳,該視頻流可在兩個(gè)或更多攝像頭之間自動(dòng)切換毅待。

攝像頭方面的其他改進(jìn)還包括附加會(huì)話參數(shù)和 Surface 共享,前者有助于降低首次拍照期間的延遲归榕,而后者則讓攝像頭客戶端能夠處理各種用例尸红,而無(wú)需停止并啟動(dòng)攝像頭視頻流。 我們還針對(duì)基于顯示屏的 flash 支持OIS 時(shí)間戳訪問新增了一些 API刹泄,用以實(shí)現(xiàn)應(yīng)用級(jí)的圖像穩(wěn)定化和特效外里。

在 Android 9 中,多攝像頭 API支持單色攝像頭特石,適用于具有 [FULL](https://developer.android.google.cn/reference/android/hardware/camera2/CameraMetadata.html#INFO_SUPPORTED_HARDWARE_LEVEL_FULL)[LIMITED](https://developer.android.google.cn/reference/android/hardware/camera2/CameraMetadata.html#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED) 功能的設(shè)備盅蝗。 單色輸出通過 [YUV_420_888](https://developer.android.google.cn/reference/android/graphics/ImageFormat.html#YUV_420_888)格式實(shí)現(xiàn),Y 為灰度姆蘸,U (Cb) 為 128墩莫,V (Cr) 為 128。

在受支持的設(shè)備上乞旦,Android 9 還支持外置 USB/UVC 攝像頭贼穆。

適用于可繪制對(duì)象和位圖的 ImageDecoder

Android 9 引入了 ImageDecoder 類题山,可提供現(xiàn)代化的圖像解碼方法兰粉。 使用該類取代 BitmapFactoryBitmapFactory.Options API。

ImageDecoder 讓您可通過字節(jié)緩沖區(qū)顶瞳、文件或 URI 來(lái)創(chuàng)建 DrawableBitmap玖姑。 要解碼圖像愕秫,請(qǐng)首先以編碼圖像的來(lái)源為參數(shù),調(diào)用 createSource()焰络。 然后戴甩,通過傳遞 ImageDecoder.Source 對(duì)象來(lái)調(diào)用 decodeDrawable()decodeBitmap(),從而創(chuàng)建 Drawable] 或 Bitmap闪彼。 要更改默認(rèn)設(shè)置甜孤,請(qǐng)將 OnHeaderDecodedListener 傳遞給 decodeDrawable()decodeBitmap()ImageDecoder 調(diào)用 onHeaderDecoded()畏腕,以圖像的默認(rèn)寬度和高度(若已知)為參數(shù)缴川。 如果編碼圖像是動(dòng)畫 GIF 或 WebP,decodeDrawable() 將返回 Drawable描馅,它是 AnimatedImageDrawable類的一個(gè)實(shí)例把夸。

您可以使用不同的方法來(lái)設(shè)置圖像屬性:

  • 要將解碼的圖像縮放到精確尺寸,請(qǐng)將目標(biāo)尺寸傳遞給 setTargetSize()铭污。 您也可以使用樣圖尺寸來(lái)縮放圖像恋日。 將樣圖尺寸直接傳遞給 setTargetSampleSize()
  • 要在縮放圖像的范圍內(nèi)裁剪圖像嘹狞,請(qǐng)調(diào)用 setCrop()岂膳。
  • 要?jiǎng)?chuàng)建可變位圖,請(qǐng)將 true 傳遞給 setMutableRequired()刁绒。

通過 ImageDecoder 還可以為圓角或圓形遮罩之類的圖像添加復(fù)雜的定制效果闷营。 以 PostProcessor 類的一個(gè)實(shí)例作為參數(shù)使用 setPostProcessor(),執(zhí)行您所需的任何繪圖命令知市。

注:對(duì) AnimatedImageDrawable進(jìn)行后處理時(shí)傻盟,效果會(huì)出現(xiàn)在動(dòng)畫的所有幀中。

動(dòng)畫

Android 9 引入了 AnimatedImageDrawable 類嫂丙,用于繪制和顯示 GIF 和 WebP 動(dòng)畫圖像娘赴。 AnimatedImageDrawable 的工作方式與 AnimatedVectorDrawable 的相似之處在于,都是渲染線程驅(qū)動(dòng) AnimatedImageDrawable 的動(dòng)畫跟啤。 渲染線程還使用工作線程進(jìn)行解碼诽表,因此,解碼不會(huì)干擾渲染線程的其他操作隅肥。 這種實(shí)現(xiàn)機(jī)制允許您的應(yīng)用在顯示動(dòng)畫圖像時(shí)竿奏,無(wú)需管理其更新,也不會(huì)干擾應(yīng)用界面線程上的其他事件腥放。

可使用 ImageDecoder 的實(shí)例對(duì) AnimatedImageDrawable 進(jìn)行解碼泛啸。 以下代碼段演示如何使用 ImageDecoder 來(lái)解碼AnimatedImageDrawable

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder 有幾個(gè)允許您進(jìn)一步修改圖像的函數(shù)。 例如秃症,可使用 setPostProcessor() 函數(shù)來(lái)修改圖像的外觀候址,如應(yīng)用圓形遮罩或圓角吕粹。

HDR VP9 視頻、HEIF 圖像壓縮和 Media API

Android 9 新增了對(duì) High Dynamic Range (HDR) VP9 Profile 2 的內(nèi)置支持岗仑,因此匹耕,現(xiàn)在您可以在支持 HDR 的設(shè)備上為用戶提供來(lái)自 YouTube、Play Movies 和其他來(lái)源的采用 HDR 的影片荠雕。

Android 9 為平臺(tái)增加了對(duì) HEIF (heic) 圖像編碼的支持稳其。 MediaMuxerMediaExtractor 類中可支持 HEIF 靜態(tài)圖像示例 HEIF 改進(jìn)了壓縮,可節(jié)省存儲(chǔ)空間和網(wǎng)絡(luò)數(shù)據(jù)流量炸卑。 借助 Android 9 設(shè)備上的平臺(tái)支持欢际,從后端服務(wù)器發(fā)送和使用 HEIF 圖像輕而易舉。 確保應(yīng)用兼容這種便于共享和顯示的數(shù)據(jù)格式后矾兜,嘗試在應(yīng)用中使用 HEIF 作為圖像存儲(chǔ)格式损趋。 您可以使用 ImageDecoderBitmapFactory 進(jìn)行 jpeg 到 heicto 的轉(zhuǎn)換,以通過 jpeg 獲取位圖椅寺,并且可以使用 HeifWriter 寫入來(lái)自 YUV 字節(jié)緩沖區(qū)浑槽、Surface 或 Bitmap 的 HEIF 靜態(tài)圖像。

還可通過 AudioTrack返帕、AudioRecordMediaDrm 類獲取媒體指標(biāo)桐玻。

Android 9 向 MediaDRM 類添加了函數(shù)以獲取指標(biāo)、高帶寬數(shù)字內(nèi)容保護(hù) (HDCP) 級(jí)別荆萤、安全級(jí)別和會(huì)話數(shù)镊靴,并對(duì)安全性級(jí)別和安全停止進(jìn)行更多控制。 如需了解更多詳情链韭,請(qǐng)參閱 API 差異報(bào)告偏竟。

在 Android 9 中,AAudio API 包含 AAudioStream 屬性敞峭,用于 usage踊谋、content typeinput preset。 使用這些屬性可以創(chuàng)建針對(duì) VoIP 或攝像機(jī)應(yīng)用調(diào)整的流。 您還可以設(shè)置 SessionID將 AAudio 流與可包含音效的子混音相關(guān)聯(lián)。 使用 [AudioEffect API](https://developer.android.google.cn/reference/android/media/audiofx/AudioEffect.html) 來(lái)控制音效竹揍。

Android 9 包含一個(gè)用于 DynamicsProcessingAudioEffect API。 借助該類熏版,可以構(gòu)建基于通道的音效,由各種類型(包括均衡、多頻帶壓縮和限幅器)的多個(gè)階段組成。 頻帶和活動(dòng)階段的數(shù)量可配置蛤育,而且大多數(shù)參數(shù)可實(shí)時(shí)控制。

JobScheduler 中的流量費(fèi)用敏感度

從 Android 9 開始,JobScheduler 可以使用運(yùn)營(yíng)商提供的網(wǎng)絡(luò)狀態(tài)信號(hào)來(lái)改善與網(wǎng)絡(luò)有關(guān)的作業(yè)處理缨伊。

作業(yè)可以聲明其預(yù)估的數(shù)據(jù)大小、信號(hào)預(yù)提取进宝,并指定具體的網(wǎng)絡(luò)要求刻坊。 JobScheduler 然后根據(jù)網(wǎng)絡(luò)狀態(tài)管理工作。 例如党晋,當(dāng)網(wǎng)絡(luò)顯示擁塞時(shí)谭胚,JobScheduler 可能會(huì)延遲較大的網(wǎng)絡(luò)請(qǐng)求。 如果使用的是不按流量計(jì)費(fèi)的網(wǎng)絡(luò)未玻,則 JobScheduler 可運(yùn)行預(yù)提取作業(yè)以提升用戶體驗(yàn)(例如預(yù)提取標(biāo)題)灾而。

添加作業(yè)時(shí),確保使用 setEstimatedNetworkBytes()扳剿、setPrefetch()setRequiredNetwork()(如果適用)旁趟,以幫助 JobScheduler 正確處理工作。 在執(zhí)行作業(yè)時(shí)庇绽,請(qǐng)確保使用 JobParameters.getNetwork() 返回的 Network 對(duì)象锡搜。 否則,您將隱式使用設(shè)備的默認(rèn)網(wǎng)絡(luò)瞧掺,其可能不符合您的要求耕餐,從而導(dǎo)致意外的流量消耗。

Neural Networks API 1.1

Android 8.1(API 級(jí)別 27)中引入了 Neural Networks API 以加快 Android 設(shè)備上機(jī)器學(xué)習(xí)的速度辟狈。 Android 9 擴(kuò)展和改進(jìn)了該 API肠缔,增加了對(duì)九種新運(yùn)算的支持:

已知問題:[ANEURALNETWORKS_TENSOR_QUANT8_ASYMM](https://developer.android.google.cn/ndk/reference/group/neural-networks#group___neural_networks_1ggaf06d1affd33f3bc698d0c04eceb23298a07984961d5c7c12f0f8c811bedd85dc3) 張量傳遞到 [ANEURALNETWORKS_PAD](https://developer.android.google.cn/ndk/reference/group/neural-networks#group___neural_networks_1ggaabbe492c60331b13038e39d4207940e0aaced01fc41e401b81cefcf53780558d1) 運(yùn)算(在 Android 9 及更高版本中提供)時(shí),NNAPI 的輸出可能與較高級(jí)別機(jī)器學(xué)習(xí)框架(如 TensorFlow Lite)的輸出不匹配哼转。 應(yīng)只傳遞ANEURALNETWORKS_TENSOR_FLOAT32 直到問題得到解決明未。

此外,API 還引入了一個(gè)新函數(shù)壹蔓,即 ANeuralNetworksModel_relaxComputationFloat32toFloat16()亚隅,允許您指定是否計(jì)算范圍和精度低至 IEEE 754 16 位浮點(diǎn)格式的 ANEURALNETWORKS_TENSOR_FLOAT32

自動(dòng)填充框架

Android 9 引入了多項(xiàng)改進(jìn)庶溶,自動(dòng)填充服務(wù)可以利用這些改進(jìn)進(jìn)一步增強(qiáng)用戶填寫表單時(shí)的體驗(yàn)煮纵。 如需詳細(xì)了解如何在您的應(yīng)用中使用自動(dòng)填充功能,請(qǐng)參閱自動(dòng)填充框架指南偏螺。

安全增強(qiáng)功能

Android 9 引入了若干安全功能行疏,詳見以下各節(jié)摘要說(shuō)明:

Android Protected Confirmation

運(yùn)行 Android 9 或更高版本的受支持設(shè)備賦予您使用 Android Protected Confirmation 的能力。 使用該工作流時(shí)套像,您的應(yīng)用會(huì)向用戶顯示提示酿联,請(qǐng)他們批準(zhǔn)一個(gè)簡(jiǎn)短的聲明。 應(yīng)用可以通過這個(gè)聲明再次確認(rèn),用戶確實(shí)想完成一項(xiàng)敏感事務(wù)贞让,例如付款周崭。

如果用戶接受該聲明,Android 密鑰庫(kù)會(huì)收到并存儲(chǔ)由密鑰哈希消息身份驗(yàn)證代碼 (HMAC) 保護(hù)的加密簽名喳张。 Android 密鑰庫(kù)確認(rèn)消息的有效性之后续镇,您的應(yīng)用可以使用在可信執(zhí)行環(huán)境 (TEE) 下通過 trustedConfirmationRequired 生成的密鑰來(lái)簽署用戶已接受的消息。 該簽名具有很高的可信度销部,它表示用戶已看過聲明并同意其內(nèi)容摸航。

注意:Android Protected Confirmation 不會(huì)為用戶提供安全信息通道。 應(yīng)用無(wú)法承擔(dān) Android 平臺(tái)所提供機(jī)密性保證之外的任何其他保證舅桩。 尤其是酱虎,請(qǐng)勿使用該工作流顯示您通常不會(huì)顯示在用戶設(shè)備上的敏感信息。

如需獲得 Android Protected Confirmation 新增支持方面的指導(dǎo)擂涛,請(qǐng)參閱 Android Protected Confirmation 指南读串。

統(tǒng)一生物識(shí)別身份驗(yàn)證對(duì)話框

在 Android 9 中,系統(tǒng)代表您的應(yīng)用提供生物識(shí)別身份驗(yàn)證對(duì)話框撒妈。 該功能可創(chuàng)建標(biāo)準(zhǔn)化的對(duì)話框外觀爹土、風(fēng)格和位置,讓用戶更加確信踩身,他們?cè)谑褂每尚诺纳镒R(shí)別憑據(jù)檢查程序進(jìn)行身份驗(yàn)證胀茵。

如果您的應(yīng)用使用 FingerprintManager 向用戶顯示指紋身份驗(yàn)證對(duì)話框,請(qǐng)切換到改用 BiometricPrompt挟阻。BiometricPrompt 依賴系統(tǒng)來(lái)顯示身份驗(yàn)證對(duì)話框琼娘。 它還會(huì)改變其行為,以適應(yīng)用戶所選擇的生物識(shí)別身份驗(yàn)證類型附鸽。

注:在應(yīng)用中使用 BiometricPrompt 之前脱拼,應(yīng)該先使用 hasSystemFeature()函數(shù)以確保設(shè)備支持 FEATURE_FINGERPRINTFEATURE_IRISFEATURE_FACE坷备。

如果設(shè)備不支持生物識(shí)別身份驗(yàn)證熄浓,可以回退為使用 createConfirmDeviceCredentialIntent() 函數(shù)驗(yàn)證用戶的 PIN 碼、圖案或密碼省撑。

硬件安全性模塊

運(yùn)行 Android 9 或更高版本的受支持設(shè)備可擁有 StrongBox Keymaster赌蔑,它是位于硬件安全性模塊中的 Keymaster HAL 的一種實(shí)現(xiàn)。 該模塊包含以下組成部分:

  • 自己的 CPU竟秫。
  • 安全存儲(chǔ)空間娃惯。
  • 真實(shí)隨機(jī)數(shù)生成器。
  • 可抵御軟件包篡改和未經(jīng)授權(quán)線刷應(yīng)用的附加機(jī)制肥败。

檢查存儲(chǔ)在 StrongBox Keymaster 中的密鑰時(shí)趾浅,系統(tǒng)會(huì)通過可信執(zhí)行環(huán)境 (TEE) 證實(shí)密鑰的完整性愕提。

如需了解有關(guān)使用 Strongbox Keymaster 的更多信息,請(qǐng)參閱硬件安全性模塊皿哨。

保護(hù)對(duì)密鑰庫(kù)進(jìn)行的密鑰導(dǎo)入

Android 9 通過利用 ASN.1?編碼密鑰格式將已加密密鑰安全導(dǎo)入密鑰庫(kù)的功能浅侨,提高了密鑰解密的安全性。 Keymaster 隨后會(huì)在密鑰庫(kù)中將密鑰解密证膨,因此密鑰的內(nèi)容永遠(yuǎn)不會(huì)以明文形式出現(xiàn)在設(shè)備的主機(jī)內(nèi)存中如输。

注:只有附帶 Keymaster 4 或更高版本的設(shè)備才支持該功能。

詳細(xì)了解如何更安全地導(dǎo)入已加密密鑰椎例。

具有密鑰輪轉(zhuǎn)的 APK 簽名方案

Android 9 新增了對(duì) APK Signature Scheme v3 的支持。該架構(gòu)提供的選擇可以在其簽名塊中為每個(gè)簽名證書加入一條輪轉(zhuǎn)證據(jù)記錄请祖。 利用此功能订歪,應(yīng)用可以通過將 APK 文件過去的簽名證書鏈接到現(xiàn)在簽署應(yīng)用時(shí)使用的證書,從而使用新簽名證書來(lái)簽署應(yīng)用肆捕。

注:運(yùn)行 Android 8.1(API 級(jí)別 27)或更低版本的設(shè)備不支持更改簽名證書刷晋。 如果應(yīng)用的 minSdkVersion27 或更低,除了新簽名之外慎陵,可使用舊簽名證書來(lái)簽署應(yīng)用眼虱。

詳細(xì)了解如何使用 apksigner 輪轉(zhuǎn)密鑰。

只允許在未鎖定設(shè)備上進(jìn)行密鑰解密的選項(xiàng)

Android 9 引入了 unlockedDeviceRequired 標(biāo)志席纽。 此選項(xiàng)確定在允許使用指定密鑰對(duì)任何正在傳輸或存儲(chǔ)的數(shù)據(jù)進(jìn)行解密之前捏悬,密鑰庫(kù)是否要求屏幕解鎖。 這些類型的密鑰非常適合用于加密要存儲(chǔ)在磁盤上的敏感數(shù)據(jù)润梯,例如健康或企業(yè)數(shù)據(jù)过牙。 該標(biāo)志為用戶提供了更高的保證,即使手機(jī)丟失或被盜纺铭,在設(shè)備鎖定的情況下寇钉,無(wú)法對(duì)數(shù)據(jù)進(jìn)行解密。

注:unlockedDeviceRequired 標(biāo)志啟用之后舶赔,仍然可以隨時(shí)進(jìn)行加密和簽名驗(yàn)證扫倡。 該標(biāo)志可防止在設(shè)備解鎖時(shí)“僅解密”數(shù)據(jù)。

在設(shè)備鎖定時(shí)要確保密鑰安全不被解密竟纳,可通過將 true 傳遞給 setUnlockedDeviceRequired() 函數(shù)啟用該標(biāo)志撵溃。 完成該步驟之后,當(dāng)用戶的屏幕被鎖定時(shí)锥累,使用該密鑰進(jìn)行解密或簽署數(shù)據(jù)的任何嘗試都會(huì)失敗征懈。 鎖定設(shè)備在可以訪問之前,需要 PIN 碼揩悄、密碼卖哎、指紋或者一些其他可信因素。

舊版加密支持

附帶 Keymaster 4 的 Android 9 設(shè)備支持三重?cái)?shù)據(jù)加密算法(簡(jiǎn)稱三重 DES)。 如果您的應(yīng)用與需要三重 DES 的舊版系統(tǒng)進(jìn)行互操作亏娜,請(qǐng)使用這種加密來(lái)加密敏感憑據(jù)焕窝。

如需詳細(xì)了解如何讓您的應(yīng)用更加安全,請(qǐng)參閱 Android 開發(fā)者的安全性维贺。

Android 備份

Android 9 新增了與備份和還原有關(guān)的功能和開發(fā)者選項(xiàng)它掂。 這些更改的詳細(xì)信息如以部分下所示。

客戶端加密備份

Android 9 新增了對(duì)使用客戶端密鑰加密 Android 備份的支持溯泣。 滿足下列條件時(shí)會(huì)自動(dòng)啟用該支持功能:

該隱私措施啟用之后,從用戶設(shè)備制作的備份還原數(shù)據(jù)時(shí)肢簿,會(huì)要求提供設(shè)備的 PIN 碼靶剑、圖案或密碼。 如需詳細(xì)了解該項(xiàng)功能背后的技術(shù)池充,請(qǐng)參閱 Google 云密鑰保險(xiǎn)柜服務(wù)白皮書桩引。

定義備份所需的設(shè)備條件

如果您的應(yīng)用數(shù)據(jù)包含敏感信息或偏好,Android 9 可讓您定義設(shè)備條件(例如在客戶端加密已啟用或者正在進(jìn)行本地設(shè)備到設(shè)備傳輸時(shí))收夸,數(shù)據(jù)將依據(jù)該條件包括在用戶的備份中坑匠。

如需了解有關(guān)在 Android 設(shè)備上備份數(shù)據(jù)的詳細(xì)信息,請(qǐng)參閱數(shù)據(jù)備份概覽卧惜。

無(wú)障礙功能

Android 9 引入了針對(duì)無(wú)障礙功能框架的增強(qiáng)功能笛辟,讓您能夠更輕松地為應(yīng)用的用戶提供更好的體驗(yàn)。

導(dǎo)航語(yǔ)義

Android 9 中的新增屬性讓您可以更輕松地定義無(wú)障礙服務(wù)(尤其是屏幕閱讀器)如何從屏幕的某個(gè)部分導(dǎo)航到另一個(gè)部分序苏。 這些屬性可幫助視力受損用戶在應(yīng)用界面的文本之間快速移動(dòng)手幢,并允許他們進(jìn)行選擇。

例如忱详,在購(gòu)物應(yīng)用中围来,屏幕閱讀器可以幫助用戶從某個(gè)交易類別直接導(dǎo)航至下一個(gè)交易類別,在轉(zhuǎn)到下一個(gè)類別之前匈睁,屏幕閱讀器無(wú)需讀取當(dāng)前類別中的所有交易监透。

無(wú)障礙功能窗格標(biāo)題

在 Android 8.1(API 級(jí)別 27)和更低版本中,無(wú)障礙服務(wù)有時(shí)無(wú)法確定屏幕的某個(gè)窗格是何時(shí)更新的航唆,例如某個(gè) Activity 將一個(gè) Fragment 替換為另一個(gè) Fragment 的時(shí)候胀蛮。 窗格由按照邏輯關(guān)系分組、視覺上相關(guān)的界面元素組成糯钙,其中通常包含一個(gè) Fragment粪狼。

在 Android 9 中退腥,可為這些窗格提供 無(wú)障礙功能窗格標(biāo)題,即可單獨(dú)識(shí)別的標(biāo)題再榄。 如果某個(gè)窗格具有無(wú)障礙功能窗格標(biāo)題狡刘,當(dāng)窗格改變時(shí),無(wú)障礙服務(wù)可接收更詳細(xì)的信息困鸥。 依靠這種功能嗅蔬,服務(wù)可以為用戶提供有關(guān)界面變化的更精細(xì)信息。

要指定某個(gè)窗格的標(biāo)題疾就,請(qǐng)使用 android:accessibilityPaneTitle 屬性澜术。 您也可以更新在運(yùn)行時(shí)使用 setAccessibilityPaneTitle() 替換的某個(gè)界面窗格的標(biāo)題。 例如猬腰,您可以為某個(gè) Fragment 對(duì)象的內(nèi)容區(qū)域提供標(biāo)題鸟废。

基于標(biāo)題的導(dǎo)航

如果您的應(yīng)用顯示的文本內(nèi)容包含邏輯標(biāo)題,則對(duì)于表示這些標(biāo)題的 View 實(shí)例漆诽,請(qǐng)將 android:accessibilityHeading屬性設(shè)置為 true侮攀。 通過添加這些標(biāo)題锣枝,無(wú)障礙服務(wù)可幫助用戶直接從一個(gè)標(biāo)題導(dǎo)航至下一個(gè)標(biāo)題厢拭。 任何無(wú)障礙服務(wù)都可以使用這種功能,以改善用戶界面的導(dǎo)航體驗(yàn)撇叁。

群組導(dǎo)航和輸出

傳統(tǒng)上供鸠,屏幕閱讀器一直使用 android:focusable 屬性來(lái)確定何時(shí)應(yīng)該將 ViewGroup 或一系列 View 對(duì)象作為一個(gè)整體進(jìn)行讀取。 這樣陨闹,用戶就可以了解楞捂,這些視圖在邏輯上彼此相關(guān)。

在 Android 8.1 和更低版本中趋厉,您需要將 ViewGroup 中的每個(gè) View 對(duì)象標(biāo)記為不可聚焦寨闹,并將 ViewGroup 本身標(biāo)記為可聚焦。 這種安排導(dǎo)致 View 的某些實(shí)例被標(biāo)記為可聚焦君账,從而使得鍵盤導(dǎo)航變得更為繁瑣繁堡。

從 Android 9 開始,如果將 View 對(duì)象標(biāo)記為可聚焦會(huì)產(chǎn)生不良后果乡数,則可以使用 android:screenReaderFocusable 屬性代替 android:focusable 屬性椭蹄。 屏幕閱讀器聚焦在所有將 android:screenReaderFocusableandroid:focusable 設(shè)置為 true 的元素上。

便捷操作

Android 9 新增了一些方便用戶執(zhí)行操作的支持功能:

訪問提示: 無(wú)障礙功能框架中的新增功能可讓您在應(yīng)用界面中訪問提示净赴。 使用 getTooltipText() 讀取提示文本绳矩,使用 ACTION_SHOW_TOOLTIPACTION_HIDE_TOOLTIP 來(lái)指示 View 的實(shí)例顯示或隱藏提示。

新增全局操作: Android 9 在 AccessibilityService 類中引入了對(duì)兩個(gè)額外設(shè)備操作的支持玖翅。 您的 Service 可以幫助用戶分別使用 GLOBAL_ACTION_LOCK_SCREENGLOBAL_ACTION_TAKE_SCREENSHOT 操作鎖定其設(shè)備并進(jìn)行屏幕截圖翼馆。

窗口變更詳情

Android 9 讓您可以在應(yīng)用同時(shí)重繪多個(gè)窗口時(shí)割以,更輕松地跟蹤應(yīng)用窗口的更新。 當(dāng)發(fā)生 TYPE_WINDOWS_CHANGED 事件時(shí)写妥,可使用 getWindowChanges() API 來(lái)確定窗口發(fā)生的變更拳球。 在多窗口更新期間,每個(gè)窗口都會(huì)生成自己的一組事件珍特。getSource() 函數(shù)返回與每個(gè)事件相關(guān)聯(lián)的窗口的根視圖祝峻。

如果應(yīng)用已為其 View 對(duì)象定義無(wú)障礙功能窗格標(biāo)題,您的 Service 將可以識(shí)別應(yīng)用界面何時(shí)進(jìn)行更新扎筒。TYPE_WINDOW_STATE_CHANGED 事件發(fā)生時(shí)莱找,可使用 getContentChangeTypes() 所返回的類型來(lái)確定窗口發(fā)生的變更。 例如嗜桌,框架可以檢測(cè)窗格何時(shí)有新標(biāo)題或者窗格何時(shí)消失奥溺。

Google 致力于為所有 Android 用戶改善無(wú)障礙功能,提供增強(qiáng)功能以便讓您構(gòu)建 Service骨宠,如話語(yǔ)提示 屏幕閱讀器浮定,供需要無(wú)障礙功能的用戶使用。 如需了解有關(guān)如何讓您的應(yīng)用更便于訪問以及如何構(gòu)建無(wú)障礙 Service 的更多信息层亿,請(qǐng)參閱無(wú)障礙功能桦卒。

旋轉(zhuǎn)

為避免無(wú)意的旋轉(zhuǎn),我們新增了一種模式匿又,哪怕設(shè)備位置發(fā)生變化方灾,也會(huì)固定在當(dāng)前屏幕方向上。 必要時(shí)用戶可以通過按系統(tǒng)欄上的一個(gè)按鈕手動(dòng)觸發(fā)旋轉(zhuǎn)碌更。

大多數(shù)情況下裕偿,對(duì)應(yīng)用的兼容性影響微不足道。 不過痛单,如果您的應(yīng)用有任何自定義旋轉(zhuǎn)行為嘿棘,或使用了任何非常規(guī)的屏幕方向設(shè)置,則可能會(huì)遇到以前用戶旋轉(zhuǎn)首選項(xiàng)始終設(shè)置為縱向時(shí)被忽視的問題旭绒。 我們鼓勵(lì)您審視一下您的應(yīng)用所有關(guān)鍵 Activity 中的旋轉(zhuǎn)行為鸟妙,并確保您的所有屏幕方向設(shè)置仍可提供最佳體驗(yàn)。

如需了解更多詳情快压,請(qǐng)參閱相關(guān)的行為變更圆仔。

一個(gè)新的旋轉(zhuǎn)模式允許用戶在必要時(shí)利用系統(tǒng)欄上的一個(gè)按鈕手動(dòng)觸發(fā)旋轉(zhuǎn)

文本

Android 9 為平臺(tái)提供了以下與文本相關(guān)的功能:

  • 文本預(yù)先計(jì)算:PrecomputedText 類使您能提前計(jì)算和緩存所需信息,改善了文本渲染性能蔫劣。 它還使您的應(yīng)用可以在主線程之外執(zhí)行文本布局坪郭。

  • 放大器:Magnifier 類是一種可提供放大器 API 的微件,可在所有應(yīng)用中實(shí)現(xiàn)一致的放大器功能體驗(yàn)脉幢。

  • Smart Linkify:Android 9 增強(qiáng)了 TextClassifier 類歪沃,該類可利用機(jī)器學(xué)習(xí)在選定文本中識(shí)別一些實(shí)體并建議采取相應(yīng)的操作嗦锐。 例如,TextClassifier 可以讓您的應(yīng)用檢測(cè)到用戶選擇了電話號(hào)碼沪曙。 然后奕污,您的應(yīng)用可以建議用戶使用該號(hào)碼撥打電話。 TextClassifier 中的功能取代了 Linkify 類的功能液走。

  • 文本布局:借助幾種便捷函數(shù)和屬性碳默,可以更輕松地實(shí)現(xiàn)界面設(shè)計(jì)。 如需了解詳細(xì)信息缘眶,請(qǐng)參閱 TextView 參考文檔嘱根。

DEX 文件的 ART 提前轉(zhuǎn)換

在運(yùn)行 Android 9 或更高版本的設(shè)備上,Android 運(yùn)行時(shí) (ART) 提前編譯器通過將應(yīng)用軟件包中的 DEX 文件轉(zhuǎn)換為更緊湊的表示形式巷懈,進(jìn)一步優(yōu)化了壓縮的 Dalvik Executable 格式 (DEX) 文件该抒。 此項(xiàng)變更可讓您的應(yīng)用啟動(dòng)更快并消耗更少的磁盤空間和內(nèi)存。

這種改進(jìn)特別有利于磁盤 I/O 速度較慢的低端設(shè)備顶燕。

設(shè)備端系統(tǒng)跟蹤

Android 9 允許您通過設(shè)備記錄系統(tǒng)跟蹤記錄凑保,然后與您的開發(fā)團(tuán)隊(duì)分享這些記錄的報(bào)告。 該報(bào)告支持多種格式涌攻,包括 HTML欧引。

通過收集這些跟蹤記錄,您可以獲取與應(yīng)用進(jìn)程和線程相關(guān)的計(jì)時(shí)數(shù)據(jù)癣漆,并查看其他類型的具有全局意義的設(shè)備狀態(tài)维咸。

注:您無(wú)需設(shè)置您的代碼來(lái)記錄跟蹤記錄剂买,但這樣做可以幫助您查看應(yīng)用代碼的哪些部分可能會(huì)導(dǎo)致線程掛起或界面卡頓惠爽。

如需詳細(xì)了解該工具,請(qǐng)參閱執(zhí)行設(shè)備內(nèi)置系統(tǒng)跟蹤瞬哼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婚肆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坐慰,更是在濱河造成了極大的恐慌较性,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件结胀,死亡現(xiàn)場(chǎng)離奇詭異赞咙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)糟港,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門攀操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秸抚,你說(shuō)我怎么就攤上這事速和〈醯妫” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵颠放,是天一觀的道長(zhǎng)排惨。 經(jīng)常有香客問我,道長(zhǎng)碰凶,這世上最難降的妖魔是什么暮芭? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮欲低,結(jié)果婚禮上谴麦,老公的妹妹穿的比我還像新娘。我一直安慰自己伸头,他們只是感情好匾效,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恤磷,像睡著了一般面哼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扫步,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天魔策,我揣著相機(jī)與錄音,去河邊找鬼河胎。 笑死闯袒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的游岳。 我是一名探鬼主播政敢,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胚迫!你這毒婦竟也來(lái)了喷户?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤访锻,失蹤者是張志新(化名)和其女友劉穎褪尝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體期犬,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡河哑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了龟虎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璃谨。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖遣总,靈堂內(nèi)的尸體忽然破棺而出睬罗,到底是詐尸還是另有隱情轨功,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布容达,位于F島的核電站古涧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏花盐。R本人自食惡果不足惜羡滑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望算芯。 院中可真熱鬧柒昏,春花似錦、人聲如沸熙揍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)届囚。三九已至有梆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間意系,已是汗流浹背泥耀。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛔添,地道東北人痰催。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像迎瞧,于是被迫代替她去往敵國(guó)和親夸溶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容