为了方便用户的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/