Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Uncaught translation SimException: dx.rop.cst.CstInterfaceMethodRef cannot be cast to com.android.dx.rop.cst.CstMethodRef (Proguard)

my team and I have been trying to solve this exception we are getting when trying to Proguard our android app before going to beta.

The exception we are getting is:

Error:Uncaught translation error: com.android.dx.cf.code.SimException: com.android.dx.rop.cst.CstInterfaceMethodRef cannot be cast to com.android.dx.rop.cst.CstMethodRef
Possible causes for this unexpected error include:<ul><li>Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
<a href="syncProject">Re-download dependencies and sync project (requires network)</a></li><li>The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
<a href="stopGradleDaemons">Stop Gradle build processes (requires restart)</a></li><li>Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.</li></ul>In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

We are trying to track down where this error is occurring during Proguarding but not being extremely familiar with Proguard to know how to find where the failures are occurring.

Is there any way to see where this translation error is occurring? If I knew what/where the cast exception was in my code perhaps I could fix it. There are references online stating Google Play Services could cause problems in other sdks but we have already used the dependency tool and found that it is properly linking to 8.4.0 in all sdks.

Our app is also using multiDexEnabled true flag.

Here is our proguard file:

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /development/adt-bundle-mac/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# (1)Annotations and signatures
-keepattributes *Annotation*,EnclosingMethod,Signature,InnerClasses

-keepnames class com.fasterxml.jackson.** { *; }

# (2)Simple XML
-keep public class org.simpleframework.**{ *; }
-keepclasseswithmembernames class javax.xml.stream.** { *; }
### Simple XML SERIALIZER SETTINGS
-keepclassmembers,allowobfuscation class * {
    @org.simpleframework.xml.* <fields>;
    @org.simpleframework.xml.* <init>(...);
}
-keep class javax.xml.stream.**{ *; }
-keep class org.simpleframework.xml.**{ *; }

# Ignore warnings: We are not using DOM model
#-dontwarn com.fasterxml.jackson.databind.ext.DOMSerializer
-dontwarn com.fasterxml.jackson.databind.ext.*
-dontwarn org.apache.http.**

# Keep the pojos used by GSON or Jackson
-keep class com.futurice.project.models.pojo.** { *; }

# Keep Jackson stuff
-dontwarn org.codehaus.**
-dontwarn com.bea.xml.stream.**
-dontwarn com.google.android.gms.*
-dontwarn javax.xml.stream.*
-dontwarn javax.annotation.**
-dontwarn sun.misc.Unsafe
-dontwarn com.google.j2objc.annotations.Weak
-dontwarn java.lang.ClassValue
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn okio.*
-dontwarn org.apache.**
-dontwarn org.simpleframework.xml.stream.*
-dontwarn rx.internal.util.unsafe.*

# Keep leakcanary stuff
-dontwarn com.squareup.haha.**
-dontwarn com.squareup.leakcanary.**

# Marshmallow removed Notification.setLatestEventInfo()
-dontwarn android.app.Notification

# warnings
-dontwarn butterknife.internal.*
-dontwarn com.conviva.streamerProxies.*
-dontwarn com.anvato.**
-dontwarn com.apptentive.android.sdk.**
-dontwarn com.comscore.instrumentation.**
-dontwarn com.squareup.okhttp.**
-dontwarn com.urbanairship.json.**
-dontwarn tv.freewheel.renderers.html.*

# notes
-dontnote com.android.vending.**
-dontnote com.anvato.**
-dontnote com.conviva.**
-dontnote com.facebook.stetho.inspector.**
-dontnote com.google.android.gms.**
-dontnote com.google.gson.internal.**
-dontnote com.google.vending.**
-dontnote com.squareup.okhttp.**
-dontnote com.urbanairship.**
-dontnote tv.freewheel.extension.medialets.**
-dontnote org.apache.**
-dontnote org.json.**

#Note: duplicate definition of library class
-dontnote android.net.http.**


# For RxJava:
-dontwarn org.mockito.**
-dontwarn org.junit.**
-dontwarn org.robolectric.**
-dontwarn rx.md.internal.schedulers.NewThreadWorker

#-ignorewarnings

-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
#-keep public class * extends android.content.ContentProvider
#-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
##-keep public class com.android.vending.licensing.ILicensingService
#-keep public class com.fasterxml.jackson.databind.ObjectMapper

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

#-keepclasseswithmembernames class * {
#   public onStart();
#}

-keep public class com.fasterxml.jackson.** {
  public void set*(***);
  public *** get*();
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
    public void set*(***);
    public *** get*();
}

-keep class * {
    public void *(android.view.View);
}

If there is any more information you need please let me know and I will be happy to provide, this is currently blocking our ability to publish a beta.

like image 357
HexBlit Avatar asked May 05 '16 14:05

HexBlit


1 Answers

So for us, it seems the solution is to remove:

-keep class * {
    public void *(android.view.View);
}

from Proguard, as there must be some conflict when using this with various libraries. I hope this helps others that run into this problem as we were stuck for 6 days on this.

It should be noted that you should then explicitly add your references to click handlers or atleast narrow it down, see origin of this rule here: Android Proguard - how to keep onClick handlers only referenced from XML layouts

like image 126
HexBlit Avatar answered Oct 04 '22 03:10

HexBlit