简体   繁体   English

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

[英]How to tell ProGuard to obfuscate method and class names?

I'm using ProGuard to obfuscate my apk, but there's no changes in class and method names - they are same as before. 我正在使用ProGuard来模糊我的apk,但是类和方法名称没有变化 - 它们和以前一样。 Only variable names are changed. 只更改变量名称。

Most of them doesn't extends classes like Activity; 他们中的大多数都没有扩展像Activity这样的类; there's some inheritance in my code, but it's 100% written by myself. 我的代码中有一些继承,但它是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  ----------

If you have this problem with Components (Activity, Services or BroadcastReceivers) classes then this is OK. 如果组件(活动,服务或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 *; } 尝试删除-keep public class * { public protected *; } -keep public class * { public protected *; } line -keep public class * { public protected *; }线

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". 注意:仅在使用“butterknife”时才使用上述规则。

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,比另一个建议更好和未来证明。

# ButterKnife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM