Нет статического метода isDeviceProtectedStorage ошибка времени выполнения - PullRequest
6 голосов
/ 30 марта 2019

Здесь есть много вопросов по этой же проблеме, но ни один не затрагивает основную причину или то, что я вижу - и поэтому предлагаемые ответы не помогают.

Мое приложение создается без проблем, однако при запуске я постоянно получаю исключение времени выполнения:

java.lang.NoSuchMethodError: No static method isDeviceProtectedStorage(Landroid/content/Context;)Z in class Landroid/support/v4/content/ContextCompat; or its super classes (declaration of 'android.support.v4.content.ContextCompat' appears in /data/app/com.ohmd-1/base.apk:classes116.dex)
                      at com.google.firebase.FirebaseApp.zzc(Unknown Source)
                      at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)
                      at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)
                      at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)
                      at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)
                      at android.content.ContentProvider.attachInfo(ContentProvider.java:1748)
                      at android.content.ContentProvider.attachInfo(ContentProvider.java:1723)
                      at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)

Из других вопросов я вижу, что это может быть связано с поддержкой библиотек в зависимостях, имеющихразные версии, поэтому я ввел в действие одну (ые) библиотечную (ые) версию (и), добавив в свой gradle следующее:

configurations.all {
    resolutionStrategy {
        force 'com.google.firebase:firebase-core:15.0.2'
        force 'com.google.firebase:firebase-messaging:15.0.2'
    }
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group.equals('com.android.support')) {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '28.0.0'
            }
        }
    }
}

Однако, похоже, это не имеет значения.Я вижу в своем дереве зависимостей, что все версии поддержки действительно 28.0.0 , как указано в resoutionStrategy, так что похоже, что эта часть работает.

Мой полный файл Gradle здесь .

Я разместил свои зависимости gradle (./gradlew app:dependencies) здесь .

На данный момент я пытаюсь узнать, какчтобы правильно отладить это.Я в полной растерянности. Кто-нибудь знает, как отладить этот тип ошибки?

У меня есть - конечно - очищенные и недействительные кэши много раз.

ОБНОВЛЕНИЕ

Я обнаружил, что проблема действительно в разделе initializeAllApis FirebaseApp.Конкретная строка:

boolean isDeviceProtectedStorage = ContextCompat.isDeviceProtectedStorage(this.applicationContext);

ContextCompat говорит, что это от com.android.support:support-compat:28.0.0.

Так что это, кажется, ссылается на самую последнюю, но когда эта строка выполняется, я получаю вышеуказанную трассировку стека.Поэтому, пока я сужаю его, я все еще не уверен, почему выдается ошибка или как ее исправить.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Метод ContextCompat # isDeviceProtectedStorage () существует с версии 24.1.0 ... в то время как build.gradle не является MCVE , и поэтому мне сложно воспроизвести проблему в моей IDE - и поэтому я могу применять только здравый смысл, вместо использования проб и ошибок, как я обычно привык. Если бы вы создали MCVE с наименьшим кодом для воспроизведения проблемы , я мог бы расширить свой ответ (создание таких часто приводит к чему-то, что работает); и, кажется, есть еще build.gradle.

Следует избегать смешения конфигураций compile и implementation. это не просто два имени для одного и того же, но они рассматриваются как две конфигурации. это кажется причиной неожиданного поведения. Изгиб номеров версий не облегчает решение такой проблемы.

Существует одна compile зависимость (даже если она может быть предоставлена ​​в версии 28.0.0):

compile 'com.android.support:support-v4:26.1.0'

И вот эта implementation зависимость:

implementation 'com.google.firebase:firebase-core:15.0.2'

Это скорее текущие версии :

implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.google.firebase:firebase-core:16.0.8'
implementation 'com.google.firebase:firebase-messaging:17.5.0'

Перевод всех compile зависимостей в implementation должен привести к тому, что обе зависимости будут в одной и той же конфигурации, тогда ContextCompat должно быть известно FirebaseApp, как и должно быть. Только что видно, что в перечисленных implementation зависимостях есть два unspecified пакета, что не совсем выглядит "нормальным" - и большинство номеров версий в целом выглядят устаревшими. Эти resolutionStrategy конфигурации должны быть полностью исключены - и исправлены должным образом, путем предоставления подходящих номеров версий и последующего применения исключения.

0 голосов
/ 01 апреля 2019

Возможно, проблема связана с firebase-core. Firebase-core зависит от com.android.support:support-v4:24.0.0, минимальный Android-API для использования - 24. Убедитесь, что версия lib вашей базовой библиотеки Firebase соответствует используемой вами версии API. Посмотрите здесь: Зависимости библиотеки Firebase

...