2013-06-11 35 views
8

Tôi đang sử dụng ProGuard để làm xáo trộn gói ứng dụng của mình, nhưng không có thay đổi về tên lớp và phương thức - chúng giống như trước đây. Chỉ có tên biến được thay đổi.Làm cách nào để yêu cầu ProGuard làm xáo trộn phương thức và tên lớp?

Hầu hết trong số chúng không mở rộng các lớp như Hoạt động; có một số thừa kế trong mã của tôi, nhưng nó được viết bởi chính tôi.

Tôi đang sử dụng d2j-dex2jar và jd-gui để kiểm tra kết quả.

Một số lớp bị loại trừ vì sử dụng GSON, đây là tôi 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 ---------- 
+0

bạn đã bật proguard ở chế độ phát hành chưa ?. Ngoài ra bạn có thể trích xuất các tập tin từ apk và kiểm tra xem các tập tin java của bạn có bị làm mờ không – Raghunandan

+1

Tôi đoán là có, vì có các tên biến bị xáo trộn, vì vậy proguard đang chạy –

Trả lời

7

Nếu bạn có vấn đề này với các thành phần (Hoạt động, dịch vụ hoặc BroadcastReceivers) các lớp học thì đây là OK.

Proguard không làm xáo trộn tên của các thành phần.


Và nếu bạn đang dùng về các lớp học mà định nghĩa là

-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 

CŨNG tên của họ không thể thay đổi, vì keep tùy chọn.


Hãy thử với loại bỏ -keep public class * { public protected *; } dòng

+0

Có một Hoạt động cho AndEngine và hầu như tất cả. Phần còn lại của các lớp học là 100% tùy chỉnh. –

+0

@AdrianAdamczyk xem chỉnh sửa của tôi ... tôi có phải cho đến bây giờ không? –

+0

Những lớp này không thể bị làm xáo trộn vì serialization GSON, nhưng có rất nhiều lớp khác nên được làm xáo trộn và chúng không - những lớp có chứa phần logic của trò chơi –

2

Một thời gian tên lớp obfuscation không làm việc nguyên nhân của "butterknife" Vì vậy, thêm dưới đây quy định trong tập tin Proguard của bạn.

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

LƯU Ý: Chỉ sử dụng các quy tắc trên khi bạn đang sử dụng "butterknife".

hướng dẫn cũ
1

Butterknife của định nghĩa mã cho Proguard gây ra vấn đề này, nếu bạn đang sử dụng butterknife và một phiên bản cũ như phiên bản 7, chắc chắn rằng bạn không có dòng này trong các quy tắc proguared bạn

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

Đây là khiến tất cả các tên lớp không bị làm xáo trộn.

Sử dụng cấu hình bên dưới cho butterknife, bằng chứng tốt hơn và trong tương lai sẽ so sánh với đề xuất khác.

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

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

-keepclasseswithmembernames class * { 
    @butterknife.* <methods>; 
} 
Các vấn đề liên quan