Skip to content

Android项目 target sdk升级到28遇到的一些问题以及解决方案

shewenbiao edited this page Apr 5, 2021 · 2 revisions

1.Cleaner项目target从26升级到28遇到的问题

List

原因:

针对 Android 9 或更高版本并使用前台服务的应用必须请求 FOREGROUND_SERVICE 权限。 如果针对 Android 9 或更高版本的应用尝试创建一个前台服务且未请求 FOREGROUND_SERVICE,则系统会引发 SecurityException。 另外这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

解决办法: 在AndroidManifest里添加权限 <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

原因:

在安卓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>

解决办法: 将Lottie版本升级到2.7.0以上

项目中受到影响的地方: 激活applocker权限后返回到列表页面后的弹框

解决办法: 在AndroidManifest里添加权限<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />

项目中受到影响的地方: 应用管理页面的应用卸载

具体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.References

1.行为变更:以 API 级别 28+ 为目标的应用

2.targetSdkVersion升级到28一些修改的地方

3.Andriod版本适配 check list(持续更新)

4.Only fullscreen activities can request orientation终极解决方法

Clone this wiki locally