Nano Hash - криптовалюты, майнинг, программирование

Инструментальный тест случайно не проходит с включенным мультидексированием

В моем приложении для Android включено мультидексирование. Приложение нормально работает на эмуляторах. Я использую robotium для тестирования приложения. Но когда я выполняю инструментальные тестовые случаи, иногда тест проходит, но в основном они также терпят неудачу после перезагрузки системы. Нет никакого изменения кода между моментом, когда он проходит, и сбоем.

Конфигурация градиента по умолчанию:

android {
        defaultConfig {
        applicationId "com.example.androidapp"
        minSdkVersion 16
        targetSdkVersion 23
        multiDexEnabled true
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
        testProguardFile "proguard-test.txt"
    }
}

Также добавление зависимостей для теста:

androidTestCompile fileTree(dir: 'libs', include:'robotium-solo-5.3.0.jar') 

androidTestCompile ('com.android.support:multidex-instrumentation:1.0.1') {
         exclude group: 'com.android.support', module: 'multidex' }

В AndroidManifest.xml я упомянул тег приложения как:

<application
        android:name="StartupActivity"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" ...../>

Я расширил «android.support.multidex.MultiDexApplication» в StartupActivity. Когда тестовые случаи инструментирования падают, я получаю следующую ошибку:

INSTRUMENTATION_RESULT: shortMsg=java.lang.IllegalAccessError
INSTRUMENTATION_RESULT: longMsg=java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
INSTRUMENTATION_CODE: 0

Сообщение об ошибке в logcat:

W/dalvikvm﹕ Class resolved by unexpected DEX: Lcom/example/androidapp/StartupActivity;(0xa695df08):0x9910e000 ref [Landroid/support/multidex/MultiDexApplication;] Landroid/support/multidex/MultiDexApplication;(0xa695df08):0x99a2c000
W/dalvikvm﹕ (Lcom/example/androidapp/StartupActivity; had used a different Landroid/support/multidex/MultiDexApplication; during pre-verification)
W/dalvikvm﹕ Unable to resolve superclass of Lcom/example/androidapp/StartupActivity; (540)
W/dalvikvm﹕ Link of class 'Lcom/example/androidapp/StartupActivity;' failed
D/AndroidRuntime﹕ Shutting down VM
W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa628c288)

Тестовый класс выглядит примерно так:

public class HelloActivityTest extends ActivityInstrumentationTestCase2<HelloActivity> {
private Solo solo;
public HelloActivityTest() {
    super(HelloActivityTest.class);
}
  @Override
  public void setUp() throws Exception {
    setActivityInitialTouchMode(false);
    solo = new Solo(getInstrumentation(), getActivity());
  }

  public void test1() {}

  public void test2() {}

}

Я запускаю тестовый пример как тест Android. Я не могу понять, какая зависимость портит код. Кроме того, скептически относятся к случайным сбоям кода. Пожалуйста помоги.


  • Члены моей команды заметили нечто подобное в отношении тестов эспрессо и мультидекса. Более того, он не может определить, что есть тесты для запуска с включенным multidex... 14.10.2015
  • @OceanLife Вы нашли какое-нибудь решение? 15.10.2015
  • Нет, еще нет. Он надежен и без мультидекса, поэтому я предложил скомпилировать некоторые из аналитических библиотек, которые накапливают вещи, в качестве временного решения... просто чтобы вернуться к тому, чтобы не требовать мультидекса. Ваше сообщение об ошибке (неожиданный импл) напоминает мне об ошибках несовместимости Java SDK, так называемых VerifyError (s)... Получите некоторую защиту на ходу, чтобы удалить громоздкие биты... 15.10.2015
  • @whitepearl Возможный дубликат stackoverflow.com/a/28621986/1233652? 16.10.2015
  • @AlexLipov У меня нет проблем с MultiDexTestRunner. Проблема в случайности ошибки. 16.10.2015

Ответы:


1

Нашел решение для того же, что и установка параметров проверки и оптимизации dex. Вы также можете установить для dalvik.vm.dexopt-flags значение v=n, чтобы фреймворк проходил проверку -Xverify:none -Xdexopt:verified для отключения проверки.

Выполнять:

adb shell setprop dalvik.vm.dexopt-flags v=n,o=v
adb shell stop installd
adb shell start installd

Приходилось ждать несколько секунд после выполнения команд. Инструментальный тест с мультидексированием проходит гладко после этого.

20.10.2015
  • Спасибо за это - работает здесь отлично. Надеюсь, Google скоро это исправит. 03.12.2015

  • 2

    Для плагина Gradle 1.5.0 вы можете использовать этот обходной путь в своем build.gradle:

    // Workaround for Multidex bug in gradle-android-plugin
    // Replace Multidex dependency with some dummy dependency to avoid dex problems
    // @see https://code.google.com/p/android/issues/detail?id=194609
    project.getConfigurations().all { config ->
        if (config.name.contains("AndroidTest")) {
            config.resolutionStrategy.eachDependency { DependencyResolveDetails details ->
                if (details.requested.name == "multidex") {
                    details.useTarget("de.felixschulze.teamcity:teamcity-status-message-helper:1.2")
                }
            }
        }
    }
    
    03.12.2015
  • Для меня это все еще не работает, этот код входит в build.gradle моего собственного проекта? 11.12.2015
  • Да, просто добавьте его в свой build.gradle, и он должен работать. возможно, у вас также есть другая проблема с зависимостью. 13.12.2015

  • 3

    Если вы используете плагин Gradle выше 1.4.0-beta3. В плагин Gradle была добавлена ​​поддержка Multi-Dex, что означает, что зависимости multidex и multidex-instrumentation уже включены, и вам не нужно указывать их явно. К сожалению, на устройствах, предшествующих Lollipop, он содержит ошибки, похоже, что для целевого и тестового приложения используются разные версии MultiDexApplication. В результате Instrumentation не запускается, и logcat выдает что-то похожее на это:

    W/dalvikvm: Class resolved by unexpected DEX: Lcom/example/dexproof/App;(0x43893f90):0x64d46000 ref [Landroid/support/multidex/MultiDexApplication;] Landroid/support/multidex/MultiDexApplication;(0x43893f90):0x5de01000
    W/dalvikvm: (Lcom/example/dexproof/App; had used a different Landroid/support/multidex/MultiDexApplication; during pre-verification)
    W/dalvikvm: Unable to resolve superclass of Lcom/example/dexproof/App; (457)
    W/dalvikvm: Link of class 'Lcom/example/dexproof/App;' failed
    E/AndroidRuntime: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
    

    Решением было бы использовать плагин 1.3.1 gradle и быть осторожным, чтобы явно указать зависимости multidex и multidex-instrumentation (на случай, если вам это тоже нужно) той же версии. Вы также, вероятно, захотите использовать AndroidJUnitRunner, так как он имеет встроенную поддержку multi-dex.

    Не стесняйтесь отметить связанную проблему звездочкой: https://code.google.com/p/android/issues/detail?id=194609

    19.11.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..