Android P отображает сообщение об ошибке совместимости API - PullRequest
0 голосов
/ 06 июля 2018

Запуск приложения, созданного на уровне SDK 27 на Android P, несколько непредсказуемо отображает следующее диалоговое окно (заголовок диалога - название приложения):

Mysterious dialog

Обнаружены проблемы с совместимостью API (для получения дополнительной информации посетите g.co/dev/appcompat)

URL-адрес ведет к этой странице об ограничениях интерфейсов не-SDK .Мое приложение не использует само отражение, но оно использует Gson.

В Logcat нет очевидных сообщений журнала, кроме таких сообщений, как:

Доступ к скрытому полю Landroid/ widget / AbsListView; -> mIsChildViewEnabled: Z (светло-серый список, отражение)

Ответы [ 2 ]

0 голосов
/ 15 января 2019

в вашем классе приложения в методе 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();
    }
}

но это опасно этот способ просто заставляет вас не видеть диалог.

0 голосов
/ 06 июля 2018

Оказывается, что одна из моих моделей Gson выставила геттер, который вернул File. 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());
}

Трассировка стека не была сразу проницательной, но указала мне правильное направление.

...