如何告诉ProGuard混淆方法和类名?

我正在使用ProGuard来混淆我的apk,但在类和方法名称上没有任何更改 – 它们与以前相同。 只有variables名称被改变。

他们大多不会像Activity一样扩展类; 在我的代码中有一些inheritance,但它是我自己写的100%。

我正在使用d2j-dex2jar和jd-gui来检查结果。

由于GSON的使用,一些类被排除在外,这里是我的proguard-project.txt:

-keep class com.google.ads.** # Don't proguard AdMob classes -dontwarn com.google.ads.** # Temporary workaround for v6.2.1. It gives a warning that you can ignore # Add any classes the interact with gson -keep class com.revicostudio.gravityrun.playerdata.PlayerData -keep class com.revicostudio.gravityrun.playerdata.SettingsDescriptor -keep class com.revicostudio.gravityrun.playerdata.ShipStatus -keep class com.revicostudio.gravityrun.descriptors.ShipDescriptor -keep class com.revicostudio.gravityrun.descriptors.Ships -keep class com.revicostudio.gravityrun.game.galaxies.Galaxies -keep public class com.badlogic.** {*;} ##---------------Begin: proguard configuration common for all Android apps ---------- -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -dontpreverify -verbose -dump class_files.txt -printseeds seeds.txt -printusage unused.txt -printmapping mapping.txt -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -allowaccessmodification -keepattributes *Annotation* -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable -repackageclasses '' -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 -dontnote com.android.vending.licensing.ILicensingService # Explicitly preserve all serialization members. The Serializable interface # is only a marker interface, so it wouldn't save them. -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # Preserve all native method names and the names of their classes. -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); } # Preserve static fields of inner classes of R classes that might be accessed # through introspection. -keepclassmembers class **.R$* { public static <fields>; } # Preserve the special static methods that are required in all enumeration classes. -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep public class * { public protected *; } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } ##---------------End: proguard configuration common for all Android apps ---------- ##---------------Begin: proguard configuration for Gson ---------- # Gson uses generic type information stored in a class file when working with fields. Proguard # removes such information by default, so configure it to keep all of it. -keepattributes Signature # For using GSON @Expose annotation -keepattributes *Annotation* # Gson specific classes -keep class sun.misc.Unsafe { *; } #-keep class com.google.gson.stream.** { *; } # Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model.** { *; } ##---------------End: proguard configuration for Gson ---------- 

Related of "如何告诉ProGuard混淆方法和类名?"

如果你有组件(活动,服务或BroadcastReceivers)类的这个问题,那么这是好的。

Proguard不会混淆组件的名称。


如果你正在考虑定义为的类

 -keep class com.revicostudio.gravityrun.playerdata.PlayerData -keep class com.revicostudio.gravityrun.playerdata.SettingsDescriptor -keep class com.revicostudio.gravityrun.playerdata.ShipStatus -keep class com.revicostudio.gravityrun.descriptors.ShipDescriptor -keep class com.revicostudio.gravityrun.descriptors.Ships -keep class com.revicostudio.gravityrun.game.galaxies.Galaxies 

另外,由于keep选项,他们的名字不能改变。


尝试删除-keep public class * { public protected *; } -keep public class * { public protected *; }

有些时候class name obfuscation不工作“butterknife”的原因所以在你的proguard文件中添加下面的规则。

 # Butterknife -dontwarn butterknife.internal.** -keep class butterknife.** { *; } -keep class **$$ViewInjector { *; } -keepclasseswithmembernames class * { @butterknife.InjectView <fields>; } -keepclasseswithmembernames class * { @butterknife.OnClick <methods>; @butterknife.OnEditorAction <methods>; @butterknife.OnItemClick <methods>; @butterknife.OnItemLongClick <methods>; @butterknife.OnLongClick <methods>; } 

注意:只有在使用“butterknife”时才使用上述规则。

Butterknife的旧指令为proguard定义了代码导致了这个问题,如果你正在使用butterknife和像版本7这样的旧版本,确保你的程序没有这条线

 -keepnames class * { @butterknife.Bind *;} 

这导致所有类名不被混淆。

使用下面的configuration为刀,比另一个build议更好和将来的certificate。

 # ButterKnife -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; }