build.gradle里的targetSdkVersion從 26增加到 29;下面是我們遇到一些兼容性問題
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">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>
- 前臺線程權(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
- 友盟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的方式直接訪問)