android targetSDK 從8.0升級到10.0

build.gradle里的targetSdkVersion從 26增加到 29;下面是我們遇到一些兼容性問題

  1. http網(wǎng)絡(luò)請求崩潰
    java.io.IOException: Cleartext HTTP traffic to 包名 not permitted
    原因分析:
    android 9.0默認(rèn)使用https網(wǎng)絡(luò)請求,http請求需要手動打開
    解決辦法:
    AnroidManifest.xml中的application顯示設(shè)置
    <application android:usesCleartextTraffic="true">

  2. android 8.0透明Activity設(shè)置方向崩潰
    Only fullscreen opaque activities can request orientation
    原因分析:
    我們項(xiàng)目大部分都是鎖垂直方向。然而8.0的系統(tǒng)在透明主題時,如果請求方向,直接拋出崩潰
    解決辦法:
    8.0透明activity不鎖死方向,系統(tǒng)沿用上個頁面的方向
    比較優(yōu)雅的解決辦法,不改業(yè)務(wù)代碼https://blog.csdn.net/starry_eve/article/details/82777160

這個要特別注意第三方,比如友盟分享的中轉(zhuǎn)頁,也是鎖死方向?qū)е卤罎⒌?,要一一排?/p>

  1. 前臺線程權(quán)限崩潰
    9.0需要在manifest里聲明前臺線程權(quán)限,才能使用
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    前臺線程注意區(qū)分版本
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(starter);
        } else {
            context.startService(starter);
        }

4.多進(jìn)程訪問WebView,崩潰問題

Caused by: java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377

原因分析:

極光、融云在app主進(jìn)程外,創(chuàng)建了各自的通信、?;钸M(jìn)程,不在同一個進(jìn)程里訪問webView的時候,在android 9.0以上會報錯

解決辦法:

Application的onCreate方法里,加入如下判斷

//融云和app都會初始化application一次,這里避免了融云初始化的步驟
 if (!DeviceUtil.isDefaultProcess(this)) {
    WebViewUtils.safeWebViewInOtherThread(this);
 return; }

public static void safeWebViewInOtherThread(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        WebView.setDataDirectorySuffix(DeviceUtil.getCurProcessName(context));  }
}


    /**
     * 判斷當(dāng)前線程名稱是否和包名一致
     *
     * @param context 上下文
     * @return true 一致
     */
    public static boolean isDefaultProcess(Context context) {
        String processName = getCurProcessName(context);

        if (TextUtils.isEmpty(processName))
            return false;

        return processName.equals(context.getPackageName());
    }


    /**
     * 獲得當(dāng)前進(jìn)程名字
     *
     * @return 當(dāng)前進(jìn)程名稱
     */
    public static String getCurProcessName(Context context) {
        int pid = android.os.Process.myPid();
        ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

        if (mActivityManager.getRunningAppProcesses() == null)
            return "";

        Iterator iterator = mActivityManager.getRunningAppProcesses().iterator();
        ActivityManager.RunningAppProcessInfo appProcess;
        do {
            if (!iterator.hasNext()) {
                return null;
            }
            appProcess = (ActivityManager.RunningAppProcessInfo) iterator.next();
        } while (appProcess.pid != pid);
        return appProcess.processName;
    }

https://blog.csdn.net/JiaoJunfeng/article/details/90478935

以下是未遇到,但是會涉及到的問題,要排查

1.黑名單api問題
使用google工具veridex掃描,不要對黑名單里的屬性進(jìn)行反射調(diào)用。
深灰名單里,發(fā)現(xiàn)國產(chǎn)第三方工具、極光、tinker都有用到,目前暫無影響
項(xiàng)目里掃描后沒有黑名單反射

2.加密方式崩潰問題
The Crypto provider has been deleted in Android P (and was deprecated in Android N), so the code will crash.
項(xiàng)目里面的加密算法,如果第二個入?yún)⒅付薱rypto provider就要仔細(xì)篩查下http://www.itdecent.cn/p/ca8c2f4b0ee6

  1. 友盟QQ分享失敗的問題
    如果9.0的手機(jī),在target api 28上面,分享qq會失敗。
    主要是廢棄的apache http庫,在9.0里被去掉了,https://developer.umeng.com/docs/66632/detail/94386
    但是現(xiàn)在(2019.5.18)友盟分享qq,在幾臺9.0的手機(jī)上均測試通過。
適配10.0

具體怎么適配有文章講的很清楚https://juejin.cn/post/6844904073024503822#heading-1
下面咱說下自己的適配步驟
1、排查文件有沒有放安全區(qū)域:內(nèi)置應(yīng)用目錄、外置(應(yīng)用目錄)
2、文件訪問方式,谷歌給出的方案要么適配,要么用兼容方案android:requestLegacyExternalStorage="true"
這樣能用老的File方式直接訪問特定地方文件
我們選擇用android:requestLegacyExternalStorage="true"適配
(在安卓11上,谷歌又默認(rèn)支持了這種方式,因此只要文件存儲在內(nèi)置、外置(應(yīng)用目錄)位置,都能用以前File的方式直接訪問)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容