-
Notifications
You must be signed in to change notification settings - Fork 0
Android项目 target sdk升级到28遇到的一些问题以及解决方案
- 1.1 在9.0上出现
java.lang.SecurityException: Permission Denial: startForeground from pid=32221, uid=10642 requires android.permission.FOREGROUND_SERVICE
- 1.2 在android 8.0上会出现java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
- 1.3 在Android 9.0上,隐私政策和服务条款页面打不开(webview显示的错误是net::ERR_CLEARTEXT_NOT_PERMITTED)
- 1.4 有的Lottie动画出现java.lang.IllegalArgumentException: Invalid Layer Save Flag - only ALL_SAVE_FLAGS is allowed,该错误在Lottie github项目的issue上有(https://github.com/airbnb/lottie-android/issues/802)
- 1.5 在9.0上调用系统intent去卸载应用不起作用
- 1.6 Android 9.0上出现java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion问题
1.1 在9.0上出现java.lang.SecurityException: Permission Denial: startForeground from pid=32221, uid=10642 requires android.permission.FOREGROUND_SERVICE
原因:
针对 Android 9 或更高版本并使用前台服务的应用必须请求 FOREGROUND_SERVICE 权限。 如果针对 Android 9 或更高版本的应用尝试创建一个前台服务且未请求 FOREGROUND_SERVICE,则系统会引发 SecurityException。 另外这是普通权限,因此,系统会自动为请求权限的应用授予此权限。
解决办法: 在AndroidManifest里添加权限 <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
1.2 在android 8.0上会出现java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
原因:
在安卓8.0版本时为了支持全面屏,增加了一个限制:如果是透明的Activity,则不能固定它的方向。然而这个bug只有在8.0中有,8.0以上已经修复。具体crash有两种:
1.Activity的风格为透明,在manifest文件中指定了一个方向
2.Activity的风格为透明,如果调用setRequestedOrientation方法固定方向
什么是透明Activity?
看代码:
if (getApplicationInfo().targetSdkVersion > O && mActivityInfo.isFixedOrientation()) {
final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window);
final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
ta.recycle();
if (isTranslucentOrFloating) {
throw new IllegalStateException(
"Only fullscreen opaque activities can request orientation");
}
}
public static boolean isTranslucentOrFloating(TypedArray attributes) {
final boolean isTranslucent =
attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsTranslucent,
false);
final boolean isSwipeToDismiss = !attributes.hasValue(
com.android.internal.R.styleable.Window_windowIsTranslucent)
&& attributes.getBoolean(
com.android.internal.R.styleable.Window_windowSwipeToDismiss, false);
final boolean isFloating =
attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating,
false);
return isFloating || isTranslucent || isSwipeToDismiss;
}
大意就是,有上面三种风格就是透明。
解决办法: 需要的话透明activity不设置屏幕方向,或者参照Only fullscreen activities can request orientation终极解决方法中建议的方法
项目中受到影响的地方:
- 快捷通知栏点击FlashLight button后的权限弹框
- 快捷通知栏点击Close button后的弹框
- 卸载和安装应用后的弹框(包括安装应用后上锁推荐弹框)
- 自动清理弹框
- 安装病毒应用后的病毒检测弹框
- 解锁应用解锁页面后的Intruder提醒弹框
原因:
隐私政策和服务条款页面访问的是Http请求,而Android 9.0的系统上面默认所有Http的请求都被阻止了。
解决办法一: 在AnroidManifest.xml中的application标签显示设置<application android:usesCleartextTraffic="true">
解决办法二: 在AnroidManifest.xml中的application标签显示设置<application android:networkSecurityConfig="@xml/network_security_config">
,在xml目录下创建network_security_config.xml文件, 内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true"/>
<!--for facebook audiences(android>=9.0)start -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
<!--for facebook audiences(android>=9.0) end -->
</network-security-config>
1.4 有的Lottie动画出现java.lang.IllegalArgumentException: Invalid Layer Save Flag - only ALL_SAVE_FLAGS is allowed,该错误在Lottie github项目的issue上有(https://github.com/airbnb/lottie-android/issues/802)
解决办法: 将Lottie版本升级到2.7.0以上
项目中受到影响的地方: 激活applocker权限后返回到列表页面后的弹框
解决办法: 在AndroidManifest里添加权限<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
项目中受到影响的地方: 应用管理页面的应用卸载
1.6 Android 9.0上出现java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion问题
具体log:
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion;
at gm.b(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):3)
at gn.a(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):3)
at gp.a(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):18)
at com.google.android.gms.ads.internal.util.aq.a(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):5)
at fq.a(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):19)
at fq.run(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):8)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion" on path: DexPathList[[zip file "/data/user_de/0/com.google.android.gms/app_chimera/m/00000008/AdsDynamite.apk"],nativeLibraryDirectories=[/data/user_de/0/com.google.android.gms/app_chimera/m/00000008/AdsDynamite.apk!/lib/armeabi-v7a, /data/user_de/0/com.google.android.gms/app_chimera/m/00000008/AdsDynamite.apk!/lib/armeabi, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at ab.loadClass(:com.google.android.gms.dynamite_dynamiteloader@17785077@17.7.85 (100300-253824076):4)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 6 more
java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion" on path: DexPathList[[zip file "/data/user_de/0/com.google.android.gms/app_chimera/m/00000008/AdsDynamite.apk"],nativeLibraryDirectories=[/data/user_de/0/com.google.android.gms/app_chimera/m/00000008/AdsDynamite.apk!/lib/armeabi-v7a, /data/user_de/0/com.google.android.gms/app_chimera/m/00000008/AdsDynamite.apk!/lib/armeabi, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at ab.loadClass(:com.google.android.gms.dynamite_dynamiteloader@17785077@17.7.85 (100300-253824076):4)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at gm.b(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):3)
at gn.a(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):3)
at gp.a(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):18)
at com.google.android.gms.ads.internal.util.aq.a(:com.google.android.gms.dynamite_adsdynamite@17785077@17.7.85 (100300-253824076):5)
看log是和gms ads相关的,然后在googleads-mobile-android-examples wiki上提问,得到的回复是:
This has been fixed in the most recent Google play services update.
To resolve for apps that aren't up to date, add
<uses-library android:name="org.apache.http.legacy" android:required="false" />
to your AndroidManifest.xml.
2.targetSdkVersion升级到28一些修改的地方