Search code examples
androidproguard

Trying to run tests with proguard on


I'm trying to run unit tests on an apk that has proguard enabled.

Here is my build.gradle:

  buildTypes {

        debug {
            debuggable true
            minifyEnabled true
            ext.alwaysUpdateBuildId = false

            testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-test-rules.pro'
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }

...
}

and my proguard-test-rules.pro

# Proguard rules that are applied to your test apk/code.
-ignorewarnings

-keepattributes *Annotation*

-dontnote junit.framework.**
-dontnote junit.runner.**

-keep androidx.test.**
-keep org.junit.**
-keep org.hamcrest.**
-keep com.nhaarman.mockitokotlin2.**
-keep androidx.arch.core.**
-keep com.android.support.test.uiautomator.**
-dontwarn androidx.test.**
-dontwarn android.test.**
-dontwarn org.junit.**
-dontwarn org.hamcrest.**
-dontwarn com.squareup.javawriter.JavaWriter
# Uncomment this if you use Mockito
-dontwarn org.mockito.**

-kepp com.google.truth.**

-keep class com.fireblocks.**
-keep @org.junit.runner.RunWith public class *

-keep class androidx.test.internal.runner.listener.InstrumentationRunListener
-dontwarn org.junit.runner.**
-keep class org.junit.runner.notification.RunListener

My tests fail to start for the following exception:

    java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/test/internal/runner/listener/InstrumentationRunListener;
    at java.lang.Class.newInstance(Native Method)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6391)
    at android.app.ActivityThread.access$1300(ActivityThread.java:219)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
 Caused by: java.lang.ClassNotFoundException: androidx.test.internal.runner.listener.InstrumentationRunListener
    at java.lang.VMClassLoader.findLoadedClass(Native Method)
    at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at java.lang.Class.newInstance(Native Method) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6391) 
    at android.app.ActivityThread.access$1300(ActivityThread.java:219) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
 Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/junit/runner/notification/RunListener;
    at java.lang.Class.newInstance(Native Method) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6391) 
    at android.app.ActivityThread.access$1300(ActivityThread.java:219) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
 Caused by: java.lang.ClassNotFoundException: Didn't find class "org.junit.runner.notification.RunListener" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/com.client.test-XpSnSNlzNnJvG9ggqH7a8Q==/base.apk", zip file "/data/app/com.fireblocks.client-bEwzAM7c2o8Q2TpJG3XUVw==/base.apk"],nativeLibraryDirectories=[/data/app/com.fireblocks.client.test-XpSnSNlzNnJvG9ggqH7a8Q==/lib/x86_64, /data/app/com.fireblocks.client-bEwzAM7c2o8Q2TpJG3XUVw==/lib/x86_64, /data/app/com.fireblocks.client.test-XpSnSNlzNnJvG9ggqH7a8Q==/base.apk!/lib/x86_64, /data/app/com.fireblocks.client-bEwzAM7c2o8Q2TpJG3XUVw==/base.apk!/lib/x86_64, /system/lib64, /system/product/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at java.lang.Class.newInstance(Native Method) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6391) 
    at android.app.ActivityThread.access$1300(ActivityThread.java:219) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

How do I fix it?


Solution

  • It seems that testProguardFiles are completely ignored. I had to move some of the rules into the normal proguard file to be able to keep the code that runs the test frameworks. Not optimal, but for now it will do.