суббота, 25 мая 2013 г.

Netbeans. Сборка обфусцированного Java-приложения

Разрабатывая приложения на языке Java, иногда приходится уменьшить размер выходного jar-файла, оптимизировать его и защитить от посторонних глаз. В этом помогает обфускатор ProGuard. Сейчас я расскажу, как это сделать в Netbeans IDE.

Первым делом нужно скачать ProGuard и распаковать его в какую-нибудь директорию. Нам нужен всего один файл lib/proguard.jar, скопируем его в папку proguard, которую создадим в корне папки Java-проекта. Например: ..\NetBeansProjects\SomeProject\proguard
Далее, в этой же папке следует создать файл конфигурации с расширением .pro, допустим это будет java.pro. Впишем в этот файл такой текст:
-printmapping out.map
-printusage out.txt
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable,Deprecated,Signature,InnerClasses
-keepattributes *Annotation*

-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}
-keepclasseswithmembernames class * {
    native ;
}
-keepclassmembers class * extends java.lang.Enum {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-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();
}
-optimizationpasses 9
-allowaccessmodification
-dontusemixedcaseclassnames
Это слегка модифицированный файл конфигурации из примеров обфускатора. Что делает тот или иной параметр, можно посмотреть в документации на офсайте или в папке docs.

Остаётся только настроить Netbeans'овый Apache Ant, чтобы тот создавал обфусцированный бинарник. Для этого открываем файл build.xml и добавляем это:
<target name="-post-jar">
    <property name="proguard.jar.path" value="proguard/proguard.jar" />
    <echo message="Obfuscating ${dist.jar}..." />
    <taskdef resource="proguard/ant/task.properties"
             classpath="${proguard.jar.path}" />

    <proguard configuration="proguard/java.pro">
        <injar  file="${dist.jar}" />
        <outjar file="${build.dir}/obfuscated.jar" />
        
        <libraryjar path="${javac.classpath}" />
        <libraryjar file="${java.home}/lib/rt.jar" />
    </proguard>
    
    <move file="${build.dir}/obfuscated.jar" tofile="${dist.jar}"/>
</target>
Теперь сборка будет проходить чуть дольше из-за оптимизации и обфускации, зато на выходе получим обфусцированную программу. Также в папке proguard будут два файла:
  • out.map - карта изменения имён классов/методов/полей.
  • out.txt - список неиспользуемых классов/методов/полей. По нему можно узнать о наличии  неиспользуемого кода.

Комментариев нет:

Отправить комментарий