we have the problem with correct deobfuscation on Crashlytics but we suspect that it could be the issue of correct translation of stacktraces from Model class with our mapping file by Proguard.
We prepared small application with MainActivity :
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
somemethod();
}
private void somemethod() {
Model1 model1 = new Model1();
model1.getModelButReturnNull().something();
}
}
and Model1 class:
public class Model1 {
int sum = 0;
public Model1 getModelButReturnNull() {
System.out.println("getModelButReturnNull");
return null;
}
public void something() {
for (int i = 0; i < 100; i++) {
sum = sum + i;
}
}
}
The problem is that when we try to deobfuscate stacktrace from release version on Crashlytics or using ReTrace from proguard we get
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{deobfuscation.test.crashlytics/deobfuscation.test.crashlytics.MainActivity}: java.lang.NullPointerException: Attempt to read from field 'int deobfuscation.test.crashlytics.c.a' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2951)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by java.lang.NullPointerException: Attempt to read from field 'int deobfuscation.test.crashlytics.c.a' on a null object reference
at deobfuscation.test.crashlytics.MainActivity.deobfuscation.test.crashlytics.Model1.something(MainActivity.java:2013)
at android.app.Activity.performCreate(Activity.java:7144)
at android.app.Activity.performCreate(Activity.java:7135)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
our proguard-rules.pro:
-keep class com.crashlytics.** { *; }
-keep class com.crashlytics.android.**
-keepattributes *Annotation*
-keepattributes SourceFile, LineNumberTable
-keep public class * extends java.lang.Exception
-dontwarn android.support.v7.**
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
here is the link to the complete project: https://ufile.io/99o9c
As we can see in mapping file, the retrace/Crashlytics should deobfuscate the line: deobfuscation.test.crashlytics.c
deobfuscation.test.crashlytics.Model1 -> deobfuscation.test.crashlytics.c:
int sum -> a
but we see:
Caused by java.lang.NullPointerException: Attempt to read from field 'int deobfuscation.test.crashlytics.c.a' on a null object reference