android 4.X: NoClassDefFoundError: io / reactivex / Наблюдаемый [дубликат]

Простыми словами ... Если я пишу новый класс Swimmer для добавления функциональности swim () и вам нужно использовать объект класса say Dog, и этот класс Dog реализует интерфейс Animal, который объявляет swim () [To лучше понять ... вы можете нарисовать диаграмму о том, о чем я говорю]. В верхней части иерархии (Animal) он очень абстрактный, а внизу (Dog) он очень конкретный. То, как я думаю о «программировании для интерфейсов», заключается в том, что, когда я пишу класс Swimmer, я хочу написать свой код против интерфейса, который находится так далеко от иерархии, которая в этом случае является объектом Animal. Интерфейс свободен от деталей реализации и, таким образом, делает ваш код слабосвязанным. Детали реализации могут быть изменены со временем, однако это не повлияет на оставшийся код, поскольку все, с чем вы взаимодействуете, связано с интерфейсом, а не с реализацией. Вам все равно, что такое реализация ... все, что вы знаете, это то, что будет класс, который будет реализовывать интерфейс.

7
задан Sidakpreet N 28 September 2015 в 07:18
поделиться

6 ответов

Измените свои зависимости, как показано ниже:

Отредактированные зависимости:

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.android.support:cardview-v7:23.0.1'
compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.google.android.gms:play-services:8.1.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.googlecode.linkedin-j:linkedin-j-core:1.0.416'
compile 'oauth.signpost:signpost-core:1.2.1.2'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4'
compile 'com.googlecode.json-simple:json-simple:1.1'
compile 'org.twitter4j:twitter4j-core:4.0.2'
compile files('libs/itsrts-pptviewer.jar')
compile files('libs/dropbox-android-sdk-1.6.3.jar')
compile 'com.joanzapata.pdfview:android-pdfview:1.0.1@jar'
compile 'com.facebook.android:facebook-android-sdk:4.1.0'  

Причина в том, что 'compile fileTree (dir:' libs ', include: [' * .jar '])' включает весь файл jar в gradle, который находится в папке libs.

Спасибо. !!

0
ответ дан AndiGeeky 22 August 2018 в 01:55
поделиться
  • 1
    Все еще не решает проблему. Любое другое обходное решение? – Sidakpreet N 28 September 2015 в 08:00

Я не заглянул в эту логику, но в моем случае это произошло из-за конфликтов версий compile 'com.android.support:appcompat-v7:25.3.1' и compile 'com.google.android.gms:play-services:10.2.4' в файле build.gradle .

Только разрешение multidex не работает для меня. При поиске других решений я обнаружил, что некоторые люди жалуются на странную проблему конфликта версий play-services. Итак, я отменил изменения кода и, наконец, изменил версию play-services с 10.2.4 до 10.2.1, и это сработало для меня.

1
ответ дан Ankur 22 August 2018 в 01:55
поделиться

Поддержка Multidex для Android 5.0 и выше

Android 5.0 и более поздних версий использует среду выполнения ART, которая поддерживает загрузку нескольких файлов dex из файлов APK приложения. ART выполняет предварительную компиляцию во время установки приложения, которая сканирует файлы классов (..N) .dex и компилирует их в один файл .oat для исполнения устройством Android. Дополнительные сведения о времени выполнения Android 5.0 см. В разделе Введение в ART.

Именно поэтому ваше приложение отлично работает на уровне API 21.

Поддержка Multidex до Android 5.0

Версии платформы до Android 5.0 используют рабочую среду Dalvik для выполнения кода приложения. По умолчанию Dalvik ограничивает приложения одним файлом байт-кода classes.dex для APK. Чтобы обойти это ограничение, вы можете использовать библиотеку поддержки multidex, которая станет частью основного файла DEX вашего приложения, а затем управляет доступом к дополнительным файлам DEX и содержащемуся в них коду.

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

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

В манифесте добавьте класс MultiDexApplication из библиотеки поддержки multidex в элемент приложения.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

Альтернативно этому, если ваше приложение расширяет класс Application, вы можете переопределить метод attachBaseContext() и вызвать MultiDex.install(this), чтобы включить multidex.

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

Надеюсь, это поможет вам.

8
ответ дан Bhavesh Patadiya 22 August 2018 в 01:55
поделиться
  • 1
    Пробовал эту, но ту же ошибку – Sidakpreet N 28 September 2015 в 07:59
  • 2
    Спасибо .. Bhuvesh Я просто добавляю ниже код в свой файл приложения, он делает трюк, не BUNDLE в oncreate нет attachBaseContext () в этом, и до этого я использовал только MULTIDEX JAR в моей сборке, но мое приложение рушилось ниже api 21 при запуске время ... теперь его работа не знает причины этого. public void onCreate () {MultiDex.install (this); super.onCreate (); // инициализировать singleton sInstance = this; } – Ancee 14 March 2016 в 10:08

Задача shrinkProdDebugMultiDexComponents вызывает Proguard , поэтому эта ошибка исходит из кода Proguard .

Я предполагаю, что вы не используете последнюю версию SDK Olive Office (которая, вероятно, запутана с ошибкой или неправильно настроенной версией Proguard). Если это так, получите последнюю версию от разработчика SDK.

Для обходного пути проверьте эту аналогичную ошибку. Хотя он был закрыт с условием wontfix, этот блогпост описывает, как исправлять код Proguard.

Также проверьте на этом и , что отвечает Эриком Лафортунэ (автор Proguard) по аналогичным проблемам.

0
ответ дан Community 22 August 2018 в 01:55
поделиться

Решена проблема с сбоем. Я удаляю некоторую неиспользуемую зависимость, а также удаляю зависимость rx java io.reactivex.rxjava. Заменив Rx java, я добавил некоторые фиктивные классы в моем пакете, который уже описан здесь https://realm.io/docs/java/latest .

// File 1
package io.reactivex;
public class Flowable {
}
// File 2
package io.reactivex;
public class Observable {
}
// File 3
package io.reactivex;
public enum BackpressureStrategy {
   LATEST;
}
1
ответ дан Devganiya Hitesh 22 August 2018 в 01:55
поделиться

В API 21 команда :app:shrinkProdDebugMultiDexComponents не вызывается, поскольку API 21 уже использует ART вместо Dalvik. Таким образом, изначально поддерживаем multidex.

Для API ниже 21, тогда выполняется команда :app:shrinkProdDebugMultiDexComponents.

Правильно ли вы настроили поддержку multidex?

Установили ли вы свой манифест для поддержки Multidex?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
  <application
    ...
    android:name="android.support.multidex.MultiDexApplication">
    ...
  </application>
</manifest>

ИЛИ если вы действительно расширяете класс приложения, вы можете сделать это:

public class MyApplication extends Application {
    ...
    @Override
    protected void attachBaseContext(Context base) {
       super.attachBaseContext(base);
       MultiDex.install(this);
    }
    ...     
}

или использовать эту «предварительно построенную» версию

public class MyApplication extends MultiDexApplication{

 ...     

}
1
ответ дан Kuffs 22 August 2018 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: