android9.0應該知道的事情

 

Android P 行爲變更

Android P 對 Android 系統進行了多項變更。 其中大部分變更會影響所有應用,而不論應用針對的是何種版本的 Android。 不過,有幾項變更僅影響針對 Android P 的應用。 爲清楚起見,本頁面分爲兩個部分:針對所有 API 級別的應用針對 Android P 的應用

在 Android P 上運行的所有應用

當應用運行在 Android P 平臺上時,這些行爲變更將影響所有應用,無論這些應用是針對哪個 API 級別構建。 所有開發者都應查看這些變更,並修改其應用以正確支持這些變更(如果適用)。

後臺應用中的輸入和數據隱私

Android P 通過限制後臺應用訪問用戶輸入和傳感器數據的能力增強了隱私性。 如果您的應用在運行 Android P 的設備上在後臺運行,系統將對您的應用施加以下限制:

  • 您的應用不能訪問麥克風或攝像頭。
  • 使用連續報告模式的傳感器(例如加速度計和陀螺儀)不會接收事件。
  • 使用發送變化時一次性報告模式的傳感器不會接收事件。

如果您的應用需要在運行 Android P 的設備上檢測傳感器事件,請使用前臺服務

注:對 SensorManager 的某個實例調用 flush() 的應用不會受此變更影響。

設備安全性變更

運行 Android P 的設備提供密鑰輪轉和系統調用保護。 無論應用的目標 API 級別爲何,這些變更都能增強應用的安全性。 如需瞭解更多詳情,請參閱安全行爲變更頁面上對所有應用做出的變更。

加密變更

Android P 針對加密算法的實現和處理引入了幾項變更。

參數和算法的 Conscrypt 實現

Android P 在 Conscrypt 中實現了更多的算法參數{: .external-link}。 這些參數包括: AES、DESEDE、OAEP 和 EC。 這些參數和許多算法的 Bouncy Castle 版本{: .external-link} 在 Android P 中已被棄用。

注:EC 參數的 Conscrypt 實現僅支持已命名的曲線。

如果您的應用以 Android 8.1(API 級別 27)或更低版本爲目標,則在請求上述已棄用算法的 Bouncy Castle 實現時,您將收到一條警告消息。 然而,如果您以 Android P 爲目標,則這些請求會各自引發 NoSuchAlgorithmException

其他變更

Android P 引入了其他幾項加密變更:

  • 使用 PBE 密鑰時,如果 Bouncy Castle 需要初始化矢量 (IV),而您的應用未提供 IV,則會收到一條警告消息。
  • ARC4 加密的 Conscrypt 實現允許您指定 ARC4/ECB/NoPadding 或 ARC4/NONE/NoPadding
  • Crypto Java 加密架構 (JCA) 提供程序現已被移除。 因此,如果您的應用調用 SecureRandom.getInstance("SHA1PRNG", "Crypto"),將會發生 NoSuchProviderException
  • 如果您的應用從大於密鑰結構的緩衝區中解析 RSA 密鑰,將不會再發生異常。

應用兼容性變更

爲幫助確保應用穩定性和兼容性,此平臺對某些非 SDK 函數和字段的使用進行了限制;無論您是直接訪問這些函數和字段,還是通過反射或 JNI 訪問,這些限制均適用。 在 Developer Preview 1 中,您的應用可以繼續訪問這些受限的接口;該平臺通過 toast 和日誌條目提醒您注意這些接口。 如果您的應用顯示這樣的 toast,則必須尋求受限接口之外的其他實現策略。 如果您認爲沒有可行的替代策略,您可以提交錯誤 以請求重新考慮此限制。

對於非 SDK 接口的限制包含了更多重要信息。 您應查閱該信息以確保您的應用繼續正常工作。

ICU 庫更新

平臺中使用的 ICU 庫版本已從 Android 8.0(API 級別 26)和 8.1(API 級別 27)中的 ICU 58 更新至 ICU 60。

ICU 用於提供 android.icu package 下的公開 API,供 Android 平臺內部用來提供國際化支持。 例如,它用於實現 java.util、java.text 和 android.text 格式的 Android 類。 此版本包含許多細微但很有用的變更,例如 Emoji 5.0 數據支持,改進了日期/時間格式,詳見 ICU 59 和 ICU 60 版本說明中的介紹。

您應特別注意以下幾點:

  • 平臺處理時區的方式已發生更改。
    • 平臺能夠更好地處理 GTM 和 UTC,不再將 UTC 與 GMT 混爲一談。

ICU 現在提供 GMT 和 UTC 的翻譯版時區名稱。 此變更會影響“GMT”、“Etc/GMT”、“Etc/UTC”、“UTC”和“Zulu”之類時區的 android.icu 格式和解析行爲。

    • java.text.SimpleDateFormat 現在使用 ICU 提供 UTC /GMT 的顯示名稱,這意味着:
      • 對於許多語言區域而言,設置 zzzz 的格式將會生成很長的本地化字符串。 之前,對於 UTC 時區,它會生成“UTC”,而對於 GMT,則會生成“GMT+00:00”之類的字符串。
      • 解析 zzzz 可識別“Universal Coordinated Time”和“Greenwich Mean Time”之類的字符串。
      • 在所有語言裏,如果應用接受“UTC”或“GMT+00:00”作爲 zzzz 的輸出,則可能會遇到兼容性問題。
    • java.text.DateFormatSymbols.getZoneStrings() 的行爲已變更:
      • 與 SimpleDateFormat 類似,現在,UTC 和 GMT 也有長名稱。 對於 UTC 時區,DST 類型的時區名稱(例如“UTC”、“Etc/UTC”和“Zulu”)變爲 GMT+00:00(而不是硬編碼字符串 UTC),這是在沒有其他名稱可用時的標準回退。
      • 某些時區 ID 被正確地識別爲其他地區的同義詞,因此,Android 能夠查找過時時區 ID(例如 Eire)對應的字符串,而之前無法解決此問題。
    • 亞洲/河內不再是可識別的時區。 因此,java.util.TimeZones.getAvailableIds() 不再返回此值,java.util.TimeZone.getTimeZone() 也不再識別它。 此行爲與現有的 android.icu 行爲相符。
  • android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String) 函數甚至在解析合法貨幣文本時也會引發 ParseException。 通過對 PLURALCURRENCYSTYLE 類型的貨幣文本使用自 Android 7.0(API 級別 24)以來所提供的 NumberFormat.parseCurrency,可避免此問題。

不再支持 Android 安全加密文件

  • Android 安全加密文件 (ASEC) 最初是在 Android 2.2(API 級別 8)中引入,用於支持原始的 SD 卡加載應用功能。 Android 6.0(API 級別 23)替換並棄用了 ASEC,引入了“可採用的 SD 卡”功能。
  • Android 8.0(API 級別 26)禁止在 ASEC 中安裝新應用。 此 Developer Preview 則完全移除了 ASEC 功能。

測試套件版本號變更

移除了 TestSuiteBuilder 類中的 addRequirements() 函數,TestSuiteBuilder 類本身也已棄用。addRequirements() 函數要求開發者提供類型爲隱藏 API 的參數,結果令 API 失效。

從框架移除的測試庫

在 Android 8.1(API 級別 27)和更低版本中,Android 框架提供了 ActivityInstrumentationTestCase2 等若干類,您可以利用這些類在應用中創建測試。 編譯時,這些類可在針對 android.jar 構建時使用。 這種內置測試架構儘管方便,但需要您針對 android.jar 提供的 JUnit 版本進行測試,這會使構建和測試依賴其他 JUnit 版本的依賴項變得困難。

爲了讓您能夠更靈活地構建和測試自定義或第三方邏輯,Android P 從框架中移除了測試類。 但測試庫仍可作爲可選依賴項使用。 舊版測試庫頁面介紹瞭如何在 Android P 中使用它們。

如需瞭解有關如何測試 Android 應用的更多信息,請參閱在 Android 上測試應用

Java UTF 解碼器

UTF-8 是 Android 中的默認字符集。 UTF-8 字節序列可由 String(byte[] bytes) 之類的 String 構造函數解碼。 Android P 中的 UTF-8 解碼器更嚴格,其遵循 Unicode 標準,也即:

  • 非最短形式的 UTF-8(例如 <C0, AF>)現在被視爲格式不正確。
  • 替代形式的 UTF-8(例如 U+D800..U+DFFF)現在被視爲格式不正確。
  • 最大的子部分被單個 U+FFFD 取代。 例如,在字節序列“41 C0 AF 41 F4 80 80 41”中,最大子部分爲“C0”、“AF”和“F4 80 80”。其中“F4 80 80”可以是“F4 80 80 80”的初始子序列,但“C0”不能是任何形式正確的代碼單位序列的初始子序列。 因此,輸出應爲“A\ufffd\ufffdA\ufffdA”。
  • 要在 Android P 中解碼修改後的 UTF-8/CESU-8 序列,請使用 DataInputStream.readUTF() 函數或NewStringUTF() JNI 函數。

使用證書的主機名驗證

RFC 2818 中介紹了兩種對照證書匹配域名的方法—使用 subjectAltName (SAN) 擴展程序中的可用名稱,或者在沒有SAN 擴展程序的情況下,回退到 commonName (CN)。

然而,在 RFC 2818 中,回退到 CN 已被棄用。因此,Android 不再回退到使用 CN。 要驗證主機名,服務器必須出示具有匹配 SAN 的證書。 不包含與主機名匹配的 SAN 的證書不再被信任。

網絡地址查詢可能會導致網絡違規

要求名稱解析的網絡地址查詢可能會涉及網絡 I/O 並被視爲阻塞性操作。 對於主線程的阻塞性操作可能會導致停頓或卡頓。

StrictMode 類是一個有助於開發者檢測代碼問題的開發工具。 現在,StrictMode 可以檢測需要名稱解析的網絡地址查詢所導致的網絡違規。

開發者在交付應用時不應啓用 StrictMode。 否則,其應用可能會遭遇新的異常,例如,在使用 detectNetwork() 或 detectAll() 函數獲取用於檢測網絡違規的政策時,會出現 NetworkOnMainThreadException

解析數字 IP 地址不被視爲阻塞性操作。 數字 IP 地址解析的工作方式與 Android P 以前的平臺版本中所採用的方式相同。

套接字標記

在 Android P 以前的平臺版本上,如果使用 setThreadStatsTag() 函數標記某個套接字,則當使用帶 ParcelFileDescriptor 容器的 binder IPC 將其發送給其他進程時,套接字會被取消標記。

從 Android P 開始,利用 binder IPC 將套接字發送至其他進程時,其標記將得到保留。 此變更可能影響網絡流量統計,例如,使用queryDetailsForUidTag() 函數時。 您可以通過先調用 untagSocket() 然後再將套接字發送至其他進程,保留以前的行爲。

報告的套接字中可用字節數

在調用 shutdownInput() 函數後調用 available() 函數會返回 0。

更詳盡的 VPN 網絡功能報告

在 Android P 以前的平臺版本中,NetworkCapabilities 類僅報告 VPN 的有限信息,例如 TRANSPORT_VPN,但會省略 NET_CAPABILITY_NOT_VPN。 這種情形導致應用開發者難以確定使用 VPN 是否會導致對用戶收費。 例如,檢查 NET_CAPABILITY_NOT_METERED 並不能確定底層網絡是否按流量計費。

從 Android P 開始,當 VPN 調用 setUnderlyingNetworks() 函數時,Android 系統將會合並任何底層網絡的傳輸和能力並返回 VPN 網絡的有效網絡能力作爲結果。

自 Android P 開始,已經檢查 NET_CAPABILITY_NOT_METERED 的應用開發者將收到關於 VPN 網絡能力和底層網絡的信息。

應用無法再訪問 xt_qtaguid 文件夾中的文件

不再允許應用直接讀取 /proc/net/xt_qtaguid 文件夾中的文件。 這樣做是爲了確保與某些在發佈時運行 Android P、但未提供這些文件的設備保持一致。

依賴這些文件的公開 API TrafficStats 和 NetworkStatsManager 繼續按照預期方式運行。 然而,不受支持的 cutils功能(例如 qtaguid_tagSocket())在不同設備上可能不會按照預期方式運行 — 甚至根本不運行。

現在,強制執行 FLAG_ACTIVITY_NEW_TASK 要求

在 Android P 中,您不能從非 Activity 環境中啓動 Activity,除非您傳遞 Intent 標誌 FLAG_ACTIVITY_NEW_TASK。 如果您嘗試在不傳遞此標誌的情況下啓動 Activity,則該 Activity 不會啓動,系統會在日誌中輸出一則消息。

注:在 Android N 之前,標誌要求一直是期望的行爲並被強制執行。 Android N 中的一個錯誤會臨時阻止實施標誌要求。

屏幕旋轉變更

Android O 中的用戶可以使用 Quicksettings 圖塊或 Display 設置在自動屏幕旋轉縱向旋轉模式之間切換。 Android P 對縱向旋轉模式做出了重大變更。 縱向模式已重命名爲旋轉鎖定,它會在自動屏幕旋轉關閉時啓用。 自動屏幕旋轉模式沒有任何變更。

當設備處於旋轉鎖定模式時,用戶可將其屏幕鎖定到頂層可見 Activity 所支持的任何旋轉。 Activity 不應假定它將始終以縱向呈現。 如果頂層 Activity 可在自動屏幕旋轉模式下以多種旋轉呈現,則應在旋轉鎖定模式下提供相同的選項,根據 Activity 的 screenOrientation 設置,允許存在一些例外情況(見下表)。

請求特定屏幕方向(例如,screenOrientation=landscape)的 Activity 會忽略用戶鎖定首選項,並且行爲與 Android O 中的行爲相同。

可在 Android 清單中,或以編程方式通過 setRequestedOrientation(),在 Activity 一級設置屏幕方向首選項。

旋轉鎖定模式通過設置 WindowManager 在處理 Activity 旋轉時使用的用戶旋轉首選項來發揮作用。 用戶旋轉首選項可能在下列情況下發生變更。 請注意,恢復縱向模式存在偏差:

  • 當用戶接受旋轉建議時,旋轉首選項變爲建議方向。
  • 當用戶切換到強制縱向應用(包括鎖定屏幕或啓動器)時,旋轉首選項變爲縱向。

下表總結了常見屏幕方向的旋轉行爲:

屏幕方向

行爲

未指定、user

在自動屏幕旋轉和旋轉鎖定下,Activity 可以縱向或橫向(以及顛倒縱向或橫向)呈現。 預期同時支持縱向和橫向佈局。

userLandscape

在自動屏幕旋轉和旋轉鎖定下,Activity 可以橫向或顛倒橫向呈現。 預期只支持橫向佈局。

userPortrait

在自動屏幕旋轉和旋轉鎖定下,Activity 可以縱向或顛倒縱向呈現。 預期只支持縱向佈局。

fullUser

在自動屏幕旋轉和旋轉鎖定下,Activity 可以縱向或橫向(以及顛倒縱向或橫向)呈現。 預期同時支持縱向和橫向佈局。

旋轉鎖定用戶將可選擇鎖定到顛倒縱向,通常爲 180º。

sensor、fullSensor、sensorPortrait、sensorLandscape

忽略旋轉鎖定模式首選項,視爲自動屏幕旋轉已啓用。 請僅在例外情況下並經過仔細的用戶體驗考量後再使用此項。

針對 Android P 的應用

這些行爲變更僅應用於針對 P 平臺或更高版本的應用。 針對 Android P 或更高版本進行編譯,或將 targetSdkVersion設爲 Android P 或更高版本的應用開發者必須修改其應用以正確支持這些行爲(如果適用)。

前臺服務

針對 Android P 或更高版本並使用前臺服務的應用必須請求 FOREGROUND_SERVICE 權限。 這是普通權限,因此,系統會自動爲請求權限的應用授予此權限。

如果針對 Android P 的應用嘗試創建一個前臺服務且未請求 FOREGROUND_SERVICE,則系統會引發 SecurityException

設備串行訪問限制

Build.SERIAL 字段在 Android 8.0(API 級別 26)中已被棄用。 在 Android P 中,Build.SERIAL 始終設置爲 "UNKNOWN"。 此變更旨在保護用戶的隱私。

如果您的應用需要訪問設備的硬件序列號,您應請求 READ_PHONE_STATE 權限,然後調用 getSerial()

框架安全性變更

如果您的應用以 Android P 爲目標平臺,則系統會執行更嚴格的網絡和文件系統安全保障。 如需瞭解更多詳情,請參閱安全行爲變更頁面上對以 Android P 爲目標平臺的應用做出的變更。

視圖焦點

0 面積的視圖(即寬度或高度爲 0)再也不能被聚焦。

此外,Activity 不再隱式分配觸摸模式下的初始焦點, 而是由您顯式請求初始焦點(如若需要的話)。

Android P 應用支持草案版 CSS 顏色模塊級別 4的行爲,用於處理 4 和 8 個十六進制數字 CSS 顏色。

Chrome 自版本 52 以來便一直支持 CSS 顏色模塊級別 4,但 WebView 目前停用此功能,因爲現有 Android 應用被發現包含 Android ordering (ARGB) 中的 32 位十六進制顏色,這會導致渲染錯誤。

例如,對於以 Android P 之前的 SDK 爲目標的應用,顏色 #80ff8080 目前在 WebView 中被渲染爲不透明淺紅色 (#ff8080)。 先導部分(Android 會將其解讀爲 Alpha 部分)目前被忽略。 如果某個應用以 P 或更高版本爲目標,則它將被解讀爲 50% 透明淺綠 (#80ff80)。

文檔滾動標籤

在 Android P 之前的版本中,滾動位置在 body 元素上設置,根元素的滾動值爲零。 Android P 支持符合標準的行爲,在這種行爲中,滾動元素根元素。

此外,直接訪問 document.body.scrollTop、document.body.scrollLeft、document.documentElement.scrollTop 或 document.documentElement.scrollLeft 會因目標 SDK 的不同而具有不同的行爲。 要訪問視口滾動值,請使用 document.scrollingElement(若有)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

將應用遷移到 Android P

Android P(API 級別 P)引入了行爲變更以及您的應用中可加以利用的新功能和 API。本文概述了將應用遷移到 Android P 的兩個關鍵階段的步驟:

  1. 確保兼容 Android P

驗證您的應用能夠在新版本平臺上全功能運行。在此階段,您不需要使用新的 API,也不需要更改應用的 targetSdkVersion,但可能需要進行一些細微的更改。

  1. 更新您的目標版本並使用 Android P 功能

當您準備好利用平臺的新功能時,將 targetSdkVersion 更新至“P”,驗證應用是否仍可按預期方式運行,然後開始使用新的 API。

https://developer.android.com/preview/images/timeline-with-phases@2x.png

確保兼容 Android P

此處的目標是確保您的現有應用在 Android P(API 級別 P)上照常運行。由於一些平臺變化可能影響應用的行爲方式,因此可能需要進行一些調整,但您不需要使用新的 API 或更改 targetSdkVersion。

 

 

準備一臺運行 Android P 的設備

  • 如果您有一臺兼容設備(Pixel、Pixel XL、Pixel 2、Pixel 2XL),請從下載頁面獲取適合您的設備的 Android P 系統映像,然後按照說明將映像刷入設備。
  • 或下載適用於 Android Emulator 的 Android P 系統映像。它列於 SDK Manager 的 Android P Preview 下,顯示爲 Google APIs Intel x86 Atom System Image

:Developer Preview 系統映像可在 Android Studio 3.1 及更高版本中下載;Android Studio 3.2 提供最佳兼容性。如需瞭解詳細信息,請參閱獲取 Android P SDK

執行兼容性測試

與 Android P(API 級別 P)的兼容性測試多半與您準備發佈應用時執行的測試屬於同一類型。這時有必要回顧一下核心應用質量指南測試最佳實踐

不過,測試還有另一個層面:Android P 向 Android 平臺引入了一些變化,即便不對 targetSdkVersion 做任何變動,仍可能影響應用的行爲或令其根本無法運行。因此,您必須回顧表 1 中的關鍵變化,並對任何爲適應這些變化而實現的修復進行測試。

1. 對運行在 Android P 設備上的所有應用都有影響的關鍵變化。

變化

摘要

對於非 SDK 接口的限制

現已禁止訪問特定的非 SDK 接口,無論是直接訪問,還是通過 JNI 或反射進行間接訪問。嘗試訪問受限制的接口將會生成 NoSuchFieldException 和 NoSuchMethodException 之類的錯誤。有關詳情,請參閱對於非 SDK 接口的限制

移除加密提供程序

從 Android P 開始,Crypto JCA 提供程序現已被移除。調用 SecureRandom.getInstance("SHA1PRNG","Crypto") 將會引發 NoSuchProviderException。

更嚴格的 UTF-8 解碼器

在 Android P 中,針對 Java 語言的 UTF-8 解碼器比以往更嚴格,並且遵循 Unicode 標準。

禁止空閒應用訪問攝像頭、麥克風和傳感器

在應用處於空閒狀態時,不能再訪問攝像頭、麥克風或 SensorManager 傳感器。

如需查看針對 Android P 上運行的所有應用的更詳盡行爲變更列表,請參閱行爲變更文檔。

更新您的目標版本並使用 Android P 功能

此部分解釋如何通過將您的 targetSdkVersion 更新到 P 並增加 Android P 中提供的新功能來實現對 Android P(API 級別 P)的全面支持。

除提供新 API 之外,在您將 targetSdkVersion 更新到 P 時,您會注意到 Android P 還引入了一些行爲變更。由於某些行爲變更可能要求更改代碼以避免衝突,因此,您應先查閱所有適用於針對 Android P 開發的應用的行爲變更,瞭解在您更改 targetSdkVersion 後您的應用會受到哪些影響。

:上述旨在確保平臺兼容性的步驟是針對 Android P 構建應用的先決條件,因此請您務必先完成這些步驟。

 

 

獲取 Android P SDK

您可以使用 Android Studio 3.1 或更高版本獲取 SDK 包,以便利用 Android P(API 級別 P)構建應用。如果您暫時不需要 Android P 中的新功能,只想針對該平臺版本進行編譯,您可以使用 Android Studio 3.1Android Studio 3.2 提供了對 Android P 功能的全面支持。

要設置任一版本的 Android Studio,請按照設置 Android P SDK 和模擬器中介紹的步驟操作。

測試 Android P 應用

完成以上準備工作後,您就可以構建應用,然後對其做進一步測試,以確保 Android P(API 級別 P)爲目標平臺時它能正常工作。這時有必要再次回顧一下核心應用質量指南測試最佳實踐

如果您構建應用時將 targetSdkVersion 設置爲 P,應該注意特定的平臺變化。即便您不實現 Android P 中的新功能,其中的一些變化仍可能嚴重影響應用的行爲或令其根本無法運行。

表 2 列出了這些變化以及可獲得更多信息的鏈接。

2. targetSdkVersion 設置爲“P”時影響應用的關鍵變化。

變化

摘要

前臺服務權限

現在,想要使用前臺服務的應用必須首先請求 FOREGROUND_SERVICE 權限。這是普通權限,因此,系統會自動爲請求權限的應用授予此權限。在未獲得此權限的情況下啓動前臺服務將會引發 SecurityException。

   

棄用 Bouncy Castle 加密

Android P 棄用了幾個來自 Bouncy Castle 提供程序中的加密技術,代之以由 Conscrypt 提供程序提供的加密技術。調用請求 Bouncy Castle 提供程序的 getInstance() 將會生成 NoSuchAlgorithmException 錯誤。要解決這些錯誤,請不要在 getInstance() 中指定提供程序(也就是請求默認實現)。

移除對 Build.serial 的直接訪問

現在,需要 Build.serial 標識符的應用必須請求 READ_PHONE_STATE 權限,然後使用 Android P 中新增的新 Build.getSerial() 函數。

不允許共享 WebView 數據目錄

現在,不允許應用在不同進程之間共享一個 WebView 數據目錄。如果您的應用有多個進程使用 WebView、CookieManager 或 android.webkit 軟件包中的任何其他 API,則在第二個進程調用 WebView 函數時,您的應用將會崩潰。

SELinux 禁止訪問應用的數據目錄

系統強制每個應用的 SELinux 沙盒對每個應用的私有數據目錄強制執行逐個應用的 SELinux 限制。現在,不允許直接通過路徑訪問其他應用的數據目錄。應用可以繼續使用進程間通信 (IPC) 機制(包括通過傳遞 FD)共享數據。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章