欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android版本適配:9.0 Pie

 更新時間:2019年04月23日 11:46:53   作者:Anlia  
這篇文章主要介紹了Android版本適配9.0 Pie,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、前言

本文主要是從官方文檔中篩選出一些常見的適配項,若有任何紕漏或需要補充的,歡迎大家在評論區(qū)指出。

二、版本適配

1. 限制 HTTP 網(wǎng)絡(luò)請求

Android 9.0 中限制了 HTTP(明文傳輸)網(wǎng)絡(luò)請求,若仍繼續(xù)使用HTTP請求,則會在日志中提示以下異常(只是無法正常發(fā)出請求,不會導(dǎo)致應(yīng)用崩潰):

java.net.UnknownServiceException: CLEARTEXT communication to xxx not permitted by network security policy

適配的方法如下:

第一種

在資源目錄中新建一個 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進行配置:

<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,因此將配置手動設(shè)為 true 即可解決明文傳輸被限制的問題

2. 棄用 Apache HTTP Client

由于官方在 Android 9.0 中移除了所有 Apache HTTP Client 相關(guān)的類,因此我們的應(yīng)用或是一些第三方庫如果使用了這些類,就會拋出找不到類的異常:

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/conn/scheme/SchemeRegistry;

若需要繼續(xù)使用 Apache HTTP Client ,可通過以下方法進行適配:

在 AndroidManifest.xml 中添加以下內(nèi)容:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

或者在應(yīng)用中直接將 Apache HTTP Client 相關(guān)的類打包并進行引用

3. 限制非 SDK 接口的調(diào)用

3.1 簡述

一直以來,官方提供的接口分為了 SDK 接口和非 SDK 接口。SDK 接口即官方支持的接口,開發(fā)者可以直接調(diào)用不會有任何限制。一般而言,SDK 接口都記錄在官方的接口索引中,沒有記錄的就視為非 SDK 接口,例如一些使用了 @hide 標(biāo)注的方法。

以往開發(fā)者對于非 SDK 接口的調(diào)用通常是利用反射或者JNI間接調(diào)用的方式進行,但這樣的調(diào)用方式如果處理不當(dāng)會比較容易出現(xiàn)一些未知的錯誤。為了提升用戶體驗和降低應(yīng)用發(fā)生崩潰的風(fēng)險,Android 9.0 對應(yīng)用能使用的非 SDK 接口實施了限制,具體的限制手段請見下表:

此外,為了開發(fā)者能夠順利過渡到 Android 9.0,官方對非 SDK 接口進行了分類,共分為三類,light-greylist(淺灰名單)、dark-greylist(深灰名單)以及blacklist(黑名單):

  1. light-greylist(淺灰名單):對于此名單中的非 SDK 接口,官方暫未找到可替代的 SDK 接口,因此開發(fā)者仍可繼續(xù)訪問(如果 targetSdkVersion 大于等于28時會出現(xiàn)警告)。
  2. dark-greylist(深灰名單):targetSdkVersion 小于28時仍可繼續(xù)使用此名單中的接口,但會出現(xiàn)警告提示;大于等于28時,這些接口將會限制訪問。
  3. blacklist(黑名單):無論 targetSdkVersion 為多少,只要應(yīng)用運行在 Android 9.0 平臺上,訪問此名單中的接口都會受限

3.2 如何測試應(yīng)用是否使用非 SDK 接口

可以通過以下方式進行測試(詳情請至官方文檔):

  1. 使用 Android 9.0 或更高版本的設(shè)備調(diào)試應(yīng)用
  2. 使用 StrictMode API 進行測試
  3. 使用 veridex 工具對應(yīng)用進行掃描

建議使用第三種方式,該工具的掃描結(jié)果會列出應(yīng)用對于三個限制名單中的接口的調(diào)用細節(jié)。

 4. 前臺服務(wù)權(quán)限

在 Android 9.0 中,應(yīng)用在使用前臺服務(wù)之前必須先申請 FOREGROUND_SERVICE 權(quán)限,否則就會拋出 SecurityException 異常。

此外,由于 FOREGROUND_SERVICE 權(quán)限只是普通權(quán)限,因此開發(fā)者只需在 AndroidManifest.xml 中注冊此權(quán)限即可,系統(tǒng)會自動對此權(quán)限進行授權(quán):

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

5. 強制執(zhí)行 FLAG_ACTIVITY_NEW_TASK 要求

在 Android 7.0(API 級別 24)之前,若開發(fā)者需要通過非 Activity context 啟動 Activity,就必須設(shè)置 Intent 標(biāo)志 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ā)者即使不設(shè)置標(biāo)志也可以正常啟動 Activity。而在 Android 9.0 中官方修復(fù)了這個問題,這個要求重新開始強制執(zhí)行,因此開發(fā)者在適配 Android 9.0 時需要注意這個問題。

 6. 不允許共享 WebView 數(shù)據(jù)目錄

Android 9.0 中為了改善應(yīng)用穩(wěn)定性和數(shù)據(jù)完整性,應(yīng)用無法再讓多個進程共用同一 WebView 數(shù)據(jù)目錄。此類數(shù)據(jù)目錄一般存儲 Cookie、HTTP 緩存以及其他與網(wǎng)絡(luò)瀏覽有關(guān)的持久性和臨時性存儲。

如果開發(fā)者需要在多進程中使用 WebView,則必須先調(diào)用 WebView.setDataDirectorySuffix() 方法為每個進程設(shè)置用于存儲 WebView 數(shù)據(jù)的目錄。若多進程 WebView 之間需要共享數(shù)據(jù),開發(fā)者需自己通過 IPC 的方式實現(xiàn)。

此外,若開發(fā)者只想在一個進程中使用 WebView,并且希望嚴(yán)格執(zhí)行這個規(guī)則,可以通過在其他進程中調(diào)用 WebView.disableWebView() 方法,這樣其他進程創(chuàng)建 WebView 實例就會拋出異常。

7. 其他 API 方面的修改

7.1 Region.Op 相關(guān)

Android 9.0 中如果在使用繪圖裁剪功能時設(shè)置了除 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 獲取設(shè)備的序列號?,F(xiàn)在這個方法被棄用了,Build.SERIAL 將始終設(shè)置為 "UNKNOWN" 以保護用戶的隱私。
適配的方法為先請求 READ_PHONE_STATE 權(quán)限,然后調(diào)用 Build.getSerial() 方法。

以上所述是小編給大家介紹的Android版本適配9.0 Pie詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評論