Android 10 的新功能


Android 10 中的隱私權變更 目錄 重大變更 外部存儲訪問權限范圍限定為應用文件和媒體 在后台運行時訪問設備位置信息需要權限 針對從后台啟動 Activity 的限制 標識符和數據 移除了聯系人親密程度信息 隨機分配 MAC 地址 對 /proc/net 文件系統的訪問權限實施了限制 對不可重置的設備標識符實施了限制 限制了對剪貼板數據的訪問權限 保護 USB 設備序列號 攝像頭和連接性 對訪問攝像頭詳情和元數據的權限實施了限制 對啟用和停用 WLAN 實施了限制 對直接訪問已配置的 WLAN 網絡實施了限制 一些電話 API、藍牙 API 和 WLAN API 需要精確位置權限 權限 限制對屏幕內容的訪問 面向用戶的權限檢查(針對舊版應用) 身體活動識別 從界面中移除了權限組 Android 10(API 級別 29)引入了多項功能和行為變更,目的是更好地保護用戶的隱私權。這些變更能讓用戶更清楚地了解並更好地控制他們的數據及為應用提供的權能。這些隱私權功能可能意味着應用所依賴的特定行為或數據可能會與較低版本的平台有所不同。如果您的應用遵循當前有關處理用戶數據的最佳做法,則其受到的影響應該會最大限度地減少。 本頁面列出了每項變更的摘要。 注意:除了本頁面所列的變更以外,Android 10 還引入了其他功能和變更,這些會影響平台除隱私權之外的其他方面。要了解詳情,請參閱功能和 API 頁面、所有應用的相關變更頁面以及以 API 29 為目標平台的應用的相關變更頁面。 重大變更 本部分介紹了 Android 10 中與隱私權相關的主要變更。 外部存儲訪問權限范圍限定為應用文件和媒體 默認情況下,對於以 Android 10 及更高版本為目標平台的應用,其訪問權限范圍限定為外部存儲,即分區存儲。此類應用可以查看外部存儲設備內以下類型的文件,無需請求任何與存儲相關的用戶權限: 特定於應用的目錄中的文件(使用 getExternalFilesDir() 訪問)。 應用創建的照片、視頻和音頻片段(通過媒體庫訪問)。 要詳細了解分區存儲以及如何共享、訪問和修改在外部存儲設備上保存的文件,請參閱有關如何管理外部存儲設備中的文件以及如何訪問和修改媒體文件的指南。 在后台運行時訪問設備位置信息需要權限 為了讓用戶更好地控制應用對位置信息的訪問權限,Android 10 引入了 ACCESS_BACKGROUND_LOCATION 權限。 與 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 權限不同,ACCESS_BACKGROUND_LOCATION 權限僅會影響應用在后台運行時對位置信息的訪問權限。除非符合以下條件之一,否則應用將被視為在后台訪問位置信息: 屬於該應用的 Activity 可見。 該應用運行的某個前台設備已聲明前台服務類型為 location。 要聲明您的應用中的某個服務的前台服務類型,請將應用的 targetSdkVersion 或 compileSdkVersion 設置為 29 或更高版本。詳細了解前台服務如何繼續執行用戶發起的需要訪問位置信息的操作。 以 Android 9 或更低版本為目標平台時自動授予訪問權限 如果您的應用在 Android 10 或更高版本上運行,但其目標平台是 Android 9(API 級別 28)或更低版本,則該平台具有以下行為: 如果您的應用為 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 聲明了 元素,則系統會在安裝期間自動為 ACCESS_BACKGROUND_LOCATION 添加 元素。 如果您的應用請求了 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION,系統會自動將 ACCESS_BACKGROUND_LOCATION 添加到請求中。 在設備升級到 Android 10 后訪問 如果用戶向您的應用授予對設備位置信息的訪問權限(ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION),然后將其設備從 Android 9 升級到 Android 10,則系統會自動更新應用已獲取的基於位置信息的那組權限。您的應用在設備升級后接收的那組權限取決於應用的目標 SDK 版本及其定義的權限,如下表所示: 表 1. 設備升級至 Android 10 之后位置權限狀態發生的變化 目標平台版本 是否授予了粗略或精確位置信息使用權限? 清單中是否定義了后台權限? 更新后的默認權限狀態 Android 10 是 是 前台和后台訪問權 Android 10 是 否 僅前台訪問權 Android 10 否 (被系統忽略) 無訪問權 Android 9 或更低版本 是 在設備升級時由系統自動添加 前台和后台訪問權 Android 9 或更低版本 否 (被系統忽略) 無訪問權 注意:即使在系統自動更新應用對設備位置信息的訪問權限之后,用戶仍然可以選擇更改這種訪問權限級別。用戶可以選擇讓應用只能在前台訪問位置信息,或者完全撤消使用權。在嘗試訪問設備的位置信息之前,尤其是在前台服務中,您的應用應檢查用戶是否仍然允許您的應用接收此類位置信息。 如需詳細了解如何在應用在后台運行時檢索設備的位置信息,請參閱有關如何定期接收位置信息更新的指南。 針對從后台啟動 Activity 的限制 從 Android 10 開始,系統會增加針對從后台啟動 Activity 的限制。此項行為變更有助於最大限度地減少對用戶造成的中斷,並且可以讓用戶更好地控制其屏幕上顯示的內容。只要您的應用啟動 Activity 是因用戶互動直接引發的,該應用就極有可能不會受到這些限制的影響。 要詳細了解從后台啟動 Activity 的建議替代方法,請參閱有關如何在應用中提醒用戶注意有時效性的事件的指南。 標識符和數據 本部分列出了針對如何使用標識符和數據的變更。 移除了聯系人親密程度信息 從 Android 10 開始,平台不再跟蹤聯系人親密程度信息。因此,如果您的應用對用戶的聯系人進行搜索,系統將不會按互動頻率對搜索結果排序。 有關 ContactsProvider 的指南包含一項描述特定字段和方法的聲明(從 Android 10 開始,這些字段和方法在所有設備上已作廢)。 隨機分配 MAC 地址 默認情況下,在搭載 Android 10 或更高版本的設備上,系統會傳輸隨機分配的 MAC 地址。 如果您的應用處理企業使用場景,平台會提供 API,用於執行與 MAC 地址相關的幾個操作。 獲取隨機分配的 MAC 地址:設備所有者應用和資料所有者應用可以通過調用 getRandomizedMacAddress() 檢索分配給特定網絡的隨機分配 MAC 地址。 獲取實際的出廠 MAC 地址:設備所有者應用可以通過調用 getWifiMacAddress() 檢索設備的實際硬件 MAC 地址。此方法對於跟蹤設備隊列非常有用。 對 /proc/net 文件系統的訪問權限實施了限制 在搭載 Android 10 或更高版本的設備上,應用無法訪問 /proc/net,其中包含與設備的網絡狀態相關的信息。需要訪問這些信息的應用(如 VPN)應使用 NetworkStatsManager 或 ConnectivityManager 類。 對不可重置的設備標識符實施了限制 從 Android 10 開始,應用必須具有 READ_PRIVILEGED_PHONE_STATE 特許權限才能訪問設備的不可重置標識符(包含 IMEI 和序列號)。 注意:從 Google Play 商店安裝的第三方應用無法聲明特許權限。 受影響的方法包括: Build getSerial() TelephonyManager getImei() getDeviceId() getMeid() getSimSerialNumber() getSubscriberId() 如果您的應用沒有該權限,但您仍嘗試查詢不可重置標識符的相關信息,則平台的響應會因目標 SDK 版本而異: 如果應用以 Android 10 或更高版本為目標平台,則會發生 SecurityException。 如果應用以 Android 9(API 級別 28)或更低版本為目標平台,則相應方法會返回 null 或占位符數據(如果應用具有 READ_PHONE_STATE 權限)。否則,會發生 SecurityException。 注意:如果您的應用是設備所有者或資料所有者應用,那么即使您的應用以 Android 10 或更高版本為目標平台,您也只需 READ_PHONE_STATE 權限即可訪問不可重置的設備標識符。此外,如果您的應用具有特殊運營商權限,則無需任何權限即可訪問這些標識符。 許多使用場景都不需要不可重置的設備標識符。例如,如果您的應用將不可重置的設備標識符用於廣告跟蹤或用戶分析目的,請為這些特定使用場景使用 Android 廣告 ID。要了解詳情,請參閱唯一標識符的最佳做法。 限制了對剪貼板數據的訪問權限 除非您的應用是默認輸入法 (IME) 或是目前處於焦點的應用,否則它無法訪問 Android 10 或更高版本平台上的剪貼板數據。 保護 USB 設備序列號 如果您的應用以 Android 10 或更高版本為目標平台,則該應用只能在用戶授予其訪問 USB 設備或配件的權限后才能讀取序列號。 要詳細了解如何使用 USB 設備,請參閱有關如何配置 USB 主機的指南。 攝像頭和連接性 本部分列出了針對攝像頭元數據和連接 API 的變更。 對訪問攝像頭詳情和元數據的權限實施了限制 Android 10 更改了 getCameraCharacteristics() 方法默認返回的信息的廣度。具體而言,您的應用必須具有 CAMERA 權限才能訪問此方法的返回值中可能包含的設備特定元數據。 要詳細了解這些變更,請參閱關於需要權限的攝像頭字段。 對啟用和停用 WLAN 實施了限制 以 Android 10 或更高版本為目標平台的應用無法啟用或停用 WLAN。WifiManager.setWifiEnabled() 方法始終返回 false。 如果您需要提示用戶啟用或停用 WLAN,請使用設置面板。 對直接訪問已配置的 WLAN 網絡實施了限制 為了保護用戶隱私,只有系統應用和設備政策控制器 (DPC) 支持手動配置 WLAN 網絡列表。給定 DPC 可以是設備所有者,也可以是資料所有者。 如果應用以 Android 10 或更高版本為目標平台,並且應用不是系統應用或 DPC,則下列方法不會返回有用數據: getConfiguredNetworks() 方法始終返回空列表。 注意:如果運營商應用調用 getConfiguredNetworks(),則系統返回的列表僅包含運營商配置的網絡。 每個返回整數值的網絡操作方法(addNetwork() 和 updateNetwork())始終返回 -1。 每個返回布爾值的網絡操作(removeNetwork()、reassociate()、enableNetwork()、disableNetwork()、reconnect() 和 disconnect())始終返回 false。 如果您的應用需要連接到 WLAN 網絡,請使用以下備用方法: 要觸發與 WLAN 網絡的即時本地連接,請在標准 NetworkRequest 對象中使用 WifiNetworkSpecifier。 要添加 WLAN 網絡以便考慮為用戶提供互聯網訪問權限,請使用 WifiNetworkSuggestion 對象。您可以分別通過調用 addNetworkSuggestions() 和 removeNetworkSuggestions() 來添加和移除顯示在自動連接網絡選擇對話框中的網絡。這些方法不需要任何位置權限。 一些電話 API、藍牙 API 和 WLAN API 需要精確位置權限 如果應用以 Android 10 或更高版本為目標平台,則它必須具有 ACCESS_FINE_LOCATION 權限才能使用 WLAN、WLAN 感知或藍牙 API 中的一些方法。以下部分列舉了受影響的類和方法。 注意:如果您的應用在 Android 10 或更高版本平台上運行,但其目標平台是 Android 9(API 級別 28)或更低版本,則只要您的應用已聲明 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 權限,您就可以使用受影響的 API(WifiP2pManager API 除外)。 電話 TelephonyManager getCellLocation() getAllCellInfo() requestNetworkScan() requestCellInfoUpdate() getAvailableNetworks() getServiceState() TelephonyScanManager requestNetworkScan() TelephonyScanManager.NetworkScanCallback onResults() PhoneStateListener onCellLocationChanged() onCellInfoChanged() onServiceStateChanged() WLAN WifiManager startScan() getScanResults() getConnectionInfo() getConfiguredNetworks() WifiAwareManager WifiP2pManager WifiRttManager 藍牙 BluetoothAdapter startDiscovery() startLeScan() BluetoothAdapter.LeScanCallback BluetoothLeScanner startScan() 權限 本部分介紹了 Android 權限模型的相關更新。 注意:本部分中介紹的每項變更均會影響搭載 Android 10 或更高版本的設備上的所有應用,甚至是以 Android 9(API 級別 28)或更低版本為目標平台的應用。 限制對屏幕內容的訪問 為了保護用戶的屏幕內容,Android 10 更改了 READ_FRAME_BUFFER、CAPTURE_VIDEO_OUTPUT 和 CAPTURE_SECURE_VIDEO_OUTPUT 權限的作用域,從而禁止以靜默方式訪問設備的屏幕內容。從 Android 10 開始,這些權限只能通過簽名訪問。 需要訪問設備屏幕內容的應用應使用 MediaProjection API,此 API 會顯示提示,要求用戶同意訪問。 面向用戶的權限檢查(針對舊版應用) 如果您的應用以 Android 5.1(API 級別 22)或更低版本為目標平台,則用戶首次在搭載 Android 10 或更高版本的平台上使用您的應用時,系統會向其顯示權限屏幕,如圖 1 所示。此屏幕讓用戶有機會撤消系統先前在安裝時向應用授予的訪問權限。 注意:如果您要在 Google Play 上發布應用,則必須以 Android 9(API 級別 28)或更高版本為目標平台。要了解詳情,請參閱有關如何符合 Google Play 的目標 API 級別要求的指南。 圖 1. 面向用戶的對話框,允許查看舊版權限 身體活動識別 Android 10 針對需要檢測用戶步數或對用戶的身體活動(例如步行、騎車或坐車)進行分類的應用引入了 ACTIVITY_RECOGNITION 運行時權限。此項權限旨在讓用戶了解設備傳感器數據在“設置”中的使用方式。 除非用戶已向您的應用授予此權限,否則 Google Play 服務中的一些庫(例如 Activity Recognition API 和 Google Fit API)不會提供結果。 設備上要求您聲明此權限的內置傳感器只有計步器和步測器傳感器。 如果您的應用以 Android 9(API 級別 28)或更低版本為目標平台,並在其清單文件中指定 com.google.android.gms.permission.ACTIVITY_RECOGNITION 權限,則系統會根據需要自動向您的應用授予此權限。當您將應用更新為以 Android 10 為目標平台時,平台會保留此權限。但是,用戶可以隨時在系統設置中撤消此權限。 從界面中移除了權限組 從 Android 10 開始,應用無法在界面中查詢權限的分組方式。 行為變更:所有應用 目錄 限制非 SDK 接口 手勢導航 NDK 共享對象不得包含文本重定位 Bionic 庫和動態鏈接器路徑變更 系統二進制文件/庫會映射到只執行內存 安全 TLS 1.3 默認處於啟用狀態 TLS 不信任使用 SHA-1 簽名的證書 KeyChain 行為變更和改進 其他 TLS 和加密更改 WLAN 直連廣播 WLAN 感知功能 Go 設備上的 SYSTEM_ALERT_WINDOW 關於以舊版 Android 系統為目標平台的應用的警告 移除了 SHA-2 CBC 加密套件 應用使用情況 HTTPS 連接變更 android.preference 庫已棄用 ZIP 文件實用程序庫變更 Inflater ZipFile ZipOutputStream 攝像頭變更 電池用量跟蹤 Android Beam 已棄用 Android 10 包含一些可能會影響您的應用的行為變更。本文檔中列出的變更適用於在 Android 10 上運行的應用(無論應用的 targetSdkVersion 如何)。您應該測試您的應用,然后根據需要進行更改以適當地支持這些變更。 如果您的應用的 targetSdkVersion 為 29 或更高,則您還需要支持其他變更。請務必查看針對以 API 級別 29 為目標的應用的行為變更,以了解詳情。 注意:在本文檔中,除了這些行為變更之外,請確保查看並支持 Android 10 隱私功能。 限制非 SDK 接口 為了幫助確保應用的穩定性和兼容性,Android 平台開始限制應用在 Android 9(API 級別 28)中使用非 SDK 接口。Android 10 包含更新后的受限制非 SDK 接口列表(基於與 Android 開發者之間的協作以及最新的內部測試)。我們的目標是在限制使用非 SDK 接口之前確保有可用的公開替代方案。 如果您不打算以 Android 10(API 級別 29)為目標平台,那么其中一些變更可能不會立即對您產生影響。雖然您目前仍然可以使用灰名單中的一些非 SDK 接口(取決於您的應用的目標 API 級別),但如果您使用任何非 SDK 方法或字段,則應用無法運行的風險終歸較高。 如果您不確定自己的應用是否使用了非 SDK 接口,則可以測試該應用,進行確認。如果您的應用依賴於非 SDK 接口,則應該開始計划遷移到 SDK 替代方案。不過,我們知道某些應用具有使用非 SDK 接口的有效用例。如果您無法為應用中的某項功能找到使用非 SDK 接口的替代方案,則應該請求新的公共 API。 要了解詳情,請參閱 Android 10 中有關限制非 SDK 接口的更新以及針對非 SDK 接口的限制。 手勢導航 從 Android 10 開始,用戶可以在設備中啟用手勢導航。用戶啟用后,手勢導航會影響設備上的所有應用,無論應用是否以 API 級別 29 為目標平台。例如,如果用戶從屏幕邊緣向內滑動,系統會將該手勢解讀為“返回”導航,除非應用針對屏幕的相應部分明確替換該手勢。 為了確保您的應用與手勢導航兼容,您需要將應用內容擴展到屏幕邊緣,並適當地處理存在沖突的手勢。有關信息,請參閱手勢導航文檔。 NDK Android 10 包含 NDK 方面的以下變更。 共享對象不得包含文本重定位 Android 6.0(API 級別 23)已禁止在共享對象中使用文本重定位。代碼必須按原樣加載,且不得修改。此變更可以縮短應用的加載時間並提高安全性。 SELinux 針對以 Android 10 或更高版本為目標平台的應用強制執行此限制。如果這些應用繼續使用包含文本重定位的共享對象,則它們出現中斷的風險較高。 Bionic 庫和動態鏈接器路徑變更 從 Android 10 開始,多個路徑不再采用常規文件形式,而是采用符號鏈接形式。如果應用一直以來依賴的都是采用常規文件形式的路徑,則可能會出現中斷: /system/lib/libc.so -> /apex/com.android.runtime/lib/bionic/libc.so /system/lib/libm.so -> /apex/com.android.runtime/lib/bionic/libm.so /system/lib/libdl.so -> /apex/com.android.runtime/lib/bionic/libdl.so /system/bin/linker -> /apex/com.android.runtime/bin/linker 這些變更也會影響文件的 64 位版本,對於這些版本,系統會將 lib/ 替換為 lib64/。 為了確保兼容性,符號鏈接會基於舊路徑提供。例如,/system/lib/libc.so 是指向 /apex/com.android.runtime/lib/bionic/libc.so 的符號鏈接。因此,dlopen(“/system/lib/libc.so”) 會繼續工作,但當應用嘗試通過讀取 /proc/self/maps 或類似項來檢測已加載的庫時,將會發現不同之處。這並不常見,但我們發現一些應用會將這種做法作為對抗黑客攻擊的一項舉措。如果是這樣,則應該將 /apex/… 路徑添加為 Bionic 文件的有效路徑。 系統二進制文件/庫會映射到只執行內存 從 Android 10 開始,系統二進制文件和庫的可執行部分會映射到只執行(不可讀取)內存,作為防范代碼重用攻擊的一種安全強化技術。如果您的應用針對已標記為只執行的內存段執行讀取操作(無論此讀取操作是來自錯誤、漏洞還是有意的內存檢查),系統都會向您的應用發送 SIGSEGV 信號。 您可以通過檢查 /data/tombstones/ 中的相關 tombstone 文件來確定此行為是否會導致崩潰。與只執行相關的崩潰包含以下中止消息: Cause: execute-only (no-read) memory access error; likely due to data in .text. 要解決此問題以執行內存檢查等操作,可以通過調用 mprotect() 將只執行內存段標記為“讀取+執行”。不過,我們強烈建議您事后將其重新設為只執行,因為此訪問權限設置可以更好地保護您的應用和用戶。 注意:此行為不會對 ptrace 的調用產生影響,可允許您調試 ptrace。 安全 Android 10 包含安全方面的以下變更。 TLS 1.3 默認處於啟用狀態 在 Android 10 及更高版本中,系統默認會為所有 TLS 連接啟用 TLS 1.3。以下是有關 TLS 1.3 實現的一些重要的詳細信息: TLS 1.3 加密套件不可自定義。在啟用 TLS 1.3 后,受支持的 TLS 1.3 加密套件會始終保持啟用狀態。任何嘗試通過調用 setEnabledCipherSuites() 停用該加密套件的操作均會被忽略。 在協商 TLS 1.3 時,系統會在將會話添加到會話緩存之前調用 HandshakeCompletedListener 對象。(在 TLS 1.2 和之前的其他版本中,系統會在將會話添加到會話緩存之后調用這些對象。) 在某些情況下,SSLEngine 實例會在之前的 Android 版本中拋出 SSLHandshakeException,而這些實例在 Android 10 及更高版本中會改為拋出 SSLProtocolException。 不支持 0-RTT 模式。 如有需要,您可以通過調用 SSLContext.getInstance("TLSv1.2") 來獲取已停用 TLS 1.3 的 SSLContext。您還可以對相關對象調用 setEnabledProtocols(),從而為每個連接啟用或停用協議版本。 TLS 不信任使用 SHA-1 簽名的證書 在 Android 10 中,使用 SHA-1 哈希算法的證書在 TLS 連接中不受信任。自 2016 年以來,根 CA 未再頒發過此類證書,因為它們不再受 Chrome 或其他主流瀏覽器的信任。 如果某網站使用的是 SHA-1 證書,則任何嘗試連接該網站的操作都將失敗。 KeyChain 行為變更和改進 當 TLS 服務器在 TLS 握手中發送證書請求消息時,某些瀏覽器(如 Google Chrome)允許用戶選擇證書。從 Android 10 開始,KeyChain 對象會在調用 KeyChain.choosePrivateKeyAlias() 時信任頒發機構和密鑰規范參數,以向用戶顯示證書選擇提示。需要注意的是,此提示不包含不符合服務器規范的選項。 如果沒有可用的用戶可選證書(當沒有與服務器規范匹配的證書或設備沒有安裝任何證書時,便會出現這種情況),則完全不會出現證書選擇提示。 此外,在 Android 10 或更高版本上,無需具備設備屏幕鎖定功能,就能將密鑰或 CA 證書導入 KeyChain 對象中。 其他 TLS 和加密更改 Android 10 中引入的 TLS 和加密庫方面的一些細小變更包括: AES/GCM/NoPadding 和 ChaCha20/Poly1305/NoPadding 加密會從 getOutputSize() 中返回更准確的緩沖區大小。 使用 TLS 1.2 或更高版本的最高協議在嘗試連接時會忽略 TLS_FALLBACK_SCSV 加密套件。由於 TLS 服務器實現方面的改進,我們不建議嘗試 TLS 外部回退。不過,我們建議依賴於 TLS 版本協商。 ChaCha20-Poly1305 是 ChaCha20/Poly1305/NoPadding 的別名。 帶有尾隨點的主機名不屬於有效的 SNI 主機名。 為證書響應選擇簽名密鑰時,將遵循 CertificateRequest 中的 supported_signature_algorithms 擴展。 不透明的簽名密鑰(如 Android 密鑰庫中的密鑰)可在 TLS 中與 RSA-PSS 簽名一起使用。 WLAN 直連廣播 在 Android 10 中,以下與 WLAN 直連相關的廣播不具有粘性: WIFI_P2P_CONNECTION_CHANGED_ACTION WIFI_P2P_THIS_DEVICE_CHANGED_ACTION 如果您的應用依賴於在注冊時接收這些廣播(因為其之前一直具有粘性),請在初始化時使用適當的 get() 方法獲取信息。 WLAN 感知功能 Android 10 擴大了支持范圍,現在可以使用 WLAN 感知數據路徑輕松創建 TCP/UDP 套接字。要創建連接到 ServerSocket 的 TCP/UDP 套接字,客戶端設備需要知道服務器的 IPv6 地址和端口。這在之前需要通過頻外方式進行通信(例如使用 BT 或 WLAN 感知第 2 層消息傳遞),或者使用其他協議(例如 mDNS)通過頻內方式發現。而借助 Android 10,可以將此類消息作為網絡設置的一部分進行傳遞。 服務器可以執行以下任一操作: 初始化 ServerSocket 並設置或獲取要使用的端口。 將端口信息指定為 WLAN 感知網絡請求的一部分。 以下代碼示例顯示了如何將端口信息指定為網絡請求的一部分: KotlinJava更多 val ss = ServerSocket() val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle) .setPskPassphrase("some-password") .setPort(ss.localPort) .build() val myNetworkRequest = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build() ServerSocket ss = new ServerSocket(); WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier .Builder(discoverySession, peerHandle) .setPskPassphrase(“some-password”) .setPort(ss.getLocalPort()) .build(); NetworkRequest myNetworkRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build(); 然后,客戶端會執行 WLAN 感知網絡請求來獲取服務器提供的 IPv6 和端口: KotlinJava更多 val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { ... } override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { ... } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { ... val ti = networkCapabilities.transportInfo if (ti is WifiAwareNetworkInfo) { val peerAddress = ti.peerIpv6Addr val peerPort = ti.port } } override fun onLost(network: Network) { ... } }; connMgr.requestNetwork(networkRequest, callback) callback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { ... } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { ... } @Override Public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { ... TransportInfo ti = networkCapabilities.getTransportInfo(); if (ti instanceof WifiAwareNetworkInfo) { WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti; Inet6Address peerAddress = info.getPeerIpv6Addr(); int peerPort = info.getPort(); } } @Override public void onLost(Network network) { ... } }; connMgr.requestNetwork(networkRequest, callback); Go 設備上的 SYSTEM_ALERT_WINDOW 在 Android 10(Go 版本)設備上運行的應用無法獲得 SYSTEM_ALERT_WINDOW 權限。這是因為繪制疊加層窗口會使用過多的內存,這對低內存 Android 設備的性能十分有害。 如果在搭載 Android 9 或更低版本的 Go 版設備上運行的應用獲得了 SYSTEM_ALERT_WINDOW 權限,則即使設備升級到 Android 10,也會保留此權限。不過,尚不具有此權限的應用在設備升級后便無法獲得此權限了。 如果 Go 設備上的應用發送具有 ACTION_MANAGE_OVERLAY_PERMISSION 操作的 intent,則系統會自動拒絕此請求,並將用戶轉到設置屏幕,上面會顯示不允許授予此權限,原因是它會減慢設備的運行速度。如果 Go 設備上的應用調用 Settings.canDrawOverlays(),則此方法始終返回 false。同樣,這些限制不適用於在設備升級到 Android 10 之前便已收到 SYSTEM_ALERT_WINDOW 權限的應用。 關於以舊版 Android 系統為目標平台的應用的警告 在搭載 Android 10 或更高版本的設備上,如果用戶首次運行以 Android 5.1(API 級別 22)或更低版本為目標平台的應用,則會看到警告。如果此應用要求用戶授予權限,則系統會先向用戶提供調整應用權限的機會,然后才會允許此應用首次運行。 由於 Google Play 的目標 API 方面的要求,用戶只有在運行最近未更新的應用時才會看到這些警告。對於通過其他商店分發的應用,我們也將於 2019 年引入類似的目標 API 方面的要求。如需詳細了解這些要求,請參閱在 2019 年擴展目標 API 級別方面的要求。 移除了 SHA-2 CBC 加密套件 以下 SHA-2 CBC 加密套件已從平台中移除: TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 這些加密套件不如使用 GCM 的類似加密套件安全,並且大多數服務器要么同時支持這些加密套件的 GCM 變體和 CBC 變體,要么二者均不支持。 注意:應用和庫應該讓其所需的加密套件集與 getSupportedCipherSuites() 中返回的值相交,以便提前防范加密套件日后遭到移除。 應用使用情況 Android 10 引入了與應用使用情況相關的以下行為變更: UsageStats 應用使用情況方面的改進 - 當在分屏或畫中畫模式下使用應用時,Android 10 現在能夠使用 UsageStats 准確地跟蹤應用使用情況。此外,Android 10 可以正確地跟蹤免安裝應用的使用情況。 按應用開啟灰度模式 - Android 10 可針對各個應用設置灰度顯示模式。 按應用開啟干擾模式 - Android 10 可以選擇性地將應用設置為“干擾模式”,此時系統會禁止顯示其通知,並且不會將其顯示為推薦的應用。 暫停和播放 - 在 Android 10 中,暫停的應用無法播放音頻。 HTTPS 連接變更 如果在 Android 10 上運行的應用將 null 傳遞給 setSSLSocketFactory(),則會出現 IllegalArgumentException。在以前的版本中,將 null 傳遞給 setSSLSocketFactory() 與傳入當前的默認 SSL 套接字工廠效果相同。 android.preference 庫已棄用 從 Android 10 開始,將棄用 android.preference 庫。開發者應該改為使用 AndroidX preference 庫,這是 Android Jetpack 的一部分。如需獲取其他有助於遷移和開發的資源,請查看經過更新的設置指南以及我們的公開示例應用和參考文檔。 ZIP 文件實用程序庫變更 Android 10 對 java.util.zip 軟件包(用於處理 ZIP 文件)中的類進行了以下變更。這些變更會讓庫的行為在 Android 和使用 java.util.zip 的其他平台之間更加一致。 Inflater 在以前的版本中,如果在調用 end() 之后調用 Inflater 類中的某些方法,這些方法會拋出 IllegalStateException。在 Android 10 中,這些方法會改為拋出 NullPointerException。 ZipFile 在 Android 10 及更高版本中,如果所提供的 ZIP 文件不包含任何文件,則 ZipFile 的構造函數(采用的參數類型為 File、int 和 Charset)不會拋出 ZipException。 ZipOutputStream 在 Android 10 及更高版本中,如果 ZipOutputStream 中的 finish() 方法嘗試為不包含任何文件的 ZIP 文件寫入輸出流,則此方法不會拋出 ZipException。 攝像頭變更 很多使用攝像頭的應用都會假定如果設備采用縱向配置,則物理設備也會處於縱向,正如攝像頭方向中所述。在過去可以做出這樣的假定,但隨着可用的設備類型(例如可折疊設備)的擴展,這一情況發生了變化。針對這些設備做出這樣的假定可能導致相機取景器的顯示產生錯誤的旋轉和/或縮放。 以 API 級別 24 或更高級別為目標平台的應用應該明確設置 android:resizeableActivity,並提供必要的功能來處理多窗口操作。 電池用量跟蹤 從 Android 10 開始,只要在發生重大充電事件之后拔下設備電源插頭,SystemHealthManager 就會重置其電池用量統計信息。一般來說,重大充電事件指的是設備電池已充滿,或者設備電量從幾乎耗盡變為即將充滿。 在 Android 10 之前,無論何時拔下設備電源插頭,無論電池電量有多微小的變化,電池用量統計信息都會重置。 Android Beam 已棄用 在 Android 10 中,我們正式棄用了 Android Beam,這是一項舊版功能,可通過近距離無線通信 (NFC) 在多個設備之間啟動數據共享。我們還棄用了一些相關的 NFC API。Android Beam 仍可供需要的設備制造商合作伙伴使用,但它已不再處於積極的開發階段。不過,Android 仍將繼續支持其他的 NFC 功能和 API,並且從標簽和付款中讀取數據等使用場景仍將繼續按預期執行。 面向開發者的 Android 10 目錄 創新技術和新體驗 可折疊設備 5G 網絡 通知中的智能回復 深色主題 手勢導航 設置面板 共享快捷方式 用戶隱私設置 安全性 攝像頭和媒體 照片的動態深度 捕獲播放的音頻 新的音頻和視頻編解碼器 原生 MIDI API 可縮放的定向麥克風 Vulkan 無處不在 連接性 改進了點對點連接和互聯網連接 WLAN 性能模式 Android 基礎知識 ART 優化 Neural Networks API 1.2 Thermal API 通過公共 API 實現兼容性 更新速度更快,代碼更新頻率更高 開始使用 Android 10 圍繞三個重要主題構建而成。首先,Android 10 以其先進的機器學習和對新興設備(如可折疊設備和支持 5G 的手機)的支持走在移動創新領域的前沿。其次,Android 10 的主要關注點之一就是隱私權和安全性,其中近 50 項功能可為用戶提供更好的保護、更高的透明度以及讓用戶更好地控制相關數據。最后,Android 10 可讓用戶更好地控制數字健康,因此個人和家庭都可以更好地利用此項技術。 下面,我們來介紹一下 Android 10 為開發者提供了哪些功能以及您現在能如何利用這些功能。 創新技術和新體驗 借助 Android 10,您可以充分利用最新的硬件和軟件創新,從而為用戶打造出色的應用體驗。 借助 Android 10,您可以針對可折疊設備和其他大屏幕設備優化應用。 可折疊設備 Android 10 基於強大的多窗口支持構建而成,擴展了跨應用窗口的多任務處理能力,還提供了屏幕連續性,可以在設備折疊或展開時維持應用狀態。Android 10 在 onResume 和 onPause 中添加了多項改進,用於支持多項恢復,並在應用獲得焦點時通知應用。它還更改了 resizeableActivity 清單屬性的工作方式,以幫助您管理應用在可折疊設備和大屏幕設備上的顯示方式。為幫助針對可折疊設備進行編譯,您可以在 Android Studio 中配置可折疊模擬器來用作虛擬設備 (AVD)。如需詳細了解如何針對可折疊設備優化應用,請參閱開發者指南。 5G 網絡 5G 有望在穩定提升速度的同時降低延遲,Android 10 新增了針對 5G 的平台支持,並擴展了現有 API 來幫助您充分利用這些增強功能。您可以使用連接 API 來檢測設備是否具有高帶寬連接,還可以檢查連接是否按流量計費。借助這些功能,您的應用和游戲可以為使用 5G 的用戶量身打造豐富的沉浸式體驗。 通知中的智能回復 Android 10 使用設備上的機器學習在通知中提供上下文操作建議,如智能回復消息或在通知中打開某個地址的地圖。您的應用可以立即充分利用此功能,而您無需執行任何操作。系統提供的智能回復和操作默認直接插入到通知中。您仍可以根據需要自行提供回復或操作。使用 setAllowGeneratedReplies() 和 setAllowSystemGeneratedContextualActions() 即可針對每則通知選擇停用智能回復。 智能回復可以根據通知內容提供操作建議。 深色主題 Android 10 新增了一個系統級的深色主題,非常適合光線較暗的場景並能幫助節省電量。用戶轉至“設置”進行相應設置或開啟“省電模式”即可激活新的系統級深色主題。這會將系統界面更改為深色,並為支持深色主題的應用啟用深色主題。您可以為應用構建自定義深色主題,也可以選擇使用新的 Force Dark 功能,讓系統根據現有主題動態創建深色版本。您還可以充分利用 AppCompat 的 DayNight 功能,為使用早期版本的 Android 的用戶提供深色主題。如需了解詳情,請參閱開發者指南。 Android 10 可以利用 Force Dark 為應用動態創建深色主題。 手勢導航 手勢導航可讓應用全屏顯示內容。 Android 10 引入了全手勢導航模式,該模式不顯示通知欄區域,允許應用使用全屏來提供更豐富、更讓人沉浸的體驗。它通過邊緣滑動(而不是可見的按鈕)保留了用戶熟悉的“返回”、“主屏幕”和“最近”導航。要與手勢導航無縫融合,您應順着邊緣在導航欄后方繪制,以打造沉浸式體驗。要實現這一點,應用應使用 setSystemUiVisibility() API 以全屏模式布局,然后相應地處理 WindowInsets,以確保重要的界面區域未被遮擋。立即開始優化您的應用,並查看我們的博文系列,以了解詳情。 設置面板 現在,您可以通過新的設置面板 API 在應用上下文中直接顯示關鍵系統設置。設置面板是浮動界面,您可以通過調用它來顯示用戶可能需要使用的設置,如互聯網連接、NFC 和音量。例如,瀏覽器可以顯示具有飛行模式、WLAN(包括附近網絡)和移動數據等連接設置的面板。要顯示設置面板,只需發出具有某個新 Settings.Panel 操作的 intent。 共享快捷方式 共享快捷方式功能可使共享更加輕松快捷,讓用戶能夠直接跳轉到其他應用來共享內容。開發者可以發布能在應用中啟動特定 Activity 的共享目標,同時附上內容;這些共享目標會在共享界面中向用戶顯示。因為共享目標是提前發布的,所以共享界面會在啟動后立即加載它們。共享快捷方式類似於應用快捷方式,都使用同一個 ShortcutInfo API。ShareTarget AndroidX 庫也支持此 API。如需了解詳情,請參閱示例應用。 共享快捷方式可讓用戶直接跳轉到應用中的特定 Activity,同時附上內容。 用戶隱私設置 隱私權是 Android 10 的其中一個主要關注點,相關改進包括在平台中提供更強大的保護措施以及在設計新功能時謹記隱私性。Android 10 基於先前版本構建,並引入了大量變更(如改進了系統界面、讓權限授予更加嚴格以及對應用能夠使用哪些數據實施了限制),目的是保護隱私權並賦予用戶更多控制權。如需詳細了解如何在您的應用中支持這些變更,請參閱隱私權變更。 用戶現在可以選擇在應用在前台運行時授予其訪問位置信息的權限。 賦予用戶對位置數據的更多控制權 - 用戶可以通過新的權限選項更好地控制他們的位置數據;現在,他們可以允許應用僅在實際使用(在前台運行)時訪問位置信息。對於大部分應用來說,這提供了足夠的訪問級別;而對於用戶來說,這在確保透明度和控制權方面是一項重大改進。要詳細了解位置信息方面的變更,請參閱開發者指南或我們的博文。 在掃描網絡時保護位置數據 - 用於掃描網絡的大多數 API 都需要粗略位置權限。Android 10 改為要求精確位置權限,由此來增強對這些 API 的防御。 阻止設備跟蹤 - 應用無法再訪問不可重置的設備標識符(可用於跟蹤),包括設備 IMEI、序列號和類似標識符。設備的 MAC 地址也會默認在連接到 WLAN 網絡時隨機分配。請閱讀最佳做法,其中的內容有助於您為具體使用場景選擇合適的標識符;同時點擊此處了解詳情。 保護外部存儲設備中的用戶數據 - Android 10 引入了一些變更,目的是讓用戶更好地控制外部存儲設備中的文件以及其中的應用數據。應用可以將自己的文件存儲在專用沙盒中,但必須使用 MediaStore 來訪問共享媒體文件,並使用系統文件選擇器訪問新的“下載內容”集合中的共享文件。如需了解詳情,請點擊此處。 屏蔽意外中斷 - Android 10 可阻止應用從后台啟動,從后台啟動會使應用意外跳轉到前台並從其他應用獲得焦點。如需了解詳情,請點擊此處。 安全性 Android 10 引入了多項功能,可通過加密、平台安全強化和身份驗證方面的改進為用戶提供更高的安全性。請詳細閱讀此處的 Android 10 安全更新。 存儲加密 - 搭載 Android 10 的所有兼容設備都必須加密用戶數據;為了提高加密效率,Android 10 引入了我們的新加密模式 Adiantum。 默認啟用 TLS 1.3 - Android 10 還默認啟用 TLS 1.3,它是 TLS 標准的主要修訂版本,具有性能優勢和更高的安全性。 平台安全強化 - Android 10 還引入了針對平台幾個關鍵安全區域的安全強化功能。 改進了生物識別功能 - Android 10 擴展了 BiometricPrompt 框架,以支持被動身份驗證方法,如人臉識別以及添加隱式和顯式身份驗證流程。在顯式流程中,用戶必須在身份驗證期間明確確認 TEE 中的事務。對於需要被動身份驗證的事務,隱式流程是一種更輕量的替代方案。Android 10 還改進了按需回退設備憑據的流程。如需了解詳情,請點擊此處。 攝像頭和媒體 照片的動態深度 應用現在可以請求動態深度圖片,其中包含與深度相關元素有關的 JPEG、XMP 元數據,以及嵌入在同一文件中的深度和置信度映射。這些功能讓您可以在應用中提供專用模糊和散景選項。動態深度是用於生態系統的一種開源格式,我們正在與合作伙伴合作,以將其推廣到搭載 Android 10 及更高版本的設備。 您可以利用動態深度圖片在應用中提供專用模糊和散景選項。 捕獲播放的音頻 現在,播放音頻的任何應用都允許其他應用使用新的音頻播放捕獲 API 捕獲其音頻流。除了能夠啟用字幕之外,此 API 還可讓您支持常見的使用場景(如直播游戲)。我們在構建這項新功能時考慮了隱私性和版權保護,因此,應用捕獲其他應用音頻的功能會受限,這會讓應用全權控制其音頻流是否可以被捕獲。如需了解詳情,請閱讀這篇博文。 新的音頻和視頻編解碼器 Android 10 新增了對開源視頻編解碼器 AV1 的支持,這允許媒體提供商使用更少的帶寬向 Android 設備流式傳輸高品質視頻內容。此外,Android 10 還支持使用 Opus(一種針對語音和音樂流式傳輸進行了優化的開放且免版稅的編解碼器)和 HDR10+(用於支持它的設備上的高動態范圍視頻)對音頻進行編碼。MediaCodecInfo API 引入了一種更簡便的方法來確定某個 Android 設備的視頻渲染功能。對於任何指定的編解碼器,您可以獲取其支持的大小和幀速率列表。 原生 MIDI API 針對使用 C++ 執行其音頻處理的應用,Android 10 引入了原生 MIDI API,以通過 NDK 與 MIDI 設備通信。此 API 允許使用非阻塞讀取在音頻回調內檢索 MIDI 數據,從而以低延遲處理 MIDI 消息。使用示例應用和此處的源代碼試試看。 可縮放的定向麥克風 Android 10 可讓您通過新的 MicrophoneDirection API 更好地控制音頻捕獲。您可以使用此 API 指定在錄音時麥克風的首選方向。例如,當用戶在進行視頻“自拍”時,您可以請求前置麥克風(如果有)以進行錄音。此外,此 API 還引入了控制可縮放麥克風的標准化方法,允許您的應用控制錄音字段大小。 Vulkan 無處不在 Android 10 包含用於繪制高性能 3D 圖形的低開銷、跨平台 API 實現,擴大了 Vulkan 的影響范圍。所有搭載 Android 10 及更高版本的 64 位設備現在都要求使用 Vulkan 1.1,也建議在所有 32 位設備上使用 Vulkan 1.1。我們已經看到整個生態系統大力支持 Vulkan 的強勁勢頭,在搭載 Android N 或更高版本的設備中,53% 的設備都支持 Vulkan 1.0.3 或更高版本。隨着 Android 10 中相關新要求的推出,我們預計未來一年 Vulkan 的采用率將進一步提升。 連接性 改進了點對點連接和互聯網連接 我們重構了 WLAN 堆棧,目的是改進隱私設置和性能,同時改進常見使用場景(如管理 IoT 設備以及提供互聯網連接建議),而無需請求位置權限。網絡連接 API 針對點對點功能(如配置、下載或打印)簡化了通過本地 WLAN 管理 IoT 設備的操作。網絡建議 API 可讓應用向用戶顯示首選 WLAN 網絡以進行互聯網連接。 WLAN 性能模式 應用現在可以通過啟用高性能和低延遲模式來請求自適應 WLAN。如果低延遲對用戶體驗(如實時游戲、活躍語音通話以及類似使用場景)至關重要,這些模式會極具優勢。平台與設備固件配合使用,可以滿足最低耗電量的要求。要使用新的性能模式,請調用 WifiManager.WifiLock.createWifiLock()(使用 WIFI_MODE_FULL_LOW_LATENCY 或 WIFI_MODE_FULL_HIGH_PERF)。在這些模式中,平台與設備固件配合使用,可以滿足最低耗電量的要求。 Android 基礎知識 ART 優化 在 ART 運行時方面的改進可幫助您的應用更快地啟動、占用更少的內存並更順暢地運行,而您無需執行任何操作。借助 Google Play 提供的 ART 配置文件,ART 在應用運行之前就可以預先編譯應用組件。在運行時,Android 10 向 ART 的並發復制 (CC) 垃圾回收器添加了分代垃圾回收功能,以節省垃圾回收的時間並提高 CPU 效率,減少卡頓,同時幫助應用在低端設備上更順暢地運行。 上圖以百分比形式顯示了具體應用在使用 Play 配置文件進行測試后啟動時間的縮短幅度。 Neural Networks API 1.2 我們新增了 60 項操作(包括 ARGMAX、ARGMIN 和量化 LSTM),並進行了一系列性能優化。這為加速更多模型奠定了基礎,比如對象檢測模型和圖像分割模型。我們與硬件供應商合作,並使用常見的機器學習框架(如 TensorFlow),以針對 NNAPI 1.2 進行優化並提供支持。 Thermal API 當設備過熱時,它們可能會限制 CPU 和/或 GPU,而這可能會以意想不到的方式影響應用和游戲。現在,在 Android 10 中,應用和游戲可以使用 Thermal API 監控設備變化情況,並在設備過熱時采取措施,使設備恢復到正常溫度。例如,影音在線播放應用可以降低分辨率/比特率或減少網絡流量;相機應用可以停用閃光燈或密集型圖像增強;游戲可以降低幀速率或減少多邊形曲面細分。如需了解詳情,請點擊此處。 通過公共 API 實現兼容性 Android 10 繼續增加了對非 SDK 接口的限制,以便應用逐步轉為僅使用公共 API。如果您目前使用的接口受到限制,則可以選擇針對該接口請求新的公共 API。為了幫助您完成過渡並防止應用中斷,我們僅在您的應用以 Android 10 (API 29) 為目標平台時實施這些限制。如需詳細了解這些限制,請參閱開發者指南。 更新速度更快,代碼更新頻率更高 Android 10 可通過 Treble 計划加快更新速度,這可在 Android 與設備制造商和芯片制造商提供的底層設備代碼之間提供一致的可測試接口。借助 Treble 計划,設備制造商能夠以更快的速度和更低的費用將 Android 10 引入符合 Treble 標准的設備中。 Android 10 也是首個支持 Project Mainline(官方名稱為“Google Play 系統更新”)的版本;這是我們用於保護 Android 用戶並通過重要的代碼變更及時更新設備的新技術,可通過 Google Play 直接獲取。借助 Google Play 系統更新,我們能夠更新所有搭載 Android 10 及更高版本的設備中的特定內部組件,無需設備制造商全面更新系統。 對於開發者來說,我們希望 Android 10 中的這些更新能夠廣泛幫助提升設備間平台實現的一致性,並隨時間提供更高的統一性,從而降低您的開發和測試費用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM