在ProGuard中禁用攻击性重载



为了方便用户的stacktrace分析,我想在ProGuard混淆我的Android应用程序时禁用"攻击性重载"。在我混淆的APK中,我经常在同一个类中包含几个名为a()的方法/字段,这很难分析一个stacktrace,因为它不包括方法参数或行号。

根据ProGuard文档,使用选项-overloadaggressively强制此重载。问题是ProGuard在混淆我的应用程序时似乎使用了这个选项,即使我的ProGuard配置文件不包含这个选项:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-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
-keepclasseswithmembers class * {
    native <methods>;
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

如何禁用这种侵略性重载?

我的目标是Android 3.2/API level 13

选项-overloadaggressively只属于方法的返回类型

  • Java语言已经允许普通的重载,其中不同的方法可以有相同的名称,只要它们有不同的参数类型。
  • Java字节码还允许"侵略性"重载,其中不同的方法可以有相同的名称,只要它们有不同的参数/返回类型。
因此,即使是-useuniqueclassmembernames也不能保证名称的唯一性,因为名称可能被重载以开始。为了获得明确的堆栈跟踪,您应该保留行号:
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute ''

参见ProGuard手册> Examples>生成有用的堆栈跟踪

多亏了Marco Acierno,我发现使用选项-useuniqueclassmembernames而不是试图删除选项-overloadaggressively的工作(没有更激进的过载)。似乎选项-overloadaggressively不是为了执行此操作而设计的…很奇怪,但确实有效。

更多信息在这里:http://sourceforge.net/p/proguard/bugs/413/

相关内容

  • 没有找到相关文章

最新更新