Android P 新特性及兼容性適配注意事項(xiàng)
? ? *影響所有應(yīng)用 (無(wú)論TargetApi 是否 28+)
1.非SDK接口限制(參考https://www.cnblogs.com/huaweiopenlab/p/9056298.html)
? ? SDK 接口是指在Android框架軟件包索引中記錄的接口胸懈。(https://developer.android.google.cn/reference/packages能夠在谷歌網(wǎng)站查詢到的接口都是SDK 接口)
? ? 非SDK接口:除以上的 SDK 接口外啤呼,其他都是非SDK接口應(yīng)用
? ? 濫用 non-SDK interfaces 的危害:非SDK接口在版本之間可能有所變化幽七,將帶來(lái)兼容性問題妄痪。非SDK接口調(diào)用警告所有私有API均在Logcat 中顯示警告卜壕。DP版本在Activity 開始時(shí)會(huì)顯示Toast警告斗塘。
? ? 名單分類 查看名單https://android.googlesource.com/platform/frameworks/base/+/master/config/
? ? Light grey list: targetSDK>=P時(shí)雾鬼,警告葱轩;
? ? Dark grey list: targetSDK<P時(shí)媚值,警告狠毯;>=p時(shí),不允許調(diào)用褥芒;
? ? Black list:三方應(yīng)用不允許調(diào)用嚼松;
? 2.默認(rèn)情況下啟用網(wǎng)絡(luò)傳輸層安全協(xié)議
? ? Android P 限制了明文流量的網(wǎng)絡(luò)請(qǐng)求,非加密的流量請(qǐng)求都會(huì)被系統(tǒng)禁止掉。 即默認(rèn)禁掉http請(qǐng)求
? ? 解決方法: manifest application android:usesCleartextTraffic="true"
? 3.androd P? Apache HTTP 客戶端棄用影響采用非標(biāo)準(zhǔn) ClassLoader 的應(yīng)用(即 androd P Apache HTTP API 不可用)
? ? 解決方法: Android 9 及更高版本為目標(biāo)的應(yīng)用可以向其 AndroidManifest.xml 添加以下內(nèi)容:
? ? ? ? ? <uses-library android:name="org.apache.http.legacy" android:required="false"/>
? 4.Android O 開始支持特長(zhǎng)屏幕.
? ? ? ? 如果自適應(yīng)式 UI 不適合您的場(chǎng)景献酗,可以考慮在 manifest 中的 <activity> 內(nèi)設(shè)置 resizableActivity = false寝受,并加上 android:MaxAspectRatio 來(lái)聲明最大支持縱橫比。這會(huì)在特長(zhǎng)屏幕的設(shè)備上啟用兼容模式凌摄,把應(yīng)用邊緣的顯示空間以黑色填充羡蛾。
? ? 注:目前最高屏占比為紅米6 Pro 19:9 = 2.111? android:name="android.max_aspect" android:value="2.2"
? 5.限制非Activity場(chǎng)景啟動(dòng)Activity(強(qiáng)制性 FLAG_ACTIVITY_NEW_TASK 要求)
? ? 在 Android P 中,除非使用了 FLAG_ACTIVITY_NEW_TASK? intent flag锨亏,您不能在非 Activity 場(chǎng)景下啟動(dòng) Activity痴怨。若您未使用這個(gè) intent flag 就嘗試啟動(dòng) Activity,系統(tǒng)無(wú)法正常開啟活 Activity器予,并會(huì)在日志中留下相應(yīng)信息浪藻。
? ? * 注意:FLAG_ACTIVITY_NEW_TASK 標(biāo)簽的要求屬為預(yù)期行為,并且從 Android N 就對(duì)此作了強(qiáng)制要求乾翔。但是 Android N 系統(tǒng)中的錯(cuò)誤暫時(shí)導(dǎo)致此要求沒有被強(qiáng)制執(zhí)行爱葵。
? 6.限制靜態(tài)廣播的接收
? ? 升級(jí)安卓9.0之后,隱式廣播將會(huì)被全面禁止反浓,在AndroidManifest中注冊(cè)的Receiver將不能夠生效
? 7.前臺(tái)服務(wù)
? ? 針對(duì) Android P 或更高平臺(tái)開發(fā)的應(yīng)用必須請(qǐng)求 FOREGROUND_SERVICE 權(quán)限才能使用前臺(tái)服務(wù)萌丈。 FOREGROUND_SERVICE 屬于普通級(jí)別請(qǐng)求,因此提出請(qǐng)求后雷则,系統(tǒng)會(huì)自動(dòng)授予辆雾。
? ? 若應(yīng)用未提出 FOREGROUND_SERVICE 請(qǐng)求就試圖創(chuàng)建前臺(tái)服務(wù),系統(tǒng)會(huì)拋出 SecurityException 異常月劈。
? 8.移除對(duì) Build.serial 的直接訪問
? ? Android 8.0? (API等級(jí)26) 已棄用 Build.SERIAL 字段度迂;從 Android P 開始,Build.SERIAL 始終設(shè)定為 "UNKNOWN"猜揪。此項(xiàng)變更能夠保護(hù)用戶隱私惭墓。
? ? 若您的應(yīng)用須要訪問設(shè)備硬件序列號(hào),您應(yīng)該請(qǐng)求 READ_PHONE_STATE 權(quán)限而姐,然后調(diào)用 getSerial()腊凶。
? 9.依賴的第三方 SDK (特別是加固和熱修復(fù)框架) 會(huì)和系統(tǒng)底層緊密集成 (如使用非公開的接口),
? ? 而導(dǎo)致應(yīng)用在 Android 版本升級(jí)時(shí)無(wú)法正常運(yùn)行拴念。钧萍。。注意三方sdk版本更新
? 10.不允許共享 WebView 數(shù)據(jù)目錄
? ? Android P 應(yīng)用無(wú)法再讓多個(gè)進(jìn)程共用同一 WebView 數(shù)據(jù)目錄
? ? 若多個(gè)進(jìn)程中使用 WebView 的實(shí)例丈莺,則必須先利用 WebView.setDataDirectorySuffix() 函數(shù)為每個(gè)進(jìn)程指定唯一的數(shù)據(jù)目錄后綴划煮,然后再在該進(jìn)程中使用 WebView 的給定實(shí)例
? ? 若多個(gè)進(jìn)程需要訪問同一網(wǎng)絡(luò)數(shù)據(jù)送丰,您需要自行在這些進(jìn)程之間復(fù)制數(shù)據(jù)缔俄。 例如,您可以調(diào)用 getCookie() 和 setCookie(),在不同進(jìn)程之間手動(dòng)傳輸 Cookie數(shù)據(jù)
? 11.全面屏檢測(cè)特殊適配
? ? Android P 里官方收歸了全面屏的判斷邏輯俐载,Android P 和之后的版本完全可以使用官方 API 來(lái)判斷全面屏蟹略,當(dāng)然前提是第三方廠商按照 google 官方接口去實(shí)現(xiàn)。Android P 版本判斷全面屏代碼很簡(jiǎn)單
? ? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
? ? ? ? WindowInsets windowInsets = decorView.getRootWindowInsets();
? ? ? ? if (windowInsets != null) {
? ? ? ? ? ? DisplayCutout displayCutout = windowInsets.getDisplayCutout();
? ? ? ? ? ? if (displayCutout != null) {
? ? ? ? ? ? ? ? List<Rect> rects = displayCutout.getBoundingRects();
? ? ? ? ? ? ? ? //通過判斷是否存在rects來(lái)確定是否劉海屏手機(jī)
? ? ? ? ? ? ? ? if (rects != null && rects.size() > 0) {
? ? ? ? ? ? ? ? ? ? isNotchScreen = true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
? 12.應(yīng)用待機(jī)分組策略
? ? 應(yīng)用待機(jī)群組 參考https://developer.android.com/about/versions/pie/power
? ? 受此影響為主要為應(yīng)用的后臺(tái)行為受限制遏佣,特別如鬧鐘挖炬,地圖導(dǎo)航,后臺(tái)下載
? 13.省電模式改進(jìn) 影響 后臺(tái)執(zhí)行限制 位置服務(wù)及廣播限制等
? 14.視圖焦距
? ? 零區(qū)域視圖 (即長(zhǎng)或?qū)挼闹禐?0) 不再能夠設(shè)定焦點(diǎn)状婶。
? ? 另外意敛,在 touch-mode 下 Activity 不再隱式分配初始焦點(diǎn),而是要求開發(fā)者在需要的情況下對(duì)初始焦點(diǎn)提出顯式要求膛虫。
? ? Android P 應(yīng)用允許 CSS Color Module Level 4 行為草姻,用于操作 4 位和 8 位十六進(jìn)制 CSS 顏色。
? ? Chrome 從 52 版本開始支持 CSS Color Module Level 4稍刀,但是 WebView 目前暫時(shí)禁用該功能撩独,因?yàn)榇嬖诂F(xiàn)有 Android 應(yīng)用在 Android ordering (ARGB) 中包含 32 位十六進(jìn)制顏色,這可能會(huì)導(dǎo)致渲染錯(cuò)誤账月。
? 15.權(quán)限組變更
? ? Android P 引入 CALL_LOG 權(quán)限組并將 READ_CALL_LOG综膀、WRITE_CALL_LOG 和 PROCESS_OUTGOING_CALLS 權(quán)限移入該組。 在之前的 Android 版本中局齿,這些權(quán)限位于 PHONE 權(quán)限組
? 16.wifi掃描權(quán)限變更
? ? Android 8.0和Android 8.1:成功調(diào)用 WifiManager.getScanResults() 需要以下任何一項(xiàng)權(quán)限:
? ? ? ACCESS_FINE_LOCATION;ACCESS_COARSE_LOCATION;CHANGE_WIFI_STATE
? ? Android 9及更高版本:成功調(diào)用 WifiManager.startScan() 需要滿足以下所有條件:
? ? ? ACCESS_FINE_LOCATION;ACCESS_COARSE_LOCATION;CHANGE_WIFI_STATE
? ? 成功調(diào)用 WifiManager.getScanResults() 需要滿足以下所有條件:
? ? ACCESS_FINE_LOCATION;ACCESS_COARSE_LOCATION;CHANGE_WIFI_STATE;設(shè)備上啟用了位置服務(wù)(在“設(shè)置”>“位置”下)
? 17.新的圖片解碼ImageDecoder
? ? 替代 BitmapFactory 可以從 流剧劝、file、byte buffer项炼、 uRL 加載 Bitmap 和 Drawable 支持精確尺寸縮放担平, 并且支持加載 gif 、 Webp锭部, 以及圓角等樣式設(shè)置暂论。
? 18.復(fù)雜文本顯示PrecomputedText
? ? 顯示復(fù)雜的,包含多種字體拌禾,行間距取胎,字母間距,文本方向湃窍,換行符闻蛀,連字符等功能。
? 19.文本放大鏡Magnifier
? ? Android P android P 引入了文本放大鏡 <P不兼容
? 20.非全屏透明Activity禁用設(shè)置orientation
? ? 非全屏透明頁(yè)面不允許設(shè)置方向您市,否則會(huì)拋Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation異常觉痛,解決方案:android:windowIsTranslucent設(shè)置為false。
? 21.劉海屏挖孔屏API支持
? ? 谷歌P版本提供了統(tǒng)一的挖孔屏方案和三方適配挖孔屏方案:對(duì)于有狀態(tài)欄的頁(yè)面茵休,不會(huì)受到挖孔屏特性的影響薪棒;全屏顯示的頁(yè)面手蝎,系統(tǒng)挖孔屏方案會(huì)對(duì)應(yīng)用界面做下移避開挖孔區(qū)顯示;已經(jīng)適配的P的應(yīng)用的全屏頁(yè)面可以通過谷歌提供的適配方案使用挖孔區(qū)俐芯,真正做到全屏顯示棵介。
? ? P版本三方適配挖孔屏方案:
? ? 1.新增挖孔屏挖孔尺寸和位置接口:WindowInsets DisplayCutout
? ? 2.新窗口布局模式,允許應(yīng)用程序請(qǐng)求是否在挖孔區(qū)域布局:WindowManager.LayoutParams
? ? ? int layoutInDisplayCutoutMode:
? ? ? final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;默認(rèn)情況下吧史,全屏窗口不會(huì)使用到挖孔區(qū)域
? ? ? final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;窗口聲明使用挖孔區(qū)域
? ? ? final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;窗口聲明不使用挖孔區(qū)域
? 22.sensor和麥克風(fēng)后臺(tái)管控
? ? 限制sensor event向后臺(tái)應(yīng)用或服務(wù)的傳輸邮辽,對(duì)前臺(tái)應(yīng)用無(wú)影響;主要是考慮隱私原因贸营;對(duì)應(yīng)用來(lái)說是很大的變化吨述。影響范圍:應(yīng)用處于idle和gone的狀態(tài)就會(huì)被管控,切換到后臺(tái)一分鐘應(yīng)用就會(huì)進(jìn)入idle狀態(tài)钞脂,但是有前臺(tái)服務(wù)的不會(huì)進(jìn)入idle狀態(tài)锐极。
? 23.利用 Wi-Fi RTT 進(jìn)行室內(nèi)定位
? ? 在室內(nèi),IEEE 802.11 MC WI-FI protocol? 測(cè)量與附近wifi 鏈接點(diǎn)的距離(2~3個(gè))芳肌,通過 RTT灵再,來(lái)測(cè)量距離, 能精確到 1~2米 在提供硬件支持的 Android P 設(shè)備上亿笤,應(yīng)用可以使用全新的 RTT API 來(lái)測(cè)量與附近支持 RTT 的 Wi-Fi 接入點(diǎn) (AP) 的距離翎迁,設(shè)備不需要連接至 AP 即可使用 RTT使用uses-feature來(lái)標(biāo)注:<uses-feature android:name="android.hardware.wifi.rtt" />
? 24.禁止空閑應(yīng)用訪問相機(jī)、麥克風(fēng)和傳感器
? ? Android 9 限制后臺(tái)應(yīng)用訪問用戶輸入和傳感器數(shù)據(jù)的能力净薛。 如果您的應(yīng)用在運(yùn)行 Android 9 設(shè)備的后臺(tái)運(yùn)行汪榔,系統(tǒng)將對(duì)您的應(yīng)用采取以下限制:
? (1)應(yīng)用不能訪問麥克風(fēng)或攝像頭。
? (2)使用連續(xù)報(bào)告模式的傳感器(例如加速度計(jì)和陀螺儀)不會(huì)接收事件肃拜。
? (3)使用變化或一次性報(bào)告模式的傳感器不會(huì)接收事件痴腌。
? 25. Crypto JCA 提供程序已被移除,棄用 Bouncy Castle 加密
? ? ? AndroidP后,不再允許應(yīng)用直接讀取 /proc/net/xt_qtaguid 文件夾中的文件燃领。 這樣做是為了確保與某些根本不提供這些文件的設(shè)備保持一致士聪。應(yīng)用應(yīng)該采用標(biāo)準(zhǔn) API TrafficStats 和 NetworkStatsManager 進(jìn)行訪問,此限制對(duì)所有運(yùn)行AndroidP系統(tǒng)上的應(yīng)用生效猛蔽。
? 26.SELinux 禁止訪問應(yīng)用的數(shù)據(jù)目錄
? ? 對(duì)于targetsdkversion>=28的應(yīng)用剥悟,系統(tǒng)強(qiáng)制每個(gè)應(yīng)用的 SELinux 沙盒對(duì)每個(gè)應(yīng)用的私有數(shù)據(jù)目錄強(qiáng)制執(zhí)行逐個(gè)應(yīng)用的 SELinux 限制。現(xiàn)在曼库,不允許直接通過路徑訪問其他應(yīng)用的數(shù)據(jù)目錄区岗。應(yīng)用可以繼續(xù)使用進(jìn)程間通信 (IPC) 機(jī)制(包括通過傳遞 FD)共享數(shù)據(jù),例如可以采用FileProvider毁枯。
android P 新增及改動(dòng)是非常大的慈缔,而且對(duì)以前版本已做的限制和警告現(xiàn)在P版本是強(qiáng)制的,更多新特性需深入發(fā)掘种玛。