11 votes

Comment dire à ProGuard d'obfusquer les noms de méthodes et de classes ?

J'utilise ProGuard pour obfusquer mon apk, mais il n'y a aucun changement dans les noms de classe et de méthode - ils sont les mêmes qu'avant. Seuls les noms des variables sont modifiés.

La plupart d'entre eux n'étendent pas les classes comme Activity ; il y a un peu d'héritage dans mon code, mais il est écrit à 100% par moi-même.

J'utilise d2j-dex2jar et jd-gui pour vérifier les résultats.

Certaines classes sont exclues à cause de l'utilisation de GSON, voici mon 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  ----------

10voto

Pankaj Kumar Points 19620

Si vous rencontrez ce problème avec les classes de composants (Activity, Services ou BroadcastReceivers), tout va bien.

Proguard n'obfusque pas les noms des composants.


Et si vous prenez les classes qui ont été définies comme

-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

AUSSI leur nom ne peut pas être changé, en raison de keep option.


Faites un essai en enlevant -keep public class * { public protected *; } ligne

2voto

Nilesh Rathore Points 174

Parfois, l'obfuscation du nom de la classe ne fonctionne pas à cause du "butterknife". Donc ajoutez les règles suivantes dans votre fichier 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 : N'utilisez les règles ci-dessus que lorsque vous utilisez le "couteau à beurre".

1voto

Ankush Chugh Points 54

L'ancien code défini dans les instructions de Butterknife pour proguard cause ce problème. Si vous utilisez Butterknife et une ancienne version comme la version 7, assurez-vous que vous n'avez pas cette ligne dans vos règles proguard.

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

Cela fait en sorte que tous les noms de classe ne sont pas obfusqués.

Utilisez la configuration ci-dessous pour le couteau de poche, c'est mieux et plus durable qu'une autre suggestion.

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X