Почему ProGuard не запутывает внутренние классы / перечисления - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь запутать некоторые классы, которые содержат ряд внутренних перечислений, которые, как я понимаю, скомпилированы для разделения отдельных классов с разделителем "$" с помощью javac во время компиляции.

Однако проблема, с которой я сталкиваюсь, заключается в том, что, хотя содержимое перечислений запутано, родительский / внешний класс, а также сами имена классов перечислений и их имена пакетов не запутываются, поскольку сами классы не быть запутанным.

Мы указали ProGuard для хранения различных других классов в наших проприетарных пакетах (которые обрабатываются правильно), но они не должны влиять на вышеупомянутые классы.

Вот наш config.pro файл:

-injars .\build\libs\plugin.jar
-outjars .\build\libs\plugin_obfuscated.jar

-libraryjars .\jre\lib\rt.jar
-libraryjars .\jre\lib\jce.jar
-libraryjars .\jre\lib\ext\jfxrt.jar

## Mapping
-classobfuscationdictionary .\config_classnames.pro
-packageobfuscationdictionary .\config_packagenames.pro

-printmapping .\build\libs\proguard_obfuscation_map.txt
-printseeds .\build\libs\proguard_seeds_map.txt
-printusage .\build\libs\proguard_deadusage_map.txt

## Shrinking
-dontshrink

## Optimizations
#-dontoptimize
-optimizations method/removal/parameter,method/inlining/short,
  method/inlining/unique
-optimizations code/removal/advanced,code/simplification/string,
  code/removal/exception,code/removal/variable,code/merging
-optimizations class/unboxing/enum
-allowaccessmodification
-mergeinterfacesaggressively
#-optimizationpasses 5

#-repackageclasses ''
-flattenpackagehierarchy 'software'

## Obfuscation
-dontusemixedcaseclassnames
-overloadaggressively

## Keep attributes
-keepattributes !InnerClasses,Signature,Deprecated,*Annotation*,Synthetic 
-adaptresourcefilecontents **.fxml


# ProGuard doesn't print notes about classes with matching names
-dontnote com.google.**
-dontnote com.sun.**
-dontnote org.apache.log4j.**
-dontnote org.apache.logging.**
-dontnote com.itextpdf.**
-dontnote org.apache.commons.io.**
-dontnote org.apache.commons.codec.**
-dontnote org.apache.commons.lang3.**
-dontnote org.hibernate.**

-dontnote **
-dontwarn **

# Keep specific proprietary classes
-keep class com.mycompany.product.framework.logging.** {
}

-keep class com.mycompany.product.plugin.persistence.** {
    <fields>;
    <methods>;
}

-keep class com.mycompany.product.plugin.networking.** { 
    <fields>;
    <methods>;
}

-keep class com.mycompany.product.framework.automation.events.** {
    <fields>;
    <methods>;
}

-keep class com.mycompany.product.plugin.events.** {
    <fields>;
    <methods>;
}

-keep class com.mycompany.product.plugin.remote.** { 
    <fields>;
    <methods>;
}

-keepnames class com.mycompany.product.plugin.providers.* {
}

-keepclassmembers class com.mycompany.product.framework.events.TestCase 
{
    <fields>;
    <methods>;
}

# Keep class members with @FXML annotations
-keepclassmembers,allowshrinking class * {
    @javafx.fxml.FXML
    <fields>;
    @javafx.fxml.FXML
    <methods>;
}

# Keep - Antlr library 
-keep class antlr.** {
    <fields>;
    <methods>;
}

# Keep fasterxml
-keep class com.fasterxml.** { 
    <fields>;
    <methods>; 
}

# Keep - Google classes
-keep class com.google.** {
    <fields>;
    <methods>;
}

... remaining other classes not to be included / sanitized
... followed by standard Proguard template configuration (truncated)

# Keep classes that implement Serializable
 -keepnames class * implements java.io.Serializable
 -keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
# Keep - Applications. Keep all application classes, along with their 
 'main' methods.
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}

# Also keep - Enumerations. Keep the special static methods that are 
 required in enumeration classes.
-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# Keep - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses,allowshrinking class * {
    native <methods>;
}

Классы, которые мы пытаемся запутать, которые включают внутренние / вложенные классы enum, находятся в пакете:

com.mycompany.packageContainingEnum1.enumOuterClass1
com.mycompany.packageContainingEnum1.enumOuterClass1$enum1ClassName

и

com.mycompany.packageContainingEnum2.enumouterClass2
com.mycompany.packageContainingEnum2.enumOuterClass2$enum2ClassName

Как вы видите, пакеты, которые вызывают проблемы, находятся ниже пакета "product" и, следовательно, не должны затрагиваться вышеуказанными правилами?

Есть идеи, почему имена enumouterClass2 и enumOuterClass2$enum2ClassName (enum) сохраняются? Это кажется странным, поскольку по умолчанию у большинства людей возникают проблемы с предотвращением запутывания внутренних классов.

Большое спасибо за вашу помощь.

...