這篇文章,是Android官方文檔的中文版本。
注意事項(AndroidP 特性):
(1),android.os.Build.VERSION.RELEASE ,需要當做字符串類型處理。
(2),依賴的第三方 SDK (特別是加固和熱修復框架) 會和系統底層緊密集成 (如使用非公開的接口),而導致應用在 Android 版本升級時無法正常運行。。。注意三方sdk版本更新。
(3),直接使用底層的非 SDK 接口有可能會繞過一些 Android 對用戶的安全性和隱私性方面的保護,不但影響用戶體驗、妨害用戶隱私,也很可能會被 Google Play Protect 判定為惡意軟件而提示用戶卸載應用。
在 Android N 當中,我們限制了 C/C++ 代碼所能使用的符號,從而確保使用 C++ 代碼的 app 能夠始終對接穩定的 NDK 接口,而不會因使用不穩定的非 NDK 接口而頻頻奔潰。自 Android P 起,我們將進一步提升系統穩定性,擴展此類限制至 Java 語言 SDK 接口。
(4),dex2oat 就被設計為系統內部使用的編譯部署工具,Android 從來都未支持過開發者直接調用 dex2oat 的場景。
從 Android O 開始,BaseDexClassLoader 和 DexClassLoader 構造函數中的 “optimizedDirectory” 參數已廢棄,並在加載 dex 文件時不起作用。
(5),篡改 so 文件並不會帶來安全性的提升 (很多工具可以重新生成元數據),反而可能導致應用無法在未來的 Android 版本中啟動 (由於動態鏈接器可能執行更嚴格的檢查)。。不要修改 Android Studio 生成的 dex 和 so 文件。
(6),“This app was built for an older version of Android and may not work properly
升級您應用的 targetSdkVersion 至最新版本.
(7),Android O 開始支持特長屏幕.
如果自適應式 UI 不適合您的場景,可以考慮在 manifest 中的 <activity> 內設置 resizableActivity = false,並加上 android:MaxAspectRatio 來聲明最大支持縱橫比。這會在特長屏幕的設備上啟用兼容模式,把應用邊緣的顯示空間以黑色填充。
發生的變更:
(1),加密變更1
從 Android P 開始,對於 AndroidOpenSSL (也稱為 Conscrypt) 提供程序所重復的、來自於 BC 提供程序的部分功能,我們計划將予以棄用。此舉的目的不是因為對 BC 提供程序的實施安全存在疑慮,而是因為重復功能會造成額外的成本和風險,卻無法帶來太多益處。
如果您按名稱或實例指定提供程序 - 例如,Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC") 或Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC")) - 則 Android P 的行為將取決於您應用的目標 API 級別。對於目標級別為 Android P 或之后版本的應用,調用會拋出 NoSuchAlgorithmException。
(2), 加密變更2
Nougat 開始棄用 Crypto 提供程序。以 API 24 (Nougat) 或之后級別為目標的應用程序請求則會失敗.
在 Android P 中,我們計划完全移除 Crypto 提供程序。在移除后,所有對 SecureRandom.getInstance("SHA1PRNG", "Crypto") 的調用都會拋出 NoSuchProviderException。
(3),加密變更3
P中在Conscrypt中對算法加入了額外的實現,適合參數有AES,DESEDE,OPEP,和EC(僅支持命名的曲線)。此外Android P中已棄用以上參數以及許多算法的BouncyCastle版本。
(4),其他加密變更
* 在使用 PBE 密鑰的情況下,若您的應用未能提供 Bouncy Castle 要求的初始化向量,那么您將收到警告信息;
* ARC4的 Conscrypt 實現允許您指定 ARC4/ECB/NoPadding 或者 ARC4/NONE/NoPadding;
*Android P 移除了 Crypto Java Cryptography Architecture (以下簡稱 JCA) 加密服務提供商。因此,若您的應用調用 SecureRandom.getInstance("SHA1PRNG", "Crypto"),將會引發 NoSuchProviderException 異常;
* 應用從大於密鑰結構的緩沖區中解析 RSA 密鑰時,不再會引發異常。
(5),后台應用程序用戶輸入以及數據隱私
Android P 設備上后台運行,將會受到來自系統的以下限制:
1>您的應用無法訪問麥克風和攝像頭。
2>處於 “連續模式 (continuous)” 的傳感器 (如加速傳感器或者陀螺儀) 將無法接收事件。
3>處於 “變化模式 (on-change)” 或者 “單次模式 (one-shot)” 的傳感器無法接受事件。
**若您的應用須在 Android P 設備上檢測傳感器事件,請使用前台服務。
(6),設備安全變更
運行 Android P 的設備提供密鑰輪替以及系統調用保護。不論您的應用針對哪個級別的 API,此類變更都能顯著提升應用安全性。
(7),應用兼容性變更
平台將限制使用非 SDK 接口。不論開發者是直接還是間接 (如通過反射、JNI 等) 試圖訪問這些接口都會受到限制。在開發者預覽版 1 (DP1) 中,您的應用可以繼續訪問此類限制接口,不過平台會通過顯示 Toast 以及記錄日志消息引起開發者注意。若您的應用顯示此類 Toast,您必須棄用限制接口並改用另一種實現策略。若您認為沒有可行的替代接口,請在留言給谷歌官方,要求重新考慮該限制是否合理。
(8),更新 ICU 庫
平台使用的 ICU 庫已更新至 ICU 58 版本;Android 8.0 (API 版本 26) 和8.1 (API 等級 27) 使用的 ICU 庫則更新至 ICU 60 版本。
ICU 可將公開 API 遷移至 android.icu 軟件包,同時 ICU 也供 Android 平台內部使用,用於支持國際化開源項目,譬如說,開發者可以利用 ICU 在 java.util、 java.text 和 android.text.format 中實現 Android 類。此版本 ICU 包括一系列小而實用的更改項,如 Emoji 5.0 數據支持、日期 / 時間格式優化 (詳情可閱讀 ICU 59 和 ICU 60 發布說明)。開發者們須要尤其注意以下幾點:
* 平台時區處理方式更變平台更好地處理 GTM (格林威治標准時間) 以及 UTC (協調世界時)
* java.text.SimpleDateFormat 現使用 ICU 為 UTC 和 GMT 提供顯示名稱
* 解析 zzzz 能識別諸如 "Universal Coordinated Time" 和 "Greenwich Mean Time" 的字符串
Asia/Hanoi 不再屬於被認可的時區
* 即使在解析合法 CURRENCY 文本時,android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String) 方法可能拋出 ParseException 異常。開發者可以調用NumberFormat.parseCurrency 規避該問題。Android 7.0 (API 等級 24) 版本開始引入NumberFormat.parseCurrency 函數,用於處理類似 PLURALCURRENCYSTYLE 的 CURRENCY 文本。
(9),不再支持 Android 安全加密文件
* Android 加密文件 (ASEC) 最早在 Android 2.2 (API 等級 8) 引入,用於支持 apps-on-SD-card 功能。Android 6.0 (API 等級 23) 已替換並棄用了安全加密文件,同時引入了 “可采用的 SK 卡 (adoptable SD card)” 功能;
* Android 8.0 (API 等級 26) 阻止往安全加密文件中安裝新應用。Android P 的開發者預覽版則徹底移除了安全加密文件功能。
(10),測試套件構建行為變更
Android P 移除了 TestSuiteBuilder 類中的 addRequirements() 方法,並且將 TestSuiteBuilder 類標記為棄用。此 addRequirements() 方法要求開發者提供隱藏 API 類型的參數,使得 API 無效。
(11),測試從平台中移除的庫
在 Android 8.1 (API 等級 27) 或更低版本系統中,Android 平台提供一系列類,如 ActivityInstrumentationTestCase2,供開發者在應用內創建測試。進行編譯時,開發者可以在構建android.jar 文件時可以獲取這些類。內置測試架構盡管十分簡便,但它要求開發者針對 android.jar 提供的 JUnit 版本進行測試,因此會對依賴其它版本 JUnit 進行的構建和測試造成一定困難。
為了讓開發者能夠靈活地構建以及測試定制化或三方邏輯,Android P 從平台中移除了測試類。不過,將測試庫仍然作為可選依賴項提供。
// Required if using classes in android.test.runner
useLibrary 'android.test.runner'
// Required if using classes in android.test.base
useLibrary 'android.test.base'
// Required if using classes in android.test.mock
useLibrary 'android.test.mock'
<!-- You don't need to include android:required="false" if your app's
minSdkVersion is 'P'. -->
<uses-library android:name="android.test.runner" android:required="false" />
(12),Java UTF 解碼器
UTF-8 是 Android 的默認字符集。開發者可利用類似 String(byte[] bytes) 的字符串構造函數解碼 UTF-8字節串。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 80” 的起始部分可以是 “F4 80 80”,但是任何規范字節串都不能以 “C0” 開頭。因此,輸出應為 “A\ufffd\ufffdA\ufffdA”;
* 若要在 Android P 上解碼修正 UTF-8 / CESU-8 代碼,請調用 DataInputStream.readUTF() 方法或者 NewStringUTF() JNI 方法。
(13),使用證書驗證主機名稱
RFC 2818 描述了兩種方法匹配主機名與證書:使用 subjectAltName (SAN) 擴展中的已有名稱;若無 SAN 擴展,則使用 commonName (CN)。
不過,RFC2818已棄用 CN;因此 Android 也不再支持使用 CN。要驗證一個主機名,服務器必須提供含有匹配 SAN 的證書;若證書中的 SAN 和主機名不匹配,該證書不再被信任。
(14),網絡地址查找可能導致網絡違規
涉及域名解析的網絡地址查找可能須要使用網絡 I / O,因而屬於阻塞操作 (blocking operation);而阻塞造作是導致中斷和卡頓 (jank) 的主要元凶。
StrictMode 類是一款幫助開發者檢測代碼問題的開發工具,它能夠檢測到由涉及域名解析的網絡地址查找導致的網絡違規。
開發者不可以在 StrictMode 激活狀態下待機應用,否則,應用可能產生新的異常,比如:使用 detectNetwork() 或 detectAll() 方法獲取策略來偵測網絡違規時,會產生 NetworkOnMainThreadException 異常。
解析數字 IP 地址不屬於阻塞操作,且 Android P 和更低版本 Android 系統采用同樣的解析方法。
(15),Socket 標記
在版本低於 Android P 的平台中,如果用 setThreadStatsTag() 方法標記某個 socket,那么通過 ParcelFileDescriptor 容器使用 binder IPC 將該 socket 傳送到其它線程時,該 socket 會被取消標記。
從 Android P 開始,即使使用 binder IPC 將標記的 socket 傳送到其它線程中,此標記也不會被取消。該變更會影響網絡流量統計數據,比如,在調用 queryDetailsForUidTag() 方法時。您可以在傳送 socket 標記到其它線程之前,調用 untagSocket() 來保留以前的行為。
(16),報告 socket 中可用字節數量
觸發shutdownInput() 方法后,調用 available() 方法會返回 0 值。
(17),更詳細的 VPN 網絡能力報告
在低於 Android P 版本的平台中, NetworkCapabilities 類僅報告部分 VPN 信息,如包含 TRANSPORT_VPN 但不含 NET_CAPABILITY_NOT_VPN。這讓應用開發者難以確定 VPN 的使用是否對用戶產生費用。比如說,檢測 NET_CAPABILITY_NOT_METERED 並不能確定應用使用的網絡是否按流量計費。
從 Android P 起,當 VPN 調用 setUnderlyingNetworks() 方法時,系統會合並所有底層網絡的傳輸以及能力,並將合並后的結果作為 “VPN 網絡的有效能力” 返回。
已經設定過 NET_CAPABILITY_NOT_METERED 的開發者們從 Android P 開始就可以接收到 VPN 以及底層網絡的能力
(18),應用不再能訪問 xt_qtaguid 文件夾中的文件
應用不再能直接讀取 /proc/net/xt_qtaguid 文件夾中的文件,這一舉措是為了與部分發售時就運行 Android P 的設備保持一致,而這些設備根本沒有此類文件。
諸如 TrafficStats 和 NetworkStatsManager 此類依賴這些文件的公開 API 不會受到影響。但是,不受支持的 cutils 功能,如 qtaguid_tagSocket(),可能無法在不同的設備上按預期工作 (或者完全不能工作)。
(19),強制性 FLAG_ACTIVITY_NEW_TASK 要求
在 Android P 中,除非使用了 FLAG_ACTIVITY_NEW_TASK intent flag,您不能在非 Activity 場景下啟動 Activity。若您未使用這個 intent flag 就嘗試啟動 Activity,系統無法正常開啟活 Activity,並會在日志中留下相應信息。
* 注意:FLAG_ACTIVITY_NEW_TASK 標簽的要求屬為預期行為,並且從 Android N 就對此作了強制要求。但是 Android N 系統中的錯誤暫時導致此要求沒有被強制執行。
(20),屏幕旋轉變更
Android O 用戶可在快速設定或屏幕設定界面進行操作,在自動旋轉和固定豎屏模式之間進行選擇。Android P 對豎屏旋轉模式引入幾大重要變更。豎屏模式更名為 “旋轉鎖定”,並且只有當自動旋轉模式關閉情況下,該模式才能被激活。自動旋轉模式暫無變更。
當設備處於旋轉鎖定模式時,用戶可以將屏幕鎖定在頂層可見 Activity 支持的任何方向。Activity 不能假定屏幕永遠處於豎屏狀態。如果頂層 Activity 在自動旋轉模式下支持多個方向,旋轉鎖定模式也應給予相同選項,但可根據 Activity 的 screenOrientation 設置規定列外情況 (詳情見下表)。
請求特定方向 (如,screenOrientation=landscape) 的 Activity 會忽略用戶鎖定偏好,並與 Android O 行為一致。
可在 Android Manifest 中的 Activity 級別的選項中設置屏幕方向偏好,或者調用 setRequestedOrientation() 來設定。
WindowManger 在處理 Activity 旋轉時會使用用戶屏幕旋轉偏好設置,而 “旋轉鎖定模式” 也是通過設置該偏好來工作的。在下列情況中,用戶屏幕旋轉偏好可能會發生更改。請注意,Activity 傾向於回到豎屏狀態:
當用戶接受旋屏建議時,屏幕旋轉偏好會更改至建議狀態;
當用戶跳轉到只支持豎屏的應用時 (包括鎖屏或者桌面啟動器),屏幕旋轉偏好會更改至豎屏狀態。
Android P 以及之后的變更
(21),前台服務
針對 Android P 或更高平台開發的應用必須請求 FOREGROUND_SERVICE 權限才能使用前台服務。 FOREGROUND_SERVICE 屬於普通級別請求,因此提出請求后,系統會自動授予。
若應用未提出 FOREGROUND_SERVICE 請求就試圖創建前台服務,系統會拋出 SecurityException 異常。
(22),設備序列號訪問限制
Android 8.0 (API等級26) 已棄用 Build.SERIAL 字段;從 Android P 開始,Build.SERIAL 始終設定為 "UNKNOWN"。此項變更能夠保護用戶隱私。
若您的應用須要訪問設備硬件序列號,您應該請求 READ_PHONE_STATE 權限,然后調用 getSerial()。
(23),視圖焦距
零區域視圖 (即長或寬的值為 0) 不再能夠設定焦點。
另外,在 touch-mode 下 Activity 不再隱式分配初始焦點,而是要求開發者在需要的情況下對初始焦點提出顯式要求。
Android P 應用允許 CSS Color Module Level 4 行為,用於操作 4 位和 8 位十六進制 CSS 顏色。
Chrome 從 52 版本開始支持 CSS Color Module Level 4,但是 WebView 目前暫時禁用該功能,因為存在現有 Android 應用在 Android ordering (ARGB) 中包含 32 位十六進制顏色,這可能會導致渲染錯誤。
(24),文檔滾動元素
在 Android P 之前,滾動位置被設置在 body 元素上,而根元素的滾動值為 0。Android P 支持符合標准的行為,即滾動元素為根元素。
此外,根據目標 SDK 不同,直接訪問 document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop 或 document.documentElement.scrollLeft 會產生不同行為。要訪問視口滾動值,請使用 document.scrollingElement (如果可用)。
Android P Beta 版本:
- Get Android P Beta on a Pixel 2, Pixel 2 XL, Pixel, or Pixel XL device
- Get Android P Beta on selected partner devices
- Set up an Android Emulator to run Android P Beta
Android 2018 I/O 大會第一批正式分發手機品牌:
Pixel、Pixel XL、Pixel 2、Pixel 2 X,Nokia 7 Plus 6GB+64GB版本,OPPO R15,索尼Xperia XZ2,vivo X21,小米MIX 2S