詳解Android版本適配:9.0 Pie
一、前言
本文主要是從官方文檔中篩選出一些常見的適配項(xiàng),若有任何紕漏或需要補(bǔ)充的,歡迎大家在評(píng)論區(qū)指出。
二、版本適配
1. 限制 HTTP 網(wǎng)絡(luò)請(qǐng)求
Android 9.0 中限制了 HTTP(明文傳輸)網(wǎng)絡(luò)請(qǐng)求,若仍繼續(xù)使用HTTP請(qǐng)求,則會(huì)在日志中提示以下異常(只是無法正常發(fā)出請(qǐng)求,不會(huì)導(dǎo)致應(yīng)用崩潰):
java.net.UnknownServiceException: CLEARTEXT communication to xxx not permitted by network security policy
適配的方法如下:
第一種
在資源目錄中新建一個(gè) xml 文件作為網(wǎng)絡(luò)安全配置文件,例如 xml/network_security_config.xml,然后在文件中填寫以下內(nèi)容:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
在AndroidManifest.xml進(jìn)行配置:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
第二種(感謝 AllenChiang 同學(xué)的提醒)
Android 6.0 中引入了是否允許網(wǎng)絡(luò)使用明文傳輸?shù)呐渲茫?/p>
<application android:usesCleartextTraffic=["true" | "false"]>
原來默認(rèn)為 true,但在 Android 9.0 中默認(rèn)值改為了 false,因此將配置手動(dòng)設(shè)為 true 即可解決明文傳輸被限制的問題
2. 棄用 Apache HTTP Client
由于官方在 Android 9.0 中移除了所有 Apache HTTP Client 相關(guān)的類,因此我們的應(yīng)用或是一些第三方庫如果使用了這些類,就會(huì)拋出找不到類的異常:
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/conn/scheme/SchemeRegistry;
若需要繼續(xù)使用 Apache HTTP Client ,可通過以下方法進(jìn)行適配:
在 AndroidManifest.xml 中添加以下內(nèi)容:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
或者在應(yīng)用中直接將 Apache HTTP Client 相關(guān)的類打包并進(jìn)行引用
3. 限制非 SDK 接口的調(diào)用
3.1 簡述
一直以來,官方提供的接口分為了 SDK 接口和非 SDK 接口。SDK 接口即官方支持的接口,開發(fā)者可以直接調(diào)用不會(huì)有任何限制。一般而言,SDK 接口都記錄在官方的接口索引中,沒有記錄的就視為非 SDK 接口,例如一些使用了 @hide 標(biāo)注的方法。
以往開發(fā)者對(duì)于非 SDK 接口的調(diào)用通常是利用反射或者JNI間接調(diào)用的方式進(jìn)行,但這樣的調(diào)用方式如果處理不當(dāng)會(huì)比較容易出現(xiàn)一些未知的錯(cuò)誤。為了提升用戶體驗(yàn)和降低應(yīng)用發(fā)生崩潰的風(fēng)險(xiǎn),Android 9.0 對(duì)應(yīng)用能使用的非 SDK 接口實(shí)施了限制,具體的限制手段請(qǐng)見下表:
此外,為了開發(fā)者能夠順利過渡到 Android 9.0,官方對(duì)非 SDK 接口進(jìn)行了分類,共分為三類,light-greylist(淺灰名單)、dark-greylist(深灰名單)以及blacklist(黑名單):
- light-greylist(淺灰名單):對(duì)于此名單中的非 SDK 接口,官方暫未找到可替代的 SDK 接口,因此開發(fā)者仍可繼續(xù)訪問(如果 targetSdkVersion 大于等于28時(shí)會(huì)出現(xiàn)警告)。
- dark-greylist(深灰名單):targetSdkVersion 小于28時(shí)仍可繼續(xù)使用此名單中的接口,但會(huì)出現(xiàn)警告提示;大于等于28時(shí),這些接口將會(huì)限制訪問。
- blacklist(黑名單):無論 targetSdkVersion 為多少,只要應(yīng)用運(yùn)行在 Android 9.0 平臺(tái)上,訪問此名單中的接口都會(huì)受限
3.2 如何測試應(yīng)用是否使用非 SDK 接口
可以通過以下方式進(jìn)行測試(詳情請(qǐng)至官方文檔):
- 使用 Android 9.0 或更高版本的設(shè)備調(diào)試應(yīng)用
- 使用 StrictMode API 進(jìn)行測試
- 使用 veridex 工具對(duì)應(yīng)用進(jìn)行掃描
建議使用第三種方式,該工具的掃描結(jié)果會(huì)列出應(yīng)用對(duì)于三個(gè)限制名單中的接口的調(diào)用細(xì)節(jié)。
4. 前臺(tái)服務(wù)權(quán)限
在 Android 9.0 中,應(yīng)用在使用前臺(tái)服務(wù)之前必須先申請(qǐng) FOREGROUND_SERVICE 權(quán)限,否則就會(huì)拋出 SecurityException 異常。
此外,由于 FOREGROUND_SERVICE 權(quán)限只是普通權(quán)限,因此開發(fā)者只需在 AndroidManifest.xml 中注冊此權(quán)限即可,系統(tǒng)會(huì)自動(dòng)對(duì)此權(quán)限進(jìn)行授權(quán):
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
5. 強(qiáng)制執(zhí)行 FLAG_ACTIVITY_NEW_TASK 要求
在 Android 7.0(API 級(jí)別 24)之前,若開發(fā)者需要通過非 Activity context 啟動(dòng) Activity,就必須設(shè)置 Intent 標(biāo)志 FLAG_ACTIVITY_NEW_TASK,否則會(huì)啟動(dòng)失敗并拋出以下異常
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
但這個(gè)要求在更新 Android 7.0 以后由于系統(tǒng)問題被臨時(shí)取消了,開發(fā)者即使不設(shè)置標(biāo)志也可以正常啟動(dòng) Activity。而在 Android 9.0 中官方修復(fù)了這個(gè)問題,這個(gè)要求重新開始強(qiáng)制執(zhí)行,因此開發(fā)者在適配 Android 9.0 時(shí)需要注意這個(gè)問題。
6. 不允許共享 WebView 數(shù)據(jù)目錄
Android 9.0 中為了改善應(yīng)用穩(wěn)定性和數(shù)據(jù)完整性,應(yīng)用無法再讓多個(gè)進(jìn)程共用同一 WebView 數(shù)據(jù)目錄。此類數(shù)據(jù)目錄一般存儲(chǔ) Cookie、HTTP 緩存以及其他與網(wǎng)絡(luò)瀏覽有關(guān)的持久性和臨時(shí)性存儲(chǔ)。
如果開發(fā)者需要在多進(jìn)程中使用 WebView,則必須先調(diào)用 WebView.setDataDirectorySuffix() 方法為每個(gè)進(jìn)程設(shè)置用于存儲(chǔ) WebView 數(shù)據(jù)的目錄。若多進(jìn)程 WebView 之間需要共享數(shù)據(jù),開發(fā)者需自己通過 IPC 的方式實(shí)現(xiàn)。
此外,若開發(fā)者只想在一個(gè)進(jìn)程中使用 WebView,并且希望嚴(yán)格執(zhí)行這個(gè)規(guī)則,可以通過在其他進(jìn)程中調(diào)用 WebView.disableWebView() 方法,這樣其他進(jìn)程創(chuàng)建 WebView 實(shí)例就會(huì)拋出異常。
7. 其他 API 方面的修改
7.1 Region.Op 相關(guān)
Android 9.0 中如果在使用繪圖裁剪功能時(shí)設(shè)置了除 Region.Op.INTERSECT 或 Region.Op.DIFFERENCE 以外的類型,就會(huì)拋出以下異常:
java.lang.IllegalArgumentException: Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed
具體原因是官方廢棄了那幾個(gè)具有 Region.Op 參數(shù)的裁剪方法,如 clipRect(@NonNull RectF rect, @NonNull Region.Op op) :
/** * Modify the current clip with the specified rectangle. * * @param rect The rect to intersect with the current clip * @param op How the clip is modified * @return true if the resulting clip is non-empty * * @deprecated Region.Op values other than {@link Region.Op#INTERSECT} and * {@link Region.Op#DIFFERENCE} have the ability to expand the clip. The canvas clipping APIs * are intended to only expand the clip as a result of a restore operation. This enables a view * parent to clip a canvas to clearly define the maximal drawing area of its children. The * recommended alternative calls are {@link #clipRect(RectF)} and {@link #clipOutRect(RectF)}; * * As of API Level API level {@value Build.VERSION_CODES#P} only {@link Region.Op#INTERSECT} and * {@link Region.Op#DIFFERENCE} are valid Region.Op parameters. */ @Deprecated public boolean clipRect(@NonNull RectF rect, @NonNull Region.Op op) { checkValidClipOp(op); return nClipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom, op.nativeInt); } private static void checkValidClipOp(@NonNull Region.Op op) { if (sCompatiblityVersion >= Build.VERSION_CODES.P && op != Region.Op.INTERSECT && op != Region.Op.DIFFERENCE) { throw new IllegalArgumentException( "Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed"); } }
對(duì)于這個(gè)問題,可以通過以下方法進(jìn)行適配:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { canvas.clipPath(path); } else { canvas.clipPath(path, Region.Op.XOR);// REPLACE、UNION 等類型 }
7.2 Build.SERIAL 被棄用
Android 9.0 之前,開發(fā)者可以使用 Build.SERIAL 獲取設(shè)備的序列號(hào)?,F(xiàn)在這個(gè)方法被棄用了,Build.SERIAL 將始終設(shè)置為 "UNKNOWN" 以保護(hù)用戶的隱私。
適配的方法為先請(qǐng)求 READ_PHONE_STATE 權(quán)限,然后調(diào)用 Build.getSerial() 方法。
以上所述是小編給大家介紹的Android版本適配9.0 Pie詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android 版本、權(quán)限適配相關(guān)總結(jié)
- Android 圖片保存到相冊不顯示的解決方案(兼容Android 10及更高版本)
- Android Studio 2020新版本卡在Gradle downloading/sync failed/下載緩慢/下載超時(shí)的問題
- 詳解如何在Android studio中更新sdk版本和build-tools版本
- Android Studio下載、安裝和配置+SDK+tools下載(無敵超級(jí)詳細(xì)版本)
- Android Studio3.6.3 當(dāng)前最新版本數(shù)據(jù)庫查找與導(dǎo)出方法(圖文詳解)
- 詳解Android studio 3+版本apk安裝失敗問題
- android studio 打包自動(dòng)生成版本號(hào)與日期,apk輸入路徑詳解
- Android開發(fā)獲取手機(jī)Mac地址適配所有Android版本
- Android實(shí)現(xiàn)懸浮窗全系統(tǒng)版本
- Android ProductFlavor的使用詳解
相關(guān)文章
Android viewpager自動(dòng)輪播和小圓點(diǎn)聯(lián)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android viewpager自動(dòng)輪播和小圓點(diǎn)聯(lián)動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android多點(diǎn)觸控實(shí)現(xiàn)對(duì)圖片放大縮小平移,慣性滑動(dòng)等功能
這篇文章主要介紹了Android多點(diǎn)觸控實(shí)現(xiàn)對(duì)圖片放大縮小平移,慣性滑動(dòng)等功能的相關(guān)資料,需要的朋友可以參考下2016-02-02Mac OS下為Android Studio編譯FFmpeg解碼庫的詳細(xì)教程
這篇文章主要介紹了Mac OS下為Android Studio編譯FFmpeg解碼庫的詳細(xì)教程,包括NDK的配置和Android Studio的配置兩個(gè)部分的內(nèi)容,需要的朋友可以參考下2016-01-01解決在eclipse中將android項(xiàng)目生成apk并且給apk簽名的實(shí)現(xiàn)方法詳解
本篇文章是對(duì)在eclipse中將android項(xiàng)目生成apk并且給apk簽名的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android CountDownTimer實(shí)現(xiàn)定時(shí)器和倒計(jì)時(shí)效果
這篇文章主要為大家詳細(xì)介紹了Android CountDownTimer實(shí)現(xiàn)定時(shí)器和倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02Android ViewPager與radiogroup實(shí)現(xiàn)關(guān)聯(lián)示例
本篇文章主要介紹了Android ViewPager與radiogroup實(shí)現(xiàn)關(guān)聯(lián)示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03Android實(shí)現(xiàn)縮放動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)縮放動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Gradle?Build?Cache引發(fā)的Task緩存編譯問題
這篇文章主要為大家介紹了Gradle?Build?Cache引發(fā)的Task緩存編譯問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android Studio使用ButterKnife和Zelezny的方法
這篇文章主要為大家詳細(xì)介紹了Android Studio使用ButterKnife和Zelezny的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04