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