Ngăn chặn sự xáo trộn tên thành viên trong lớp bằng ProGuard


78

Tôi có lớp của mình ClassMultiPointvới các lớp con.

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;
       }
    }
 }

Tôi sẽ lấy giá trị của đối tượng oPointstừ phân tích cú pháp GSON:

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

Tôi thử sử dụng oPoints.message.

Khi tôi chạy ứng dụng của mình mà không proguardchạy ứng dụng thành công. Khi tôi chạy ứng dụng với lỗi proguardứng dụng của tôi.

Tôi nghĩ vấn đề là: proguardđổi tên thuộc tính 'oPoints.message'của lớp tôi thành ngắn 'a'.

Tôi cố gắng giữ cho tên của các phương thức và thuộc tính không đổi, nhưng proguardđổi tên của nó:

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>;
}

Cách đúng đắn để giữ tên của các phương thức và thuộc tính của lớp my one (static) là gì?

Câu trả lời:


69

Nếu bạn không muốn các thành viên trong lớp của mình bị xáo trộn, hãy sử dụng SerializedNamechú thích do Gson cung cấp. Ví dụ:

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

   ...

}

Hơn nữa, hãy đảm bảo rằng bạn cũng thêm cấu hình proguard phù hợp cho thư viện Gson. Ví dụ:

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

Để biết thêm đọc này .


1
-keep lớp com.google.gson.examples.android.model. ** {*; } nó hoạt động với tôi nhưng khi tôi áp dụng công cụ ngược trên apk, tôi nhận được tất cả các lớp mô hình mà không thay đổi thành viên, nó phá vỡ mục đích bảo mật, không có tùy chọn nào khác, chúng tôi có thể làm xáo trộn mô hình không?
umesh,

7
bạn có đang sử dụng @SerializedNamechú thích trên đầu các thành viên trong lớp của bạn không? bởi vì nếu bạn làm vậy thì bạn không cần phải bỏ qua sự xáo trộn lớp tùy chỉnh trong cấu hình proguard như bạn đang làm với com.google.gson.examples.android.model.** { *; }.
waqaslam

không, thực sự tôi muốn làm xáo trộn nó. nhưng bây giờ tôi nhận ra rằng nếu tên các trường thay đổi, thì chúng sẽ không khớp với khóa json, vì vậy gson không thể phân tích cú pháp nó.
umesh

3
chính xác ... và đó là lý do chúng ta cần phải sử dụng @SerializedName
waqaslam

Tùy chọn này có sẵn cho cả lớp không?
Oliver Dixon

28

Cảm ơn Waqas!

Tôi tìm thấy giải pháp cho trường hợp của mình:

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

Ngoài ra, tôi không sử dụng @SerializedName("message")trong lớp của mình, cấu hình trên máy hoạt động tốt mà không cần tuần tự hóa.


@iDroid Explorer tôi sử dụng apkTool để kiểm tra các gói ứng dụng phát hành nhưng obfuscation không làm việc đối với tôi nó không đổi tên các lớp
Muhammad Younas

1
Cài đặt này cho phép KHÔNG làm xáo trộn mã. Bạn có cần mã obfuscate không?
Tapa Save

vâng mã này là không che đậy hay tôi đang thử nghiệm gói ứng dụng phát hành sai
Muhammad Younas

25

Tôi cũng thấy mình cần phải làm như vậy -keepclassmemberskhi sử dụng tùy chọn tối ưu hóa của Dexguard. Nếu không có điều này, một số đối tượng mô hình của tôi không thể giảm độ cao

##---------------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
cảm ơn đặc biệt cho -keepclassmembers class com.myapp.model.** { *; }. mặc dù tôi đang sử dụng jackson lib hơn là gson, dòng đó đã giúp tôi! Cảm ơn.
Mirjalal

9

Nếu bạn sử dụng @Exposechú thích như tôi, bạn có thể yêu cầu ProGuard giữ bất kỳ trường nào được chú thích với nó:

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

Theo GSON javadoc @Expose chỉ có thể nhắm mục tiêu các trường. Vì vậy, hướng dẫn thứ hai có vẻ vô ích
Anton Kazakov


5

Để loại trừ lớp của bạn khỏi sự xáo trộn, hãy Giữ các thuộc tính của Lớp bên trong, giữ lớp của bạn và giữ các thành viên lớp của lớp, ví dụ.

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

Để biết thêm thông tin, http://proguard.sourceforge.net/manual/examples.html



1

Bạn có thể bỏ qua sự xáo trộn trong tất cả các lớp Loại yêu cầu

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

proguard-rules.pro

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

GL


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.