NoClassDefFoundError нет смысла - PullRequest
       22

NoClassDefFoundError нет смысла

0 голосов
/ 24 сентября 2018

Я обнаружил проблему с приложением для Android.

Моя проблема заключается в том, что при открытии приложения происходит сбой, приводящий к NoClassDefFoundError.Это трассировка стека:

09-24 19:37:14.542 32545-32545/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: it.bcv.invadelite, PID: 32545
java.lang.NoClassDefFoundError: com.electronwill.nightconfig.core.file.FormatDetector$$Lambda$0
    at com.electronwill.nightconfig.core.file.FormatDetector.registerExtension(FormatDetector.java:27)
    at com.electronwill.nightconfig.json.JsonFormat.<clinit>(JsonFormat.java:66)
    at it.bcv.invade.appdb.ConfigAdapter.<init>(ConfigAdapter.java:39)
    at it.bcv.invade.appdb.Db.<init>(Db.java:51)
    at it.bcv.invade.appdb.Db.init(Db.java:75)
    at it.bcv.invadelite.activities.StartActivity.initDatabase(StartActivity.java:165)
    at it.bcv.invadelite.activities.StartActivity.onCreate(StartActivity.java:125)
    [...]

и build.gradle файл имеет следующие строки:

// https://github.com/TheElectronWill/Night-Config
implementation 'com.github.TheElectronWill.Night-Config:core:3.1.0'
implementation 'com.github.TheElectronWill.Night-Config:json:3.1.0'

Класс FormatDetector подобен этому

private static final Map<String, Supplier<ConfigFormat<?>>> registry = new ConcurrentHashMap<>();

/**
 * Registers a ConfigFormat for a specific fileExtension.
 *
 * @param fileExtension the file extension
 * @param format        the config format
 */
public static void registerExtension(String fileExtension, ConfigFormat<?> format) {
    registry.put(fileExtension, () -> format);
}

в то время как класс JsonFormat имеет это объявление

private static final JsonFormat<FancyJsonWriter> FANCY = new JsonFormat<FancyJsonWriter>() {
    @Override
    public FancyJsonWriter createWriter() {
        return new FancyJsonWriter();
    }

    @Override
    public ConfigParser<Config> createParser() {
        return new JsonParser(this);
    }
};

static {
    FormatDetector.registerExtension("json", FANCY);
}

Я погуглил об этой ошибке и обнаружил, что это может быть связано с отсутствием некоторых классов в пути к классам.По этой причине я проанализировал apk с помощью анализатора Android Studio и обнаружил, что в classes.dex есть оба пакета com.electronwill.nightconfig.core и com.electronwill.nightconfig.json, которые являются единственными двумя пакетами, которые я использую.

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

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

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Автор NightConfig здесь.

Инструменты студии Android работают с лямбдами, но более старые версии Android не имеют класса Supplier, который используется моим FormatDetector.Вероятно, именно это и вызывает ошибку.

Вам следует использовать новые модули NightConfig *_android , которые адаптированы для более старых API Android.

0 голосов
/ 24 сентября 2018

Используемая вами библиотека использует функцию Java 8 (лямбда), которая не поддерживается вашей текущей настройкой.Проблема в этой строке:

registry.put(fileExtension, () -> format);

В официальных документах вы найдете пошаговую информацию о том, как использовать функции Java 8 в Android .Обычно это означает обновление плагина Android до 3.0.0 или выше и изменение совместимости источника и цели в вашей build.gradle:

android {
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Android не поддерживает все функции Java 8;также некоторые функции недоступны ниже API 24 (Android 7).

0 голосов
/ 26 сентября 2018

Я решил проблему другим подходом к этой проблеме.

В db lib у меня был класс ConfigAdapter, используемый для переноса некоторых функций из библиотеки Night-Config.

Я преобразовал этот класс в такой интерфейс:

/**
 * Find and return value at searched key, or default.
 *
 * @param k   The key to search
 * @param def The default value if object not found
 * @param <T> The value's type
 * @return The value at {@code k} or {@code def}
 */
<T> T get(String k, T def);

/**
 * Replaces old value with new one, return old.
 *
 * @param k     The value's key
 * @param v     The value to set
 * @param <T>   The type of old value
 * @return      The old value if any, or null
 */
<T> T put(String k, T v);

/**
 * Closes the config resource.
 */
void close();

, чем я в своем приложении. Я создал ConfigAdapterImpl класс, подобный этому

public class ConfigAdapterImpl implements ConfigAdapter {

    private SharedPreferences preferences;

    public ConfigAdapterImpl(SharedPreferences _preferences) {
        preferences = _preferences;
    }

    @Override
    public <T> T get(String s, T t) {
        Map<String, ?> all = preferences.getAll();

        // Watch out unchecked cast!

        if (all.get(s) != null)
            return (T) all.get(s);
        else return t;
    }


    @Override
    public <T> T put(String s, T t) {
        SharedPreferences.Editor editor = preferences.edit();

        T oldVal = get(s, null);

        if (t instanceof String)
            editor.putString(s, (String) t);
        else if (t instanceof Integer)
            editor.putInt(s, (Integer) t);
        else if (t instanceof Boolean)
            editor.putBoolean(s, (Boolean) t);

        editor.apply();
        return oldVal;
    }

    @Override
    public void close() {

    }
}

С помощью этой реализацииконфигурации обрабатываются менеджером настроек Android, и моя библиотека использует их как объект Night-Config.

0 голосов
/ 24 сентября 2018

Я действительно не знаю graddle, но если я проверю репозиторий maven, возможно, зависимость должна быть отмечена как:

compile group: 'com.electronwill.night-config', name: 'core', версия: '3.3.1'

см .:

https://mvnrepository.com/artifact/com.electronwill.night-config/core/3.3.1

...