I'm trying to integrate Crashlytics with my app and it's working, however the line number passed through seems to be incorrect. This is a stack I'm getting for my test exception:
Fatal Exception: java.lang.RuntimeException: This is a test crash
at com.myapp.testapp.activity.MainActivity.animateReveal(MainActivity.java:42453)
at com.myapp.testapp.activity.MainActivity.onClick(MainActivity.java:1356)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
So my crash is on line number 1453 but for some reason it's showing up as 42453? Interestingly, the next line number in the stack is correct...
Proguard:
# Crashlitics
-keepattributes SourceFile,LineNumberTable
-keep public class * extends java.lang.Exception
-keepattributes *Annotation*
To preserve the information that Firebase Crashlytics SDK requires for producing readable crash reports, add the following lines to your Proguard or Dexguard config file:
-keepattributes SourceFile,LineNumberTable # Keep file names and line numbers.
-keep public class * extends java.lang.Exception # Optional: Keep custom exceptions.
Likely it's because you're using a release build which will remove comments/ white spaces.
If you're using a debug build then it may show the correct lines, because it won't optimize your source code...
Still I'm guessing there is another reason for the line numbers to show incorrect, because Fabric was telling me the crash was happening at line 400, even though that function was called at line 300. I mean if comments and white spaces are to be removed, Fabric should have told line some line less than 300, not more!
In my case switching from 'proguard-android-optimize.txt' default proguard file to 'proguard-android.txt' fixed the issue. Using the optimized version of the proguard file can introduce certain risks and it seems that this is one of them.
Did you try this?
For Fabric to properly de-obfuscate your crash reports, you need to
remove this line from your configuration file, or we won’t be able to automatically upload your mapping file:
-printmapping mapping.txt
and
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
I had same issue, a simple observation solve my issue, see proguard-rule and uncomment these line
(-keepattributes SourceFile,LineNumberTable)
and
(-renamesourcefileattribute SourceFile)
Related
after enabling proguard,crash line number doesn show correctly
my hap has been published to google play and a user crash inside app,in my crash reporter,the crash line number is unknown and incorrect
java.lang.NullPointerException: null
at io.kuknos.messenger.fragments.NewWalletFragment$r$b.run(SourceFile:3)
at android.app.Activity.runOnUiThread(Activity.java:7154)
at io.kuknos.messenger.fragments.NewWalletFragment$r.a(SourceFile:5)
at z9.j$k0.a(SourceFile:10)
at z0.n.m(SourceFile:2)
at z0.e$b.run(SourceFile:5)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8653)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Add the following lines to your proguard configuration.
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Now your stack traces will include line numbers, and by using the retrace tool that ships with proguard (included in the Android SDK), you are able to debug like normal.
Note that even if you didn't use these two configuration options, retrace still can output useful information provided you have the mappings file, albeit not totally unambiguously.
Note: the file with the mappings is produced by the proguard configuration option:
-printmapping outputfile.txt
In the ant file shipped with the Android SDK, it is set to mapping.txt.
Good luck.
Facing notorious java.lang.VerifyError. Initially problem showed up in Fabric. Was able to reproduce (with identical stacktrace) once set minifyEnabled true for debug build.
Caused by java.lang.VerifyError: Verifier rejected class com.evernote.client.conn.mobile.TEvernoteHttpClient: void com.evernote.client.conn.mobile.TEvernoteHttpClient.cancel() failed to verify: void com.evernote.client.conn.mobile.TEvernoteHttpClient.cancel(): [0x6] 'this' argument 'Reference: org.apache.http.client.methods.HttpRequestBase' not instance of 'Reference: org.apache.http.client.methods.AbstractExecutionAwareRequest'
void com.evernote.client.conn.mobile.TEvernoteHttpClient.flush() failed to verify: void com.evernote.client.conn.mobile.TEvernoteHttpClient.flush(): [0x7F] 'this' argument 'Reference: org.apache.http.impl.client.DefaultHttpClient' not instance of 'Reference: org.apache.http.impl.client.CloseableHttpClient' (declaration of 'com.evernote.client.conn.mobile.TEvernoteHttpClient' appears in base.apk)
at com.evernote.client.android.ClientFactory.createNoteStoreClient + 85(ClientFactory.java:85)
I see that typically java.lang.VerifyError issues are recognized as related to difference between code to compile and run against.
This is not the case since code runs just fine when minification is disabled.
The way I see this can be helped is making another rule, but I am failing to understand which classes need to be kept from this error details.
We are already doing
-keep class com.evernote.** { *; }
-keep interface com.evernote.** { *; }
-keep class org.apache.http.** { *; }
-keep interface org.apache.http.** { *; }
... and those classes don't get modified in any way. I've checked it using -printusage ./full-r8-config.txt instruction and checking the output. Classes mentioned in error details do not show up there.
UPDATE 1 day later:
Really strange thing going on here.
So far I have a verified backup plan: switching back to proguard fixes issue.
But in case if I want to stay with R8, here comes:
using -dontshrink, -dontoptimize and -dontobfuscate (all three at once) does no impact;
forcing specific apache.http version dependency does no impact;
I've checked mapping: neither Evernore SDK, nor Apache http classes don't get obfuscated;
issue pertains when app executed on api22 device (emulator, actually);
I was able to debug code once I had -dontobfuscate set. All goes well until Evernote's ClientFactory#createUserStoreClient decides to instantiate TEvernoteHttpClient - the moment program execution touches latter class's constructor - exception thrown.
It looks like it is all good to go, but this verifier fails.
Later update:
Issue filed as a bug for R8: https://issuetracker.google.com/issues/139268389. Please feel free to star it if facing similar situation (all code is in place but VerifyError is thrown)
Try to write below proguard rules.
-dontwarn com.evernote.client.conn.mobile.TAndroidTransport
-dontwarn com.evernote.client.conn.mobile.DiskBackedByteStore
-dontwarn com.evernote.client.conn.mobile.ByteStore
-dontwarn org.apache.commons.codec.binary.Base64
when I add one line in proguard file its showing error Error:com.android.build.gradle.shrinker.parser.ProguardParserException: ProGuard configuration parser error: /root/projectDirectory/myprojectname/app/proguard-rules.pro line 42:0 missing EOF at '-keepclass'.
If I remove this file it shows Error :
Method code too large.
The project builds successful without proguard.
Any suggestion ??
Thanks.
This is because you're using an invalid rule with something like:
-keepclass com.example.activity {*;}
it should be
-keep class com.example.activity {*;}
I made a simple app with external .jar library.
And going to obfuscator work with ProGuard.
But stuck with errors even had proguard rules.
I don't even know "borken class file" meaning about....
Can anyone know about this problem? Thanks. (Setting options or config attached as bottom section)
# Messages at Android Studio
Error processing C:\Users\administator\Desktop\artest\app\src\main\libs\arsupport.jar:ac.class: broken class file?
Error processing C:\Users\administator\Desktop\artest\app\src\main\libs\arsupport.jar:am.class: broken class file?
...
...
More similar errors...
...
...
Error:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
> java.io.IOException: Can't read [C:\Users\administrator\Desktop\artest\app\src\main\libs\arsupport.jar(;;;;;;**/*.class)]
(Can't process class [com/arsec/Programsupport.class] (Unknown verification type [46] in stack map frame))
and ProGuard rules
# proguard-rules.pro
-keep class com.arsec.** { *; }
-keep interface com.arsec.** { *; }
-dontwarn com.arsec.**
I got the same issue in my project,some suggest to reset the value ATTR_StacjMapTable to "dummy" in ClassConstants.java .then repack the proguard.jar
But I solve the problem is get the latest ProGuard in [http://proguard.sourceforge.net the use the latest proguard to make jar. goodlucky
I am using crashlytics in my app. It caught a crash in the app, but not telling the line of code where crash occured. It is showing the verify error, but not telling where it is. This link is a screenshot to the report. It is showing ??? about the crash, see this link. How to study this crash now? ._.
Preserve annotations, line numbers, and source file names
-keepattributes *Annotation*,SourceFile,LineNumberTable
If you are using custom exceptions, add this line so that custom exception types are skipped during obfuscation:
-keep public class * extends java.lang.Exception
-printmapping mapping.txt
To skip running ProGuard on Crashlytics, add the following.
This will help speed up builds so that we can ship and test even faster.
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
More Info: Follow this link to Configure Crashlytics with Proguard.
https://docs.fabric.io/android/crashlytics/dex-and-proguard.html