android - 未捕获的翻译 SimException : dx. rop.cst.CstInterfaceMethodRef 无法转换为 com.android.dx.rop.cst.CstMethodRef (Proguard)

标签 android proguard

我的团队和我一直在努力解决我们在进入 Beta 版之前尝试混淆我们的 Android 应用程序时遇到的异常。

我们得到的异常是:

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.

我们正在尝试追踪在 Proguarding 期间发生此错误的位置,但不是非常熟悉 Proguard 以了解如何找到发生故障的位置。

有什么办法可以看出这个翻译错误发生在哪里?如果我知道强制转换异常在我的代码中是什么/在哪里,也许我可以修复它。网上有引用资料指出 Google Play 服务可能会导致其他 sdk 出现问题,但我们已经使用了依赖工具,发现它在所有 sdk 中都正确链接到 8.4.0。

我们的应用程序还使用了 multiDexEnabled true 标志。

这是我们的 proguard 文件:

# 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);
}

如果您需要任何更多信息,请告诉我,我很乐意提供,目前这阻碍了我们发布测试版的能力。

最佳答案

所以对我们来说,解决方案似乎是删除:

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

来自 Proguard,因为在将其与各种库一起使用时肯定存在一些冲突。我希望这能帮助其他遇到这个问题的人,因为我们在这个问题上被困了 6 天。

应该注意的是,您随后应该明确添加对点击处理程序的引用或至少缩小范围,请在此处查看此规则的来源:Android Proguard - how to keep onClick handlers only referenced from XML layouts

关于android - 未捕获的翻译 SimException : dx. rop.cst.CstInterfaceMethodRef 无法转换为 com.android.dx.rop.cst.CstMethodRef (Proguard),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37053305/

相关文章:

android - Proguard:使用变量指向sdk目录

android - 如何在android 2.3中使用proguard

android - 2019 年瞄准较旧的移动设备

java - 如何使用 ArrayList 中的字符串填充 ViewPager?

android - 未剥离的 native 库的指定路径不是目录 - generateCrashlyticsSymbolFileRelease

android - Android 库中的 Proguard

java - 关于 OpenJDK 11 和 OpenJFX 11(和 Proguard)的迁移问题

android - 如何编写android proguard规则?

android - 在 xml 中声明时自定义 View 不起作用

android - 测试Android类时如何使用 Intent ?