java 如何告诉 ProGuard 混淆方法和类名?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17040220/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to tell ProGuard to obfuscate method and class names?
提问by Adrian Adamczyk
I'm using ProGuard to obfuscate my apk, but there's no changes in class and method names - they are same as before. Only variable names are changed.
我正在使用 ProGuard 来混淆我的 apk,但类和方法名称没有变化 - 它们与以前相同。仅更改变量名称。
Most of them doesn't extends classes like Activity; there's some inheritance in my code, but it's 100% written by myself.
它们中的大多数都没有像 Activity 那样扩展类;我的代码中有一些继承,但它是 100% 由我自己编写的。
I'm using d2j-dex2jar and jd-gui to check results.
我正在使用 d2j-dex2jar 和 jd-gui 来检查结果。
Some of classes are excluded because of GSON usage, here is my proguard-project.txt:
由于 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 ----------
采纳答案by Pankaj Kumar
If you have this problem with Components (Activity, Services or BroadcastReceivers) classes then this is OK.
如果组件(Activity、Services 或 BroadcastReceivers)类有这个问题,那么这没问题。
Proguard doesn't obfuscate the names of Components.
Proguard 不会混淆组件的名称。
And if you are taking about the classes which defined as
如果你正在考虑定义为的类
-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
ALSO their name can not be changed, because of keep
option.
由于keep
选项的原因,他们的名字也不能更改。
Make a try with removing -keep public class * { public protected *; }
line
尝试删除-keep public class * { public protected *; }
线
回答by Nilesh Rathore
Some time class name obfuscation don't work cause of "butterknife" So add below rules in your proguard file.
有时类名称混淆不起作用,原因是“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>;
}
NOTE: Use above rules only when you are using "butterknife".
注意:仅当您使用“黄油刀”时才使用上述规则。
回答by Ankush Chugh
Butterknife's old instructions defined code for proguard causes this issue, if you are using butterknife and an older version like version 7, make sure you don't have this line in your proguared rules
Butterknife 的旧指令为 proguard 定义的代码会导致此问题,如果您使用的是 Butterknife 和旧版本(如版本 7),请确保您的 proguared 规则中没有此行
-keepnames class * { @butterknife.Bind *;}
This is causing all class names not be to obfuscated.
这导致所有类名都不会被混淆。
Use below config for butterknife, is better and future proof compare to another suggestion.
将下面的配置用于黄油刀,与另一个建议相比,它更好且面向未来。
# ButterKnife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}