Search code examples
androidrx-javaproguardandroid-proguard

App Crashes when using a lib which uses RxJava on release only


I have used this library in my app the library itself uses RxJava and it works perfectly in Debug APK. It works even on Release when Proguard obfuscation is disabled. But it stops working when I enable Proguard once I select an Image!

Here is the log:

08-02 22:54:11.848: E/AndroidRuntime(17818): FATAL EXCEPTION: main 08-02 22:54:11.848: E/AndroidRuntime(17818): Process: com.domus.safariar.domus, PID: 17818 08-02 22:54:11.848: E/AndroidRuntime(17818): java.lang.InternalError 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.internal.util.unsafe.UnsafeAccess.addressOf(Unknown Source:14) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.internal.util.unsafe.SpscArrayQueueProducerFields.(Unknown Source:4) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.(Unknown Source:50) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.internal.operators.OperatorObserveOn.call(Unknown Source:22) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.internal.operators.OperatorObserveOn.call(Unknown Source:2) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.Observable$2.call(Unknown Source:8) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.Observable$2.call(Unknown Source:2) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.Observable.subscribe(Unknown Source:43) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.Observable.subscribe(Unknown Source:0) 08-02 22:54:11.848: E/AndroidRuntime(17818): at com.zfdang.multiple_images_selector.ImagesSelectorActivity.LoadFolderAndImages(Unknown Source:36) 08-02 22:54:11.848: E/AndroidRuntime(17818): at com.zfdang.multiple_images_selector.ImagesSelectorActivity.onRequestPermissionsResult(Unknown Source:48) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7429) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.app.Activity.dispatchActivityResult(Activity.java:7280) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.app.ActivityThread.deliverResults(ActivityThread.java:4264) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.app.ActivityThread.-wrap19(Unknown Source:0) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.os.Handler.dispatchMessage(Handler.java:106) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.os.Looper.loop(Looper.java:164) 08-02 22:54:11.848: E/AndroidRuntime(17818): at android.app.ActivityThread.main(ActivityThread.java:6494) 08-02 22:54:11.848: E/AndroidRuntime(17818): at java.lang.reflect.Method.invoke(Native Method) 08-02 22:54:11.848: E/AndroidRuntime(17818): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 08-02 22:54:11.848: E/AndroidRuntime(17818): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 08-02 22:54:11.848: E/AndroidRuntime(17818): Caused by: java.lang.NoSuchFieldException: No field producerIndex in class Lrx/internal/util/unsafe/SpscArrayQueueProducerFields; (declaration of 'rx.internal.util.unsafe.SpscArrayQueueProducerFields' appears in /data/app/com.domus.safariar.domus-P04AN9pLul9iY1dryJ3vXg==/base.apk!classes3.dex) 08-02 22:54:11.848: E/AndroidRuntime(17818): at java.lang.Class.getDeclaredField(Native Method) 08-02 22:54:11.848: E/AndroidRuntime(17818): at rx.internal.util.unsafe.UnsafeAccess.addressOf(Unknown Source:0) 08-02 22:54:11.848: E/AndroidRuntime(17818): ... 22 more 08-02 22:54:11.849: E/UncaughtException(17818): java.lang.InternalError 08-02 22:54:11.849: E/UncaughtException(17818): at rx.internal.util.unsafe.UnsafeAccess.addressOf(Unknown Source:14) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.internal.util.unsafe.SpscArrayQueueProducerFields.(Unknown Source:4) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.(Unknown Source:50) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.internal.operators.OperatorObserveOn.call(Unknown Source:22) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.internal.operators.OperatorObserveOn.call(Unknown Source:2) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.Observable$2.call(Unknown Source:8) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.Observable$2.call(Unknown Source:2) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.Observable.subscribe(Unknown Source:43) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.Observable.subscribe(Unknown Source:0) 08-02 22:54:11.849: E/UncaughtException(17818): at com.zfdang.multiple_images_selector.ImagesSelectorActivity.LoadFolderAndImages(Unknown Source:36) 08-02 22:54:11.849: E/UncaughtException(17818): at com.zfdang.multiple_images_selector.ImagesSelectorActivity.onRequestPermissionsResult(Unknown Source:48) 08-02 22:54:11.849: E/UncaughtException(17818): at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7429) 08-02 22:54:11.849: E/UncaughtException(17818): at android.app.Activity.dispatchActivityResult(Activity.java:7280) 08-02 22:54:11.849: E/UncaughtException(17818): at android.app.ActivityThread.deliverResults(ActivityThread.java:4264) 08-02 22:54:11.849: E/UncaughtException(17818): at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312) 08-02 22:54:11.849: E/UncaughtException(17818): at android.app.ActivityThread.-wrap19(Unknown Source:0) 08-02 22:54:11.849: E/UncaughtException(17818): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644) 08-02 22:54:11.849: E/UncaughtException(17818): at android.os.Handler.dispatchMessage(Handler.java:106) 08-02 22:54:11.849: E/UncaughtException(17818): at android.os.Looper.loop(Looper.java:164) 08-02 22:54:11.849: E/UncaughtException(17818): at android.app.ActivityThread.main(ActivityThread.java:6494) 08-02 22:54:11.849: E/UncaughtException(17818): at java.lang.reflect.Method.invoke(Native Method) 08-02 22:54:11.849: E/UncaughtException(17818): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 08-02 22:54:11.849: E/UncaughtException(17818): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 08-02 22:54:11.849: E/UncaughtException(17818): Caused by: java.lang.NoSuchFieldException: No field producerIndex in class Lrx/internal/util/unsafe/SpscArrayQueueProducerFields; (declaration of 'rx.internal.util.unsafe.SpscArrayQueueProducerFields' appears in /data/app/com.domus.safariar.domus-P04AN9pLul9iY1dryJ3vXg==/base.apk!classes3.dex) 08-02 22:54:11.849: E/UncaughtException(17818): at java.lang.Class.getDeclaredField(Native Method) 08-02 22:54:11.849: E/UncaughtException(17818): at rx.internal.util.unsafe.UnsafeAccess.addressOf(Unknown Source:0) 08-02 22:54:11.849: E/UncaughtException(17818): ... 22 more

I have tried to add some Proguard rules to avoid crashing but it does not work:

-keep class * {
    public private *;
}

-keep class com.facebook.** { *; }

-keep class rx.schedulers.Schedulers {
    public static <methods>;
}
-keep class rx.schedulers.ImmediateScheduler {
    public <methods>;
}
-keep class rx.schedulers.TestScheduler {
    public <methods>;
}
-keep class rx.schedulers.Schedulers {
    public static ** test();
}
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
    long producerIndex;
    long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    long producerNode;
    long consumerNode;
}
    -keep class com.zfdang.multiple_images_selector.ImagesSelectorActivity**{*;}
    -keep class com.zfdang.multiple_images_selector.ImagesSelectorActivity$**{*;}
    -dontwarn com.zfdang.multiple_images_selector.ImagesSelectorActivity**{*;}
    -keep com.zfdang.multiple_images_selector.ImagesSelectorActivity.LoadFolderAndImages**{*;}
    -dontwarn com.zfdang.multiple_images_selector.ImagesSelectorActivity.LoadFolderAndImages**{*;}
    -keep class rx.internal.operators.OperatorObserveOn**{*;}
    -dontwarn rx.internal.operators.OperatorObserveOn.**

Solution

  • -dontwarn sun.misc.** 
    
    -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
     long producerIndex; 
    long consumerIndex; 
    } 
    -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { rx.internal.util.atomic.LinkedQueueNode producerNode; 
    } 
    -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { rx.internal.util.atomic.LinkedQueueNode consumerNode; 
    } 
    -dontnote rx.internal.util.PlatformDependent 
    

    Please try to add missing lines to your proguard rule.