Android 9.0 (API 28) 適配
針對所有API級別的應(yīng)用
電源管理
幫助確保系統(tǒng)資源被提供給最需要它們的應(yīng)用退疫,詳情參閱電源管理
隱私權(quán)
-
后臺對傳感器的訪問受限
App后臺運行時,以下行為受限
訪問麥克風(fēng)和攝像頭
使用連續(xù)報告模式的傳感器(加速度計鸽素、陀螺儀等)不會接收事件
使用變化或一次性報告模式的傳感器不會接收事件
-
限制訪問通話記錄
引入CALL_LOG權(quán)限組蹄咖,把READ_CALL_LOG、WRIT_CALL_LOG付鹿、PROCESS_OUTGOING_CALLS移入該組(以前在PHONE權(quán)限組)。
-
限制訪問電話號碼
要從手機狀態(tài)中讀取電話號碼蚜迅,需要:
- 要通過PHONE_STATE Intent讀取舵匾,需要READ_CALL_LOG和READ_PHONE_STATE權(quán)限
- 要通過
onCallStateChanged()
讀取,只需要READ_CALL_LOG權(quán)限
-
限制訪問WiFi位置和連接信息
- WiFi掃描限制更嚴格谁不,詳情參閱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ù)和字段的使用進行了限制褒傅;無論您是直接訪問這些函數(shù)和字段,還是通過反射或 JNI 訪問袄友,這些限制均適用殿托。 在 Android 9 中,您的應(yīng)用可以繼續(xù)訪問這些受限的接口剧蚣;該平臺通過 toast 和日志條目提醒您注意這些接口支竹。 如果您的應(yīng)用顯示這樣的 toast,則必須尋求受限接口之外的其他實現(xiàn)策略券敌。 詳情參閱對非 SDK 接口的限制
列表 | 說明 |
---|---|
黑名單 | 無論您應(yīng)用的目標 API 級別是什么唾戚,您都無法使用此列表中的非 SDK 接口。如果您的應(yīng)用嘗試訪問其中任何一個接口待诅,系統(tǒng)就會拋出錯誤叹坦。 |
灰名單 | 只要在您應(yīng)用的目標 API 級別不限制此列表中的非 SDK 接口,您就可以使用它們卑雁。 從 Android 9(API 級別 28)開始募书,我們在每個 API 級別分別會限制某些非 SDK 接口绪囱。如果您應(yīng)用的目標 API 級別較低,您可以訪問灰名單中的受限 API莹捡,但如果您的應(yīng)用嘗試訪問在您的目標 API 級別受限的非 SDK 接口鬼吵,系統(tǒng)就會假定此 API 已列入黑名單。 注意:在 Android 9(API 級別 28)中篮赢,非受限灰名單中的非 SDK 接口稱為淺灰名單齿椅,而受限灰名單中的非 SDK 接口稱為深灰名單。 |
白名單 | 此列表中的接口已在 Android 框架軟件包索引中正式記錄启泣,它們是受支持的接口涣脚,您可以自由使用。 |
-
使用veridex工具測試
veridex 工具會掃描 APK 的整個代碼庫(包括所有第三方庫)寥茫,并報告發(fā)現(xiàn)的所有使用非 SDK 接口的行為遣蚀。但是也有局限性:
- 無法檢測到通過 JNI 實現(xiàn)的調(diào)用。
- 只能檢測到一部分通過反射實現(xiàn)的調(diào)用纱耻。
- 對非活動代碼路徑的分析僅限于 API 級別的檢查芭梯。
-
運行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)玖喘,并且您可以在其中實現(xiàn)自定義處理∠薮危回調(diào)中提供的Violation
對象派生自Throwable
芒涡,并且封閉式堆棧軌跡會提供相應(yīng)使用行為的上下文。 -
使用可調(diào)試的應(yīng)用測試
通過在搭載 Android 9(API 級別 28)或更高版本的設(shè)備或模擬器上構(gòu)建和運行可調(diào)試應(yīng)用來測試該應(yīng)用是否使用非 SDK 接口卖漫。請確保您使用的設(shè)備或模擬器與您應(yīng)用的目標 API 級別相匹配费尽。
在您的應(yīng)用上運行測試時,如果該應(yīng)用訪問了某些非 SDK 接口羊始,系統(tǒng)就會輸出一條日志消息旱幼。您可以檢查應(yīng)用的日志消息,查找以下詳細信息:
- 聲明的類突委、名稱和類型(采用 Android 運行時所使用的格式)柏卤。
- 訪問方式:鏈接、反射或 JNI
- 所訪問的非 SDK 接口屬于哪個列表匀油。
您可以使用
adb logcat
來查看這些日志消息缘缚,這些消息顯示在所運行應(yīng)用的 PID 下。舉例而言敌蚜,日志中可能包含如下條目:Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
安全行為變更
設(shè)備安全性變更
傳輸層安全協(xié)議(TLS)實現(xiàn)變更
###### 更嚴格的SECCOMP過濾器
加密變更
參數(shù)和算法的 Conscrypt 實現(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 中的默認字符集。 UTF-8 字節(jié)序列可由
String(byte[] bytes)
之類的String
構(gòu)造函數(shù)解碼。Android 9 中的 UTF-8 解碼器遵循比以前版本中更嚴格的 Unicode 標準: 這些變更包括:
- 非最短形式的 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ù)挑随。
使用證書的主機名校驗
RFC 2818中介紹了兩種對照證書匹配域名的方法—使用
subjectAltName
(SAN
) 擴展程序中的可用名稱,或者在沒有SAN
擴展程序的情況下勒叠,回退到commonName
(CN
)兜挨。然而,在 RFC 2818 中眯分,回退到
CN
已被棄用拌汇。因此,Android 不再回退到使用CN
弊决。 要驗證主機名噪舀,服務(wù)器必須出示具有匹配SAN
的證書。 不包含與主機名匹配的SAN
的證書不再被信任飘诗。
網(wǎng)絡(luò)地址查詢可能導(dǎo)致網(wǎng)絡(luò)違規(guī)
不運行在UI Thread中做網(wǎng)絡(luò)請求与倡,任何時候!
套接字標記
報告的套接字中可用字節(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)用的用戶收費喳瓣。 例如馋贤,檢查NET_CAPABILITY_NOT_METERED
并不能確定底層網(wǎng)絡(luò)是否按流量計費。從 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ù)期方式運行实昨。 然而,不受支持的 cutils函數(shù)(例如qtaguid_tagSocket()
)在不同設(shè)備上可能不會按照預(yù)期方式運行 — 甚至根本不運行盐固。
現(xiàn)在強制執(zhí)行 FLAG_ACTIVITY_NEW_TASK 要求
? 在 Android 9 中荒给,您不能從非 Activity 環(huán)境中啟動 Activity,除非您傳遞 Intent 標志 FLAG_ACTIVITY_NEW_TASK
刁卜。 如果您嘗試在不傳遞此標志的情況下啟動 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)鎖定模式下提供相同的選項绞灼,根據(jù) Activity 的
screenOrientation
設(shè)置利术,允許存在一些例外情況(見下表)。請求特定屏幕方向(例如低矮,
screenOrientation=landscape
)的 Activity 會忽略用戶鎖定首選項氯哮,并且行為與 Android 8.0 中的行為相同。可在 Android Manifest 中商佛,或以編程方式通過 setRequestedOrientation() 在 Activity 級別設(shè)置屏幕方向首選項喉钢。
旋轉(zhuǎn)鎖定模式通過設(shè)置 WindowManager 在處理 Activity 旋轉(zhuǎn)時使用的用戶旋轉(zhuǎn)首選項來發(fā)揮作用。 用戶旋轉(zhuǎn)首選項可能在下列情況下發(fā)生變更良姆。 請注意肠虽,恢復(fù)設(shè)備的自然旋轉(zhuǎn)存在偏差,對于外形與手機類似的設(shè)備通常設(shè)置為縱向:
- 當(dāng)用戶接受旋轉(zhuǎn)建議時玛追,旋轉(zhuǎn)首選項變?yōu)榻ㄗh方向税课。
- 當(dāng)用戶切換到強制縱向應(yīng)用(包括鎖定屏幕或啟動器)時闲延,旋轉(zhuǎn)首選項變?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)鎖定模式首選項呛牲,視為自動屏幕旋轉(zhuǎn)已啟用。 請僅在例外情況下并經(jīng)過仔細的用戶體驗考量后再使用此項驮配。
Apache HTTP 客戶端棄用影響采用非標準 ClassLoader 的應(yīng)用
在 Android 6.0 中娘扩,我們?nèi)∠藢?Apache HTTP 客戶端的支持。
此變更對大多數(shù)不以 Android 9 或更高版本為目標的應(yīng)用沒有任何影響壮锻。 不過琐旁,此變更會影響使用非標準
ClassLoader
結(jié)構(gòu)的某些應(yīng)用,即使這些應(yīng)用不以 Android 9 或更高版本為目標平臺猜绣。如果應(yīng)用使用顯式委托到系統(tǒng)
ClassLoader
的非標準ClassLoader
灰殴,則應(yīng)用會受到影響。 在org.apache.http.*
中查找類時掰邢,這些應(yīng)用需要委托給應(yīng)用ClassLoader
牺陶。 如果它們委托給系統(tǒng)ClassLoader
,則應(yīng)用在 Android 9 或更高版本上將失敗并顯示NoClassDefFoundError
辣之,因為系統(tǒng)ClassLoader
不再識別這些類掰伸。 為防止將來出現(xiàn)類似問題,一般情況下怀估,應(yīng)用應(yīng)通過應(yīng)用ClassLoader
加載類狮鸭,而不是直接訪問系統(tǒng)ClassLoader
合搅。
枚舉相機
? 在 Android 9 設(shè)備上運行的應(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"
以保護用戶的隱私蒸痹。如果您的應(yīng)用需要訪問設(shè)備的硬件序列號叠荠,您應(yīng)改為請求 READ_PHONE_STATE
權(quán)限者娱,然后調(diào)用 getSerial()
。
DNS 隱私
? 以 Android 9 為目標平臺的應(yīng)用應(yīng)采用私有 DNS API。 具體而言,當(dāng)系統(tǒng)解析程序正在執(zhí)行 DNS-over-TLS 時,應(yīng)用應(yīng)確保任何內(nèi)置 DNS 客戶端均使用加密的 DNS 查找與系統(tǒng)相同的主機名,或停用它而改用系統(tǒng)解析程序。
框架安全性變更
默認情況下啟用網(wǎng)絡(luò)傳輸層安全協(xié)議 (TLS)
? 如果您的應(yīng)用以 Android 9 或更高版本為目標平臺,則默認情況下 isCleartextTrafficPermitted()
函數(shù)返回 false
。 如果您的應(yīng)用需要為特定域名啟用明文德崭,您必須在應(yīng)用的網(wǎng)絡(luò)安全性配置中針對這些域名將 cleartextTrafficPermitted
顯式設(shè)置為 true
按進程分設(shè)基于網(wǎng)絡(luò)的數(shù)據(jù)目錄
為改善 Android 9 中的應(yīng)用穩(wěn)定性和數(shù)據(jù)完整性憾股,應(yīng)用無法再讓多個進程共用同一
WebView
數(shù)據(jù)目錄斩熊。 此類數(shù)據(jù)目錄一般存儲 Cookie、HTTP 緩存以及其他與網(wǎng)絡(luò)瀏覽有關(guān)的持久性和臨時性存儲淳衙。在大多數(shù)情況下靴跛,您的應(yīng)用只應(yīng)在一個進程中使用
android.webkit
軟件包中的類绝葡,例如WebView
和CookieManager
绞蹦。 例如锉走,您應(yīng)該將所有使用WebView
的Activity
對象移入同一進程。 您可以通過在應(yīng)用的其他進程中調(diào)用disableWebView()
词顾,更嚴格地執(zhí)行“僅限一個進程”規(guī)則。 該調(diào)用可防止WebView
在這些其他進程中被錯誤地初始化碱妆,即使是從依賴內(nèi)容庫進行的調(diào)用也能防止肉盹。如果您的應(yīng)用必須在多個進程中使用
WebView
的實例更舞,則必須先利用WebView.setDataDirectorySuffix()
函數(shù)為每個進程指定唯一的數(shù)據(jù)目錄后綴烂完,然后再在該進程中使用WebView
的給定實例扶叉。 該函數(shù)會將每個進程的網(wǎng)絡(luò)數(shù)據(jù)放入其在應(yīng)用數(shù)據(jù)目錄內(nèi)自己的目錄中舶治。注:即使您使用
setDataDirectorySuffix()
印颤,系統(tǒng)也不會跨應(yīng)用的進程界限共享 Cookie 以及其他網(wǎng)絡(luò)數(shù)據(jù)姑宽。 如果應(yīng)用中的多個進程需要訪問同一網(wǎng)絡(luò)數(shù)據(jù)缴挖,您需要自行在這些進程之間復(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))吓笙,在不同進程之間手動傳輸 Cookie 數(shù)據(jù)。
以應(yīng)用為單位的 SELinux 域名
以 Android 9 或更高版本為目標平臺的應(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 或更高版本為目標平臺的應(yīng)用中,系統(tǒng)計算并非當(dāng)前默認網(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ī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 開始,默認情況下該內(nèi)容庫已從 bootclasspath 中移除且不可用于應(yīng)用娱两。
要繼續(xù)使用 Apache HTTP 客戶端莺匠,以 Android 9 及更高版本為目標的應(yīng)用可以向其
AndroidManifest.xml
添加以下內(nèi)容:<uses-library android:name="org.apache.http.legacy" android:required="false"/>
注:擁有最低 SDK 版本 23 或更低版本的應(yīng)用需要
android:required="false"
屬性,因為在 API 級別低于 24 的設(shè)備上十兢,org.apache.http.legacy
庫不可用趣竣。 (在這些設(shè)備上,Apache HTTP 類在 bootclasspath 中提供纪挎。)作為使用運行時 Apache 庫的替代期贫,應(yīng)用可以在其 APK 中綁定自己的
org.apache.http
庫版本跟匆。 如果進行此操作异袄,您必須將該庫重新打包(使用一個類似 Jar Jar 的實用程序)以避免運行時中提供的類存在類兼容性問題。
界面變更
View Focus
? 0 面積的視圖(即寬度或高度為 0)再也不能被聚焦玛臂。Activity 不再隱式分配觸摸模式下的初始焦點烤蜕,需要的話要顯式請求初始焦點封孙。
CSS RGBA 十六進制值處理
以 Android 9 或更高版本為目標的應(yīng)用必須支持草案版 CSS 顏色模塊級別 4 的行為,用于處理 4 和 8 個十六進制數(shù)字 CSS 顏色讽营。
Chrome 自版本 52 以來便一直支持 CSS 顏色模塊級別 4虎忌,但 WebView 目前停用此功能,因為現(xiàn)有 Android 應(yīng)用被發(fā)現(xiàn)包含 Android ordering (ARGB) 中的 32 位十六進制顏色橱鹏,這會導(dǎo)致渲染錯誤膜蠢。
例如,對于以 API 級別 27 或更低版本為目標平臺的應(yīng)用莉兰,顏色
#80ff8080
目前在 WebView 中被渲染為不透明淺紅色 (#ff8080
)挑围。 先導(dǎo)部分(Android 會將其解讀為 Alpha 部分)目前被忽略。 如果某個應(yīng)用以 API 級別 28 或更高版本為目標糖荒,則#80ff8080
將被解讀為 50% 透明淺綠 (#80ff80
)杉辙。
文檔滾動標簽
Android 9 可正確處理文檔的根標簽是滾動標簽的案例。 在之前的版本中捶朵,滾動位置在 body 標簽上設(shè)置蜘矢,根標簽的滾動值為零。 Android 9 支持符合標準的行為综看,在這種行為中品腹,滾動標簽是根標簽。
此外寓搬,直接訪問
document.body.scrollTop
珍昨、document.body.scrollLeft
、document.documentElement.scrollTop
或document.documentElement.scrollLeft
會因目標 SDK 的不同而具有不同的行為句喷。 要訪問視口滾動值镣典,請使用document.scrollingElement
(若有)。
來自已暫停應(yīng)用的通知
? 在 Android 9 之前唾琼,暫停的應(yīng)用發(fā)出的通知會被取消兄春。 從 Android 9 開始,暫停的應(yīng)用發(fā)出的通知將被隱藏锡溯,直至應(yīng)用繼續(xù)運行赶舆。