Gradle игнорирует testProguardFile при запуске инструментария Android - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь запустить инструментальные тесты для выпуска типа сборки. Моя установка выглядит следующим образом:

Android Studio - 3.4.1
Android Gradle Plugin - 3.4.1
Gragle - 5.4.1
R8 - Enabled (default)

Соответствующий build.gradle фрагмент:

    testBuildType "release"

    buildTypes {
        release {
            proguardFiles fileTree(dir: 'vendor', include: ['*.pro']).asList().toArray()
            debuggable true
            minifyEnabled true
            shrinkResources true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            testProguardFile 'proguard-rules-test.pro'
            testCoverageEnabled false
        }
    }

Содержание proguard-rules-test.pro (для тестовых целей):

-keep public class ** { *; }

Запуск любого инструментария приводит к следующему исключению времени выполнения:

com.MYAPP.debug E/InstrumentationResultPrinter: Failed to mark test No Tests as finished after process crash
com.MYAPP.debug E/MonitoringInstr: Exception encountered by: Thread[main,5,main]. Dumping thread state to outputs and pining for the fjords.
    java.lang.NoSuchMethodError: No virtual method setAppComponent(L/com/MYAPP/injection/AppComponent;)V in class L/com/MYAPP/data/common/MyApplication$Companion; or its super classes (declaration of 'com.MYAPP.data.common.MyApplication$Companion' appears in /data/app/com.MYAPP.debug-o3QrzyIOGC0Ko3XRS2fcxQ==/base.apk)
        at com.MYAPP.base.TestMyApplication.h(TestMyApplication.kt:20)
        at com.MYAPP.data.common.MyApplication.onCreate(MyApplication.kt:126)

( TestMyApplication расширяет MyApplication и вызывается AndroidJUnitRunner )

Перемещение строки -keep из proguard-rules-test.pro в основной файл правил Proguard позволяет запускать и проходить тесты без проблем.

Есть идеи?

1 Ответ

0 голосов
/ 06 июня 2019

Это может быть не очевидно из ответа sgjesse, но это происходит в двух разных местах.Задачи для запуска инструментальных тестов на минимизированном вводе примерно таковы:

...

  1. задача compileDebugWithJavaC задача

  2. compileClassesAndResourcesWithR8ForDebug

  3. compileDebugTestWithJavaC

  4. задача compileClassesAndResourcesWithR8ForDebugTest

в задачах и выше, 1. в задачах и выше2. компилирует ваше приложение и оптимизирует его с R8, 3. и 4. компилирует ваши тесты и компилирует тесты с R8, имея оригинальное приложение по пути к библиотеке

proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.txt' применяется к 2. когда вы компилируете свое приложение с R8

testProguardFile 'proguard-rules-test.pro' применяется к тестам, когда вы компилируете тесты с R8.По этой причине добавление правил хранения в «нормальные» файлы proguard работает, потому что вы добавляете их позднее.

Если вы хотите, чтобы правила применялись к основному приложению при запуске отладки, просто добавьтеотладить конфигурацию и добавить туда еще один файл:

buildTypes{
  debug {
   ..
   proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt', 'proguard-rules-test.pro'
  }

Во всех случаях я не понимаю, почему вы «тестируете» свое минифицированное приложение, если добавляете -keep public class ** {*;}.Это в основном не позволит R8 выполнять какие-либо оптимизации, так что вы также можете тестировать без minifyEnabled.В идеале вы должны найти точки входа в свои тесты в своем приложении и только добавить их.Это, конечно, не так просто с созданными сопутствующими классами в kotlin.

...