Android 9.0 (API 28) 適配
針對所有API級別的應(yīng)用
電源管理
幫助確保系統(tǒng)資源被提供給最需要它們的應(yīng)用,詳情參閱電源管理
隱私權(quán)
-
后臺對傳感器的訪問受限
App后臺運(yùn)行時,以下行為受限
訪問麥克風(fēng)和攝像頭
使用連續(xù)報告模式的傳感器(加速度計、陀螺儀等)不會接收事件
使用變化或一次性報告模式的傳感器不會接收事件
-
限制訪問通話記錄
引入CALL_LOG權(quán)限組,把READ_CALL_LOG、WRIT_CALL_LOG、PROCESS_OUTGOING_CALLS移入該組(以前在PHONE權(quán)限組)。
-
限制訪問電話號碼
要從手機(jī)狀態(tài)中讀取電話號碼,需要:
- 要通過PHONE_STATE Intent讀取,需要READ_CALL_LOG和READ_PHONE_STATE權(quán)限
- 要通過
onCallStateChanged()讀取,只需要READ_CALL_LOG權(quán)限
-
限制訪問WiFi位置和連接信息
- WiFi掃描限制更嚴(yán)格,詳情參閱Wi-Fi 掃描限制
-
getConnectionInfo()函數(shù)返回的WifiInfo對象受限,只有當(dāng)App具有以下權(quán)限時,才能獲得SSID和BSSID:- ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
- 還需要在設(shè)備上啟用位置服務(wù)(Settings > Location)
WiFi服務(wù)函數(shù)移除多余信息
在 Android 9 中,下列事件和廣播不接收用戶位置或個人可識別數(shù)據(jù)方面的信息:
WifiManager中的getScanResults()和getConnectionInfo()函數(shù)。WifiP2pManager中的 [discoverServices()](https://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html?hl=zh-cn#discoverServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener)) 和 [addServiceRequest()](https://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html?hl=zh-cn#addServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener)) 函數(shù)。NETWORK_STATE_CHANGED_ACTION廣播。Wi-Fi 的
NETWORK_STATE_CHANGED_ACTION系統(tǒng)廣播不再包含 SSID(之前為 EXTRA_SSID)、BSSID(之前為 EXTRA_BSSID)或連接信息(之前為 EXTRA_NETWORK_INFO)。 如果應(yīng)用需要此信息,請改為調(diào)用getConnectionInfo()。
-
電話信息依賴設(shè)備定位設(shè)置
如果停用設(shè)備定位,則以下函數(shù)不提供結(jié)果:
non-sdk api的限制
為幫助確保應(yīng)用穩(wěn)定性和兼容性,此平臺對某些非 SDK 函數(shù)和字段的使用進(jìn)行了限制;無論您是直接訪問這些函數(shù)和字段,還是通過反射或 JNI 訪問,這些限制均適用。 在 Android 9 中,您的應(yīng)用可以繼續(xù)訪問這些受限的接口;該平臺通過 toast 和日志條目提醒您注意這些接口。 如果您的應(yīng)用顯示這樣的 toast,則必須尋求受限接口之外的其他實(shí)現(xiàn)策略。 詳情參閱對非 SDK 接口的限制
| 列表 | 說明 |
|---|---|
| 黑名單 | 無論您應(yīng)用的目標(biāo) API 級別是什么,您都無法使用此列表中的非 SDK 接口。如果您的應(yīng)用嘗試訪問其中任何一個接口,系統(tǒng)就會拋出錯誤。 |
| 灰名單 | 只要在您應(yīng)用的目標(biāo) API 級別不限制此列表中的非 SDK 接口,您就可以使用它們。 從 Android 9(API 級別 28)開始,我們在每個 API 級別分別會限制某些非 SDK 接口。如果您應(yīng)用的目標(biāo) API 級別較低,您可以訪問灰名單中的受限 API,但如果您的應(yīng)用嘗試訪問在您的目標(biāo) API 級別受限的非 SDK 接口,系統(tǒng)就會假定此 API 已列入黑名單。 注意:在 Android 9(API 級別 28)中,非受限灰名單中的非 SDK 接口稱為淺灰名單,而受限灰名單中的非 SDK 接口稱為深灰名單。 |
| 白名單 | 此列表中的接口已在 Android 框架軟件包索引中正式記錄,它們是受支持的接口,您可以自由使用。 |
-
使用veridex工具測試
veridex 工具會掃描 APK 的整個代碼庫(包括所有第三方庫),并報告發(fā)現(xiàn)的所有使用非 SDK 接口的行為。但是也有局限性:
- 無法檢測到通過 JNI 實(shí)現(xiàn)的調(diào)用。
- 只能檢測到一部分通過反射實(shí)現(xiàn)的調(diào)用。
- 對非活動代碼路徑的分析僅限于 API 級別的檢查。
-
運(yùn)行StrictMode API測試
使用
detectNonSdkApiUsage方法來啟用此 API。啟用StrictModeAPI 后,您可以使用 [penaltyListener](https://developer.android.com/reference/android/os/StrictMode.VmPolicy.BuilderpenaltyListener(java.util.concurrent.Executor, android.os.StrictMode.OnVmViolationListener)?hl=zh-cn) 來接收每次使用非 SDK 接口的行為所對應(yīng)的回調(diào),并且您可以在其中實(shí)現(xiàn)自定義處理。回調(diào)中提供的Violation對象派生自Throwable,并且封閉式堆棧軌跡會提供相應(yīng)使用行為的上下文。 -
使用可調(diào)試的應(yīng)用測試
通過在搭載 Android 9(API 級別 28)或更高版本的設(shè)備或模擬器上構(gòu)建和運(yùn)行可調(diào)試應(yīng)用來測試該應(yīng)用是否使用非 SDK 接口。請確保您使用的設(shè)備或模擬器與您應(yīng)用的目標(biāo) API 級別相匹配。
在您的應(yīng)用上運(yùn)行測試時,如果該應(yīng)用訪問了某些非 SDK 接口,系統(tǒng)就會輸出一條日志消息。您可以檢查應(yīng)用的日志消息,查找以下詳細(xì)信息:
- 聲明的類、名稱和類型(采用 Android 運(yùn)行時所使用的格式)。
- 訪問方式:鏈接、反射或 JNI
- 所訪問的非 SDK 接口屬于哪個列表。
您可以使用
adb logcat來查看這些日志消息,這些消息顯示在所運(yùn)行應(yīng)用的 PID 下。舉例而言,日志中可能包含如下條目:Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
安全行為變更
設(shè)備安全性變更
傳輸層安全協(xié)議(TLS)實(shí)現(xiàn)變更
###### 更嚴(yán)格的SECCOMP過濾器
加密變更
參數(shù)和算法的 Conscrypt 實(shí)現(xiàn)
其他變更
不再支持Android安全加密文件
詳情參閱安全行為變更
ICU更新
? 升級ICU庫到60。受影響內(nèi)容:
- 更好的區(qū)分GMT和UTC
- java.text.SimpleDateFormat的使用
- java.text.DateFormatSymbols.getZoneStrings()的使用
- 亞洲/河內(nèi)不再是可識別的時區(qū)
- 使用NumberFormat.parseCurrency代替android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String)去解析幣種文本
詳情參閱ICU更新
Android Test變更
詳情參閱Android Test變更
Java UTF解碼器
UTF-8 是 Android 中的默認(rèn)字符集。 UTF-8 字節(jié)序列可由
String(byte[] bytes)之類的String構(gòu)造函數(shù)解碼。Android 9 中的 UTF-8 解碼器遵循比以前版本中更嚴(yán)格的 Unicode 標(biāo)準(zhǔn): 這些變更包括:
- 非最短形式的 UTF-8(例如
<C0, AF>)被視為格式不正確。- 替代形式的 UTF-8(例如
U+D800..U+DFFF)被視為格式不正確。- 最大的子部分被單個
U+FFFD取代。 例如,在字節(jié)序列“41 C0 AF 41 F4 80 80 41”中,最大子部分為“C0”、“AF”和“F4 80 80”。其中“F4 80 80”可以是“F4 80 80 80”的初始子序列,但“C0”不能是任何形式正確的代碼單位序列的初始子序列。 因此,輸出應(yīng)為“A\ufffd\ufffdA\ufffdA”。- 要在 Android 9 或更高版本中解碼修改后的 UTF-8/CESU-8 序列,請使用
DataInputStream.readUTF()函數(shù)或NewStringUTF()JNI 函數(shù)。
使用證書的主機(jī)名校驗(yàn)
RFC 2818中介紹了兩種對照證書匹配域名的方法—使用
subjectAltName(SAN) 擴(kuò)展程序中的可用名稱,或者在沒有SAN擴(kuò)展程序的情況下,回退到commonName(CN)。然而,在 RFC 2818 中,回退到
CN已被棄用。因此,Android 不再回退到使用CN。 要驗(yàn)證主機(jī)名,服務(wù)器必須出示具有匹配SAN的證書。 不包含與主機(jī)名匹配的SAN的證書不再被信任。
網(wǎng)絡(luò)地址查詢可能導(dǎo)致網(wǎng)絡(luò)違規(guī)
不運(yùn)行在UI Thread中做網(wǎng)絡(luò)請求,任何時候!
套接字標(biāo)記
報告的套接字中可用字節(jié)數(shù)
? 在調(diào)用 shutdownInput() 函數(shù)后,available() 函數(shù)會在調(diào)用時返回 0。
更詳盡的VPN網(wǎng)絡(luò)功能報告
在 Android 8.1(API 級別 28)及更低版本中,
NetworkCapabilities類僅報告 VPN 的有限信息,例如TRANSPORT_VPN,但會省略NET_CAPABILITY_NOT_VPN。 信息有限導(dǎo)致難以確定使用 VPN 是否會導(dǎo)致對應(yīng)用的用戶收費(fèi)。 例如,檢查NET_CAPABILITY_NOT_METERED并不能確定底層網(wǎng)絡(luò)是否按流量計費(fèi)。從 Android 9 及更高版本開始,當(dāng) VPN 調(diào)用
setUnderlyingNetworks()函數(shù)時,Android 系統(tǒng)將會合并任何底層網(wǎng)絡(luò)的傳輸和能力并返回 VPN 網(wǎng)絡(luò)的有效網(wǎng)絡(luò)能力作為結(jié)果。在 Android 9 及更高版本中,已經(jīng)檢查
NET_CAPABILITY_NOT_METERED的應(yīng)用將收到關(guān)于 VPN 網(wǎng)絡(luò)能力和底層網(wǎng)絡(luò)的信息。
應(yīng)用不再能訪問xt_qtaguid文件夾中的文件
從 Android 9 開始,不再允許應(yīng)用直接讀取
/proc/net/xt_qtaguid文件夾中的文件。 這樣做是為了確保與某些根本不提供這些文件的設(shè)備保持一致。依賴這些文件的公開 API
TrafficStats和NetworkStatsManager繼續(xù)按照預(yù)期方式運(yùn)行。 然而,不受支持的 cutils函數(shù)(例如qtaguid_tagSocket())在不同設(shè)備上可能不會按照預(yù)期方式運(yùn)行 — 甚至根本不運(yùn)行。
現(xiàn)在強(qiáng)制執(zhí)行 FLAG_ACTIVITY_NEW_TASK 要求
? 在 Android 9 中,您不能從非 Activity 環(huán)境中啟動 Activity,除非您傳遞 Intent 標(biāo)志 FLAG_ACTIVITY_NEW_TASK。 如果您嘗試在不傳遞此標(biāo)志的情況下啟動 Activity,則該 Activity 不會啟動,系統(tǒng)會在日志中輸出一則消息。
屏幕旋轉(zhuǎn)變更
從 Android 9 開始,對縱向旋轉(zhuǎn)模式做出了重大變更。 在 Android 8.0(API 級別 26)中,用戶可以使用 Quicksettings 圖塊或 Display 設(shè)置在自動屏幕旋轉(zhuǎn)和縱向旋轉(zhuǎn)模式之間切換。 縱向模式已重命名為旋轉(zhuǎn)鎖定,它會在自動屏幕旋轉(zhuǎn)關(guān)閉時啟用。 自動屏幕旋轉(zhuǎn)模式?jīng)]有任何變更。
當(dāng)設(shè)備處于旋轉(zhuǎn)鎖定模式時,用戶可將其屏幕鎖定到頂層可見 Activity 所支持的任何旋轉(zhuǎn)。 Activity 不應(yīng)假定它將始終以縱向呈現(xiàn)。 如果頂層 Activity 可在自動屏幕旋轉(zhuǎn)模式下以多種旋轉(zhuǎn)呈現(xiàn),則應(yīng)在旋轉(zhuǎn)鎖定模式下提供相同的選項(xiàng),根據(jù) Activity 的
screenOrientation設(shè)置,允許存在一些例外情況(見下表)。請求特定屏幕方向(例如,
screenOrientation=landscape)的 Activity 會忽略用戶鎖定首選項(xiàng),并且行為與 Android 8.0 中的行為相同。可在 Android Manifest 中,或以編程方式通過 setRequestedOrientation() 在 Activity 級別設(shè)置屏幕方向首選項(xiàng)。
旋轉(zhuǎn)鎖定模式通過設(shè)置 WindowManager 在處理 Activity 旋轉(zhuǎn)時使用的用戶旋轉(zhuǎn)首選項(xiàng)來發(fā)揮作用。 用戶旋轉(zhuǎn)首選項(xiàng)可能在下列情況下發(fā)生變更。 請注意,恢復(fù)設(shè)備的自然旋轉(zhuǎn)存在偏差,對于外形與手機(jī)類似的設(shè)備通常設(shè)置為縱向:
- 當(dāng)用戶接受旋轉(zhuǎn)建議時,旋轉(zhuǎn)首選項(xiàng)變?yōu)榻ㄗh方向。
- 當(dāng)用戶切換到強(qiáng)制縱向應(yīng)用(包括鎖定屏幕或啟動器)時,旋轉(zhuǎn)首選項(xiàng)變?yōu)榭v向。
下表總結(jié)了常見屏幕方向的旋轉(zhuǎn)行為:
屏幕方向 行為 未指定、user 在自動屏幕旋轉(zhuǎn)和旋轉(zhuǎn)鎖定下,Activity 可以縱向或橫向(以及顛倒縱向或橫向)呈現(xiàn)。 預(yù)期同時支持縱向和橫向布局。 userLandscape 在自動屏幕旋轉(zhuǎn)和旋轉(zhuǎn)鎖定下,Activity 可以橫向或顛倒橫向呈現(xiàn)。 預(yù)期只支持橫向布局。 userPortrait 在自動屏幕旋轉(zhuǎn)和旋轉(zhuǎn)鎖定下,Activity 可以縱向或顛倒縱向呈現(xiàn)。 預(yù)期只支持縱向布局。 fullUser 在自動屏幕旋轉(zhuǎn)和旋轉(zhuǎn)鎖定下,Activity 可以縱向或橫向(以及顛倒縱向或橫向)呈現(xiàn)。 預(yù)期同時支持縱向和橫向布局。 旋轉(zhuǎn)鎖定用戶將可選擇鎖定到顛倒縱向,通常為 180o。 sensor、fullSensor、sensorPortrait、sensorLandscape 忽略旋轉(zhuǎn)鎖定模式首選項(xiàng),視為自動屏幕旋轉(zhuǎn)已啟用。 請僅在例外情況下并經(jīng)過仔細(xì)的用戶體驗(yàn)考量后再使用此項(xiàng)。
Apache HTTP 客戶端棄用影響采用非標(biāo)準(zhǔn) ClassLoader 的應(yīng)用
在 Android 6.0 中,我們?nèi)∠藢?Apache HTTP 客戶端的支持。
此變更對大多數(shù)不以 Android 9 或更高版本為目標(biāo)的應(yīng)用沒有任何影響。 不過,此變更會影響使用非標(biāo)準(zhǔn)
ClassLoader結(jié)構(gòu)的某些應(yīng)用,即使這些應(yīng)用不以 Android 9 或更高版本為目標(biāo)平臺。如果應(yīng)用使用顯式委托到系統(tǒng)
ClassLoader的非標(biāo)準(zhǔn)ClassLoader,則應(yīng)用會受到影響。 在org.apache.http.*中查找類時,這些應(yīng)用需要委托給應(yīng)用ClassLoader。 如果它們委托給系統(tǒng)ClassLoader,則應(yīng)用在 Android 9 或更高版本上將失敗并顯示NoClassDefFoundError,因?yàn)橄到y(tǒng)ClassLoader不再識別這些類。 為防止將來出現(xiàn)類似問題,一般情況下,應(yīng)用應(yīng)通過應(yīng)用ClassLoader加載類,而不是直接訪問系統(tǒng)ClassLoader。
枚舉相機(jī)
? 在 Android 9 設(shè)備上運(yùn)行的應(yīng)用可以通過調(diào)用 getCameraIdList() 發(fā)現(xiàn)每個可用的攝像頭。 應(yīng)用不應(yīng)假定設(shè)備只有一個后置攝像頭或只有一個前置攝像頭。
針對 Target >= 9.0 的應(yīng)用
前臺服務(wù)
? 針對 Android 9 或更高版本并使用前臺服務(wù)的應(yīng)用必須請求 FOREGROUND_SERVICE 權(quán)限。 這是普通權(quán)限,因此,系統(tǒng)會自動為請求權(quán)限的應(yīng)用授予此權(quán)限。未請求權(quán)限就創(chuàng)建服務(wù)會引起SecurityException
隱私權(quán)變更
構(gòu)建序列號棄用
? 在 Android 9 中,Build.SERIAL 始終設(shè)置為 "UNKNOWN" 以保護(hù)用戶的隱私。如果您的應(yīng)用需要訪問設(shè)備的硬件序列號,您應(yīng)改為請求 READ_PHONE_STATE 權(quán)限,然后調(diào)用 getSerial()。
DNS 隱私
? 以 Android 9 為目標(biāo)平臺的應(yīng)用應(yīng)采用私有 DNS API。 具體而言,當(dāng)系統(tǒng)解析程序正在執(zhí)行 DNS-over-TLS 時,應(yīng)用應(yīng)確保任何內(nèi)置 DNS 客戶端均使用加密的 DNS 查找與系統(tǒng)相同的主機(jī)名,或停用它而改用系統(tǒng)解析程序。
框架安全性變更
默認(rèn)情況下啟用網(wǎng)絡(luò)傳輸層安全協(xié)議 (TLS)
? 如果您的應(yīng)用以 Android 9 或更高版本為目標(biāo)平臺,則默認(rèn)情況下 isCleartextTrafficPermitted() 函數(shù)返回 false。 如果您的應(yīng)用需要為特定域名啟用明文,您必須在應(yīng)用的網(wǎng)絡(luò)安全性配置中針對這些域名將 cleartextTrafficPermitted 顯式設(shè)置為 true
按進(jìn)程分設(shè)基于網(wǎng)絡(luò)的數(shù)據(jù)目錄
為改善 Android 9 中的應(yīng)用穩(wěn)定性和數(shù)據(jù)完整性,應(yīng)用無法再讓多個進(jìn)程共用同一
WebView數(shù)據(jù)目錄。 此類數(shù)據(jù)目錄一般存儲 Cookie、HTTP 緩存以及其他與網(wǎng)絡(luò)瀏覽有關(guān)的持久性和臨時性存儲。在大多數(shù)情況下,您的應(yīng)用只應(yīng)在一個進(jìn)程中使用
android.webkit軟件包中的類,例如WebView和CookieManager。 例如,您應(yīng)該將所有使用WebView的Activity對象移入同一進(jìn)程。 您可以通過在應(yīng)用的其他進(jìn)程中調(diào)用disableWebView(),更嚴(yán)格地執(zhí)行“僅限一個進(jìn)程”規(guī)則。 該調(diào)用可防止WebView在這些其他進(jìn)程中被錯誤地初始化,即使是從依賴內(nèi)容庫進(jìn)行的調(diào)用也能防止。如果您的應(yīng)用必須在多個進(jìn)程中使用
WebView的實(shí)例,則必須先利用WebView.setDataDirectorySuffix()函數(shù)為每個進(jìn)程指定唯一的數(shù)據(jù)目錄后綴,然后再在該進(jìn)程中使用WebView的給定實(shí)例。 該函數(shù)會將每個進(jìn)程的網(wǎng)絡(luò)數(shù)據(jù)放入其在應(yīng)用數(shù)據(jù)目錄內(nèi)自己的目錄中。注:即使您使用
setDataDirectorySuffix(),系統(tǒng)也不會跨應(yīng)用的進(jìn)程界限共享 Cookie 以及其他網(wǎng)絡(luò)數(shù)據(jù)。 如果應(yīng)用中的多個進(jìn)程需要訪問同一網(wǎng)絡(luò)數(shù)據(jù),您需要自行在這些進(jìn)程之間復(fù)制數(shù)據(jù)。 例如,您可以調(diào)用getCookie()和 [setCookie()](https://developer.android.com/reference/android/webkit/CookieManager.html?hl=zh-cn#setCookie(java.lang.String, java.lang.String, android.webkit.ValueCallback)),在不同進(jìn)程之間手動傳輸 Cookie 數(shù)據(jù)。
以應(yīng)用為單位的 SELinux 域名
以 Android 9 或更高版本為目標(biāo)平臺的應(yīng)用無法利用可全球訪問的 Unix 權(quán)限與其他應(yīng)用共享數(shù)據(jù)。 此變更可改善 Android 應(yīng)用沙盒的完整性, 具體地講,就是要求應(yīng)用的私有數(shù)據(jù)只能由該應(yīng)用訪問。要與其他應(yīng)用共享文件,請使用 content provider。
連接變更
連接數(shù)據(jù)計數(shù)和多路徑
在以 Android 9 或更高版本為目標(biāo)平臺的應(yīng)用中,系統(tǒng)計算并非當(dāng)前默認(rèn)網(wǎng)絡(luò)的網(wǎng)絡(luò)流量,例如,當(dāng)設(shè)備連接 WLAN 時的蜂窩流量,并在
NetworkStatsManager類中提供函數(shù)以查詢該流量。具體而言,
getMultipathPreference()現(xiàn)在將返回一個基于上述網(wǎng)絡(luò)流量的值。 從 Android 9 開始,此函數(shù)針對蜂窩數(shù)據(jù)返回true,但當(dāng)超過一天內(nèi)累積的特定流量時,它將開始返回false。 在 Android 9 上運(yùn)行的應(yīng)用必須調(diào)用此函數(shù)并采用此提示。
ConnectivityManager.NetworkCallback類現(xiàn)在將有關(guān) VPN 的信息發(fā)送到應(yīng)用。 此變更讓應(yīng)用偵聽連接事件變得更容易,而無需混用同步和異步調(diào)用,也無需使用有限的 API。 此外,它還意味著將設(shè)備同時連接至多個 WLAN 網(wǎng)絡(luò)或多個蜂窩網(wǎng)絡(luò)時,信息傳輸可按預(yù)期工作。
Apache HTTP 客戶端棄用
在 Android 6.0 中,我們?nèi)∠藢?Apache HTTP 客戶端的支持。 從 Android 9 開始,默認(rèn)情況下該內(nèi)容庫已從 bootclasspath 中移除且不可用于應(yīng)用。
要繼續(xù)使用 Apache HTTP 客戶端,以 Android 9 及更高版本為目標(biāo)的應(yīng)用可以向其
AndroidManifest.xml添加以下內(nèi)容:<uses-library android:name="org.apache.http.legacy" android:required="false"/>注:擁有最低 SDK 版本 23 或更低版本的應(yīng)用需要
android:required="false"屬性,因?yàn)樵?API 級別低于 24 的設(shè)備上,org.apache.http.legacy庫不可用。 (在這些設(shè)備上,Apache HTTP 類在 bootclasspath 中提供。)作為使用運(yùn)行時 Apache 庫的替代,應(yīng)用可以在其 APK 中綁定自己的
org.apache.http庫版本。 如果進(jìn)行此操作,您必須將該庫重新打包(使用一個類似 Jar Jar 的實(shí)用程序)以避免運(yùn)行時中提供的類存在類兼容性問題。
界面變更
View Focus
? 0 面積的視圖(即寬度或高度為 0)再也不能被聚焦。Activity 不再隱式分配觸摸模式下的初始焦點(diǎn),需要的話要顯式請求初始焦點(diǎn)。
CSS RGBA 十六進(jìn)制值處理
以 Android 9 或更高版本為目標(biāo)的應(yīng)用必須支持草案版 CSS 顏色模塊級別 4 的行為,用于處理 4 和 8 個十六進(jìn)制數(shù)字 CSS 顏色。
Chrome 自版本 52 以來便一直支持 CSS 顏色模塊級別 4,但 WebView 目前停用此功能,因?yàn)楝F(xiàn)有 Android 應(yīng)用被發(fā)現(xiàn)包含 Android ordering (ARGB) 中的 32 位十六進(jìn)制顏色,這會導(dǎo)致渲染錯誤。
例如,對于以 API 級別 27 或更低版本為目標(biāo)平臺的應(yīng)用,顏色
#80ff8080目前在 WebView 中被渲染為不透明淺紅色 (#ff8080)。 先導(dǎo)部分(Android 會將其解讀為 Alpha 部分)目前被忽略。 如果某個應(yīng)用以 API 級別 28 或更高版本為目標(biāo),則#80ff8080將被解讀為 50% 透明淺綠 (#80ff80)。
文檔滾動標(biāo)簽
Android 9 可正確處理文檔的根標(biāo)簽是滾動標(biāo)簽的案例。 在之前的版本中,滾動位置在 body 標(biāo)簽上設(shè)置,根標(biāo)簽的滾動值為零。 Android 9 支持符合標(biāo)準(zhǔn)的行為,在這種行為中,滾動標(biāo)簽是根標(biāo)簽。
此外,直接訪問
document.body.scrollTop、document.body.scrollLeft、document.documentElement.scrollTop或document.documentElement.scrollLeft會因目標(biāo) SDK 的不同而具有不同的行為。 要訪問視口滾動值,請使用document.scrollingElement(若有)。
來自已暫停應(yīng)用的通知
? 在 Android 9 之前,暫停的應(yīng)用發(fā)出的通知會被取消。 從 Android 9 開始,暫停的應(yīng)用發(fā)出的通知將被隱藏,直至應(yīng)用繼續(xù)運(yùn)行。