Multidex on API 19 problem
Hi!
If project has multidex on API 19 or below we must call the following code before starting:
MultiDex.installInstrumentation(InstrumentationRegistry.getContext(), InstrumentationRegistry.getTargetContext()); otherwise it will fall with java.lang.NoClassDeffoundError: kotlin.jvm.internal.intrinsics. But we can get context only after android.app.Instrumentation#start finished.
The problem in 'AllureAndroidListener': when AndroidJUnitRunner creates instance in android.support.test.runner.AndroidJUnitRunner#parseRunnerArgs it (AllureAndroidListener) statically calls InstrumentationRegistry.getContext() in ru.tinkoff.allure.android.AllureAndroidLifecycleKt#obtainDirectory and it fall with the following exception:
java.lang.RuntimeException: Exception thrown in onCreate() of ComponentInfo{ru.app.test/uitesting.core.runner.UITestApplicationRunner}: java.lang.IllegalArgumentException: Failed to create: ru.tinkoff.allure.android.AllureAndroidListener
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4338)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Failed to create: ru.tinkoff.allure.android.AllureAndroidListener
at android.support.test.internal.runner.RunnerArgs$Builder.loadClassByNameInstantiateAndAdd(RunnerArgs.java:556)
at android.support.test.internal.runner.RunnerArgs$Builder.parseLoadAndInstantiateClasses(RunnerArgs.java:474)
at android.support.test.internal.runner.RunnerArgs$Builder.fromBundle(RunnerArgs.java:231)
at android.support.test.runner.AndroidJUnitRunner.parseRunnerArgs(AndroidJUnitRunner.java:321)
at android.support.test.runner.AndroidJUnitRunner.onCreate(AndroidJUnitRunner.java:263)
at uitesting.core.runner.UITestApplicationRunner.onCreate(UITestApplicationRunner.java:40)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4335)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.support.test.internal.runner.RunnerArgs$Builder.loadClassByNameInstantiateAndAdd(RunnerArgs.java:544)
at android.support.test.internal.runner.RunnerArgs$Builder.parseLoadAndInstantiateClasses(RunnerArgs.java:474)
at android.support.test.internal.runner.RunnerArgs$Builder.fromBundle(RunnerArgs.java:231)
at android.support.test.runner.AndroidJUnitRunner.parseRunnerArgs(AndroidJUnitRunner.java:321)
at android.support.test.runner.AndroidJUnitRunner.onCreate(AndroidJUnitRunner.java:263)
at uitesting.core.runner.UITestApplicationRunner.onCreate(UITestApplicationRunner.java:40)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4335)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ExceptionInInitializerError
at ru.tinkoff.allure.android.AllureAndroidListener.<init>(AllureAndroidListener.kt:16)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.support.test.internal.runner.RunnerArgs$Builder.loadClassByNameInstantiateAndAdd(RunnerArgs.java:544)
at android.support.test.internal.runner.RunnerArgs$Builder.parseLoadAndInstantiateClasses(RunnerArgs.java:474)
at android.support.test.internal.runner.RunnerArgs$Builder.fromBundle(RunnerArgs.java:231)
at android.support.test.runner.AndroidJUnitRunner.parseRunnerArgs(AndroidJUnitRunner.java:321)
at android.support.test.runner.AndroidJUnitRunner.onCreate(AndroidJUnitRunner.java:263)
at uitesting.core.runner.UITestApplicationRunner.onCreate(UITestApplicationRunner.java:40)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4335)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.
at android.support.test.InstrumentationRegistry.getInstrumentation(InstrumentationRegistry.java:45)
at ru.tinkoff.allure.android.AllureAndroidLifecycleKt.obtainDirectory(AllureAndroidLifecycle.kt:23)
at ru.tinkoff.allure.android.AllureAndroidLifecycle.<init>(AllureAndroidLifecycle.kt:16)
at ru.tinkoff.allure.android.AllureAndroidLifecycle.<clinit>(AllureAndroidLifecycle.kt:15)
at ru.tinkoff.allure.android.AllureAndroidListener.<init>(AllureAndroidListener.kt:16)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.support.test.internal.runner.RunnerArgs$Builder.loadClassByNameInstantiateAndAdd(RunnerArgs.java:544)
at android.support.test.internal.runner.RunnerArgs$Builder.parseLoadAndInstantiateClasses(RunnerArgs.java:474)
at android.support.test.internal.runner.RunnerArgs$Builder.fromBundle(RunnerArgs.java:231)
at android.support.test.runner.AndroidJUnitRunner.parseRunnerArgs(AndroidJUnitRunner.java:321)
at android.support.test.runner.AndroidJUnitRunner.onCreate(AndroidJUnitRunner.java:263)
at uitesting.core.runner.UITestApplicationRunner.onCreate(UITestApplicationRunner.java:40)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4335)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
04-24 1