2012-06-13 57 views
0

我有簡單的POJO,每個屬性都有getter和setter。除了那些名爲id和serialNumber之外,所有的都被模糊處理。Proguard沒有模糊方法getId()和getSerialNumber()

id屬性沒有被重命名,也沒有它的getter和setter。

serialNumber屬性不會重命名,但它的getter和setter不會。

這些屬性沒有什麼特別之處,也沒有在我的Proguard配置中放置任何東西來使Proguard以不同的方式對待它們。

我Proguard的配置

# Fudge around some issues 
-dontskipnonpubliclibraryclasses 

# Preserve all annotations. 
-keepattributes *Annotation* 

# Preserve all native method names and the names of their classes. 
-keepclasseswithmembernames class * { 
    native <methods>; 
} 

# Preserve the special static methods that are required in all enumeration 
# classes. 
-keepclassmembers class * extends java.lang.Enum { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

# Explicitly preserve all serialization members. The Serializable interface 
# is only a marker interface, so it wouldn't save them. 
# You can comment this out if your application doesn't use serialization. 
# If your code contains serializable classes that have to be backward 
# compatible, please refer to the manual. 
-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    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(); 
} 

# Keep some source file attributes so we have a chance of decoding stack traces 
-renamesourcefileattribute SourceFile 
-keepattributes Exceptions,InnerClasses,Signature,Deprecated, 
     SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

# make sure we keep info for downstream libraries 
-dontshrink 
-dontoptimize 
-useuniqueclassmembernames 

,並從地圖文件的輸出

java.lang.String id -> id 
    int productCode -> a 
    int platform -> b 
    java.lang.String model -> c 
    java.lang.String serialNumber -> d 
    java.lang.String machineID -> e 
    java.lang.String parentSerialNumber -> f 
    long clientTime -> g 
    38:38:java.lang.String getId() -> getId 
    47:48:void setId(java.lang.String) -> setId 
    52:52:int getProductCode() -> a 
    57:58:void setProductCode(int) -> a 
    62:62:int getPlatform() -> b 
    67:68:void setPlatform(int) -> b 
    72:72:java.lang.String getModel() -> c 
    77:78:void setModel(java.lang.String) -> a 
    82:82:java.lang.String getSerialNumber() -> getSerialNumber 
    87:88:void setSerialNumber(java.lang.String) -> setSerialNumber 
    92:92:java.lang.String getMachineID() -> d 
    97:98:void setMachineID(java.lang.String) -> b 
    102:102:java.lang.String getParentSerialNumber() -> e 
    107:108:void setParentSerialNumber(java.lang.String) -> c 
    112:112:long getClientTime() -> f 
    117:118:void setClientTime(long) -> a 

回答

3

這是由於使用了-useuniqueclassmembernames選項。

如果類成員名稱必須符合全球其中包括Java運行時庫),此選項鍊接所有集體成員中的所有類在一起。

這意味着,如果有任何方法Foo#getName()被混淆到a()在一類,其他類,但具有相同名稱的Bar#getName()也將被映射到模糊的名稱a()方法:

Foo.getName() -> Foo.a() 
Bar.getName() -> Bar.a() 

現在就來圖書館開始發揮作用。由於ProGuard的看起來也到圖書館罐子,瞭解引用,它會掃描rt.jar類和會發現類,如:

  • COM /陽光/ servicetag/SystemEnvironment
  • 的Java /安全/證書/ X509CertSelector

這些類也有方法的方法:

  • com.sun.servicetag.SystemEnvironment.getSerialNumber()
  • java.security.cert.X509CertSelector.getSerialNumber()

這些部件被忽略混淆,但它們的名稱映射(getSerialNumber >getSerialNumber)由ProGuard記錄並由於useUniqueClassMemberNames配置選項而保存在描述符映射中。

僅供參考:我通過用您的配置文件調試ProGuard發現了這一點。對於成員信息鏈接器,使用AllMemberVisitor而不是BottomClassFilter,似乎是這種情況,但對於ProGuard的內部工作如何確定,我還沒有這麼深入的理解。

2

選項-useuniqueclassmembernames可以做到這一點,以便爲您的代碼中的變更提供面向未來的混淆映射。未來的代碼可能會爲這個類和一些包含這些方法的庫類添加一個通用接口。如果方法被重命名,這會破壞映射。

相關問題