Android 9.0 (API 28) 適配

Android 9.0 (API 28) 適配

針對所有API級別的應(yīng)用

電源管理

幫助確保系統(tǒng)資源被提供給最需要它們的應(yīng)用,詳情參閱電源管理

隱私權(quán)

  1. 后臺對傳感器的訪問受限

    App后臺運(yùn)行時,以下行為受限

    • 訪問麥克風(fēng)和攝像頭

    • 使用連續(xù)報告模式的傳感器(加速度計、陀螺儀等)不會接收事件

    • 使用變化或一次性報告模式的傳感器不會接收事件

  2. 限制訪問通話記錄

    引入CALL_LOG權(quán)限組,把READ_CALL_LOG、WRIT_CALL_LOG、PROCESS_OUTGOING_CALLS移入該組(以前在PHONE權(quán)限組)。

  3. 限制訪問電話號碼

    要從手機(jī)狀態(tài)中讀取電話號碼,需要:

    • 要通過PHONE_STATE Intent讀取,需要READ_CALL_LOGREAD_PHONE_STATE權(quán)限
    • 要通過 onCallStateChanged() 讀取,只需要READ_CALL_LOG權(quán)限
  4. 限制訪問WiFi位置和連接信息

    • WiFi掃描限制更嚴(yán)格,詳情參閱Wi-Fi 掃描限制
    • getConnectionInfo() 函數(shù)返回的 WifiInfo 對象受限,只有當(dāng)App具有以下權(quán)限時,才能獲得SSIDBSSID
      • ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION
      • ACCESS_WIFI_STATE
      • 還需要在設(shè)備上啟用位置服務(wù)(Settings > Location
  5. WiFi服務(wù)函數(shù)移除多余信息

在 Android 9 中,下列事件和廣播不接收用戶位置或個人可識別數(shù)據(jù)方面的信息:

Wi-Fi 的 NETWORK_STATE_CHANGED_ACTION系統(tǒng)廣播不再包含 SSID(之前為 EXTRA_SSID)、BSSID(之前為 EXTRA_BSSID)或連接信息(之前為 EXTRA_NETWORK_INFO)。 如果應(yīng)用需要此信息,請改為調(diào)用getConnectionInfo()。

  1. 電話信息依賴設(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 框架軟件包索引中正式記錄,它們是受支持的接口,您可以自由使用。
  1. 使用veridex工具測試

    veridex 工具會掃描 APK 的整個代碼庫(包括所有第三方庫),并報告發(fā)現(xiàn)的所有使用非 SDK 接口的行為。但是也有局限性:

    • 無法檢測到通過 JNI 實(shí)現(xiàn)的調(diào)用。
    • 只能檢測到一部分通過反射實(shí)現(xiàn)的調(diào)用。
    • 對非活動代碼路徑的分析僅限于 API 級別的檢查。
  2. 運(yùn)行StrictMode API測試

    使用 detectNonSdkApiUsage 方法來啟用此 API。啟用 StrictMode API 后,您可以使用 [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)使用行為的上下文。

  3. 使用可調(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 TrafficStatsNetworkStatsManager 繼續(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 軟件包中的類,例如 WebViewCookieManager。 例如,您應(yīng)該將所有使用 WebViewActivity 對象移入同一進(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.scrollTopdocument.documentElement.scrollLeft 會因目標(biāo) SDK 的不同而具有不同的行為。 要訪問視口滾動值,請使用 document.scrollingElement(若有)。

來自已暫停應(yīng)用的通知

? 在 Android 9 之前,暫停的應(yīng)用發(fā)出的通知會被取消。 從 Android 9 開始,暫停的應(yīng)用發(fā)出的通知將被隱藏,直至應(yīng)用繼續(xù)運(yùn)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容