美文网首页
Android 去掉9.0后反射警告弹框

Android 去掉9.0后反射警告弹框

作者: RookieRun | 来源:发表于2019-12-11 11:01 被阅读0次

1.现象:
Android9.0后的系统有时会弹出


警告弹窗.png

2.问题原因:

Android P 后谷歌限制了开发者调用非官方公开API 方法或接口,
也就是说,你用反射直接调用源码就会有这样的提示弹窗出现,
非 SDK 接口指的是 Android 系统内部使用、并未提供在 SDK 中的接口,
开发者可能通过 Java 反射、JNI 等技术来调用这些接口。
但是,这么做是很危险的:非 SDK 接口没有任何公开文档,必须查看源代码才能理解其行为逻辑。
但是源码是JAVA写的,万物皆可反射,所以还是可以用反射干掉这个 每次启动都会弹出的提醒窗口

系统源码
if (isAppDebuggable || isApiWarningEnabled) {
            if (!mMainThread.mHiddenApiWarningShown && VMRuntime.getRuntime().hasUsedHiddenApi()) {
            <!--可以看到,其实每次创建Activity都会弹的,为了避免每次都弹,Android自己加了一个标示-->
            <!--而我们也就是利用反射修改这个标示,使得第一次都不会弹-->
                // Only show the warning once per process.
                mMainThread.mHiddenApiWarningShown = true;

                String appName = getApplicationInfo().loadLabel(getPackageManager())
                        .toString();
                String warning = "Detected problems with API compatibility\n"
                                 + "(visit g.co/dev/appcompat for more info)";
                if (isAppDebuggable) {
                    new AlertDialog.Builder(this)
                        .setTitle(appName)
                        .setMessage(warning)
                        .setPositiveButton(android.R.string.ok, null)
                        .setCancelable(false)
                        .show();
                } else {
                    Toast.makeText(this, appName + "\n" + warning, Toast.LENGTH_LONG).show();
                }
            }
        }

3.解决办法:
在Application 的onCreate中反射关闭弹框

/**
     * 隐藏9.0启屏弹窗
     */
    private void hidePAPIDialog() {
        try {
            Class cls = Class.forName("android.app.ActivityThread");
            Method declaredMethod = cls.getDeclaredMethod("currentActivityThread");
            declaredMethod.setAccessible(true);
            Object activityThread = declaredMethod.invoke(null);
            Field mHiddenApiWarningShown = cls.getDeclaredField("mHiddenApiWarningShown");
            mHiddenApiWarningShown.setAccessible(true);
            <!--重点是这个值,设置为true之后就不会再弹窗了-->
            mHiddenApiWarningShown.setBoolean(activityThread, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

参考文章:
1.https://www.jianshu.com/p/126157350c78
2.https://www.jianshu.com/p/f87fe39caf1d?tdsourcetag=s_pctim_aiomsg

相关文章

网友评论

      本文标题:Android 去掉9.0后反射警告弹框

      本文链接:https://www.haomeiwen.com/subject/rilogctx.html