代码之家  ›  专栏  ›  技术社区  ›  Paul Lammertsma

android p显示api兼容性错误消息

  •  11
  • Paul Lammertsma  · 技术社区  · 6 年前

    在android p上运行针对sdk级别27构建的应用程序时,会显示以下对话框(对话框标题是应用程序的名称):

    Mysterious dialog

    检测到API兼容性问题(有关详细信息,请访问g.co/dev/appcompat)

    URL指向 this page about restrictions on non-SDK interfaces 是的。我的应用程序不使用反射本身,但它确实使用gson。

    logcat中没有立即可见的日志消息,除了以下可能的消息:

    访问隐藏字段landroid/widget/abslistview;->mischildviewenabled:z(浅灰色,反射)

    2 回复  |  直到 6 年前
        1
  •  8
  •   Paul Lammertsma    6 年前

    原来我的一个gson模型公开了一个返回文件的getter。gson使用反射递归地检查类的字段,这样做违反了不允许的sdk接口的反射。

    阅读问题中链接的限制文档让我仔细查看了日志消息,果然有一条引起了我的注意:

    访问隐藏字段[…](暗灰色,反射)

    我不记得确切的信息,但关键是 黑暗的 灰色的。

    我发现这一点的方法是以sdk级别28为目标并启用新的strictmode特性 detectNonSdkApiUsage() ,在此基础上,我的应用程序将崩溃,并出现堆栈跟踪:

    if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectNonSdkApiUsage()
                .penaltyLog()
                .build());
    }
    

    堆栈的痕迹不是很有见地,但它给了我正确的方向。

        2
  •  0
  •   Ven Ren    6 年前

    在oncreate()init方法的应用程序类中,此方法可以关闭此对话框。

    private void closeAndroidPDialog(){
        try {
            Class aClass = Class.forName("android.content.pm.PackageParser$Package");
            Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);
            declaredConstructor.setAccessible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        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);
            mHiddenApiWarningShown.setBoolean(activityThread, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    但这很危险 这样只会让你看不到对话。

    推荐文章