Запобігти забрудненню імені члена класу за допомогою ProGuard


78

У мене є клас ClassMultiPointіз підкласами.

public class ClassMultiPoints
 {
   public String message;
   public List<ClassPoints> data;

   public class ClassPoints
    {
      public String id;
      public List<ClassPoint> points;
      public class ClassPoint
       {
         public String speed;
         public String bearing;
       }
    }
 }

Я отримаю значення об'єкта oPointsз синтаксичного аналізу GSON:

oPoints = gson.fromJson( jsonString, ClassMultiPoints.class);

Я намагаюся використовувати oPoints.message.

Коли я запускаю свою програму без proguardуспішного запуску програми. Коли я запускаю програму зі proguardзбоєм програми.

Я думаю, проблема полягає в тому: proguardперейменувати атрибут 'oPoints.message'мого класу в short 'a'.

Я намагаюся зберегти імена методів та атрибутів постійними, але proguardперейменую їх:

proguard.cfg:

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-dontskipnonpubliclibraryclasses
-optimizationpasses 5
-printmapping map.txt
-flattenpackagehierarchy

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.MapActivity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-libraryjars  libs/commons-io-2.2.jar
-libraryjars  libs/ftp4j-1.7.1.jar
-libraryjars  libs/gson-2.2.2.jar

-keep public class org.apache.commons.io.**
-keep public class it.sauronsoftware.ftp4j.**
-keep public class com.google.gson.**

-keep public class com.mypackagename.ActivityMonitor$*

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

Який правильний спосіб зберегти імена методів та атрибутів класу my one (static)?

Відповіді:


69

Якщо ви не хочете, щоб учасники вашого класу були заплутані, використовуйте SerializedNameанотацію, надану Gson. Наприклад:

public class ClassMultiPoints
{
   @SerializedName("message")
   public String message;
   @SerializedName("data")
   public List<ClassPoints> data;

   ...

}

Більше того, обов’язково додайте належну конфігурацію proguard для бібліотеки Gson. Наприклад:

##---------------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 ----------

Для отримання додаткової інформації прочитайте це .


1
-зберігати клас com.google.gson.examples.android.model. ** {*; } це працює для мене, але коли я застосував зворотний engg на apk, я отримав усі класи моделей без змін у членах, це порушує цілі безпеки, чи немає іншого варіанту, ми також можемо затушувати модель?
умеш,

7
ти використовуєш @SerializedNameанотацію поверх учнів? тому що якщо ви це зробите, то вам не потрібно обходити заплутування користувацького класу в конфігурації proguard, як це робите з com.google.gson.examples.android.model.** { *; }.
waqaslam

ні, насправді я хотів це затуманити. але тепер я зрозумів, що якщо імена полів змінюються, вони не збігатимуться з ключем json, тому gson не міг проаналізувати його.
умеш,

3
точно ... і тому нам потрібно використовувати @SerializedName
waqaslam

Чи доступна ця опція для всього класу?
Олівер Діксон,

28

Дякую Вака!

Я знаходжу рішення для свого випадку:

-optimizationpasses 5
-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging*/
-allowaccessmodification
-repackageclasses ''

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.MapActivity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-libraryjars  libs/commons-io-2.2.jar
-libraryjars  libs/gson-2.2.2.jar
-keep public class org.apache.commons.io.**
-keep public class com.google.gson.**
-keep public class com.google.gson.** {public private protected *;}

##---------------Begin: proguard configuration for Gson ----------
-keepattributes *Annotation*,Signature
-keep class com.mypackage.ActivityMonitor.ClassMultiPoints.** { *; }
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints     { public protected *; }
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints { public protected *; }
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints$ClassPoint { public protected *; }
# To support Enum type of class members
-keepclassmembers enum * { *; } 
##---------------End: proguard configuration for Gson ----------

Також я не використовую @SerializedName("message")у своєму класі, aboved config чудово працює без серіалізації.


@iDroid Explorer Я використовую apkTool для тестування випуску apk, але затухання у мене не спрацювало, це не перейменовувало класи
Мухаммад Юнас

1
Ці налаштування дозволяють НЕ заважати коду. Вам потрібен незрозумілий код?
Тапа Зберегти

так, цей код не заплутаний або я тестую неправильний реліз apk
Мухаммад Юнас

25

Я також виявив, що мені потрібно, -keepclassmembersколи використовую опцію оптимізації Dexguard. Без цього декілька об'єктів моєї моделі не змогли десериализоваться

##---------------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*

# Application classes that will be serialized/deserialized over Gson, keepclassmembers
-keep class com.myapp.model.** { *; }
-keepclassmembers class com.myapp.model.** { *; }

1
особлива подяка за -keepclassmembers class com.myapp.model.** { *; }. незважаючи на те, що я використовую jackson lib, а не gson, ця лінія мені допомогла! Дякую.
Mirjalal

9

Якщо ви використовуєте @Exposeанотацію, як я, ви можете сказати ProGuard, щоб будь-яке поле було анотоване ним:

# keep anything annotated with @Expose
-keepclassmembers public class * {
    @com.google.gson.annotations.Expose *;
}
# Also keep classes that @Expose everything
-keep @com.google.gson.annotations.Expose public class *

Відповідно до GSON javadoc @Expose може націлювати лише поля. Тож друга інструкція видається марною
Антон Казаков,


5

Щоб виключити ваш клас із заплутування, зберігайте атрибути InnerClasses, зберігайте свій клас і тримайте членів класу, наприклад.

-keepattributes InnerClasses
 -keep class com.yourproject.YourClass**
 -keepclassmembers class com.yourproject.YourClass** {
    *;
 }

Для отримання додаткової інформації http://proguard.sourceforge.net/manual/examples.html



1

Ви можете пропустити затухання у всіх класах типів запитів

open class Request
data class Example(val name: String) : Request()

proguard-rules.pro

-keepclassmembers class * extends <your-package-name>.util.ws.Request { *; }

GL


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.