Mielőtt Java programod terjesztésébe kezdesz, gondoskodnod kell róla, hogy mások minnél nehezebben tudják visszafejteni - és így ellopni - a nagy munkával megírt forráskódot.

Két obfuscator programot is kipróbáltam:

A ProGuard tapasztalataim szerint egyszerűbben beépíthető a NetBeans-be és könnyebben konfigurálható, ezért ennek a menetét ismertetem.

 Platform

Figyelj rá, hogy ha a legújabb Java platfomot használod, nem biztos, hogy a ProGuard támogatja, így valami hasonló hibaüzenetet fogsz kapni:

Can't read [C:\Program Files\Java\jdk1.7.0\jre\lib\rt.jar]
(Can't process class [com/oracle/net/Sdp$1.class] (Unsupported version number [51.0] for class format))

A 4.7-es verziótól mindegyik támogatja a Java 7-et, és tényleg működik is vele (kipróbáltam).

Telepítés NetBeans-hez

  1. Töltsd le a ProGuard legújabb verzióját. A letöltő oldal itt érhető el.
  2. Csomagold ki az állományt
  3. A lib alkönyvtárban található JAR fájlokat másold be egy tetszőleges könyvtárba
  4. Jegyezd meg a könytár nevét, mert később szükség lesz rá!

Ha ez megvan, a NetBeans projekted build.xml fájljába másold be a következő ANT szkriptet. A szkriptben félkövéren kiemelt elérési útvonalat értelemszerűen módosítsd, mielőtt a build gombra kattintasz a NetBeans-ben!

<target name="-post-jar">
    <property name="proguard.jar.path" value="/path/to/proguard/proguard.jar" />

    <taskdef resource="proguard/ant/task.properties"
             classpath="${proguard.jar.path}" />

    <echo message="Obfuscating ${dist.jar}..."/>
    <mkdir dir="${build.dir}/obfuscated"/>
    <proguard printmapping="${build.dir}/obfuscated/${application.title}.map"
              renamesourcefileattribute="SourceFile" ignorewarnings="true">

        <!-- Specify the input jars, output jars, and library jars. -->

        <injar  file="${dist.jar}" />
        <outjar file="${build.dir}/obfuscated/${application.title}.jar" />

        <libraryjar path="${javac.classpath}" />          
        <libraryjar file="${java.home}/lib/rt.jar" />
        <libraryjar file="${java.home}/lib/jce.jar" />

        <!-- Keep some useful attributes. -->

        <keepattribute name="InnerClasses" />
        <keepattribute name="SourceFile" />
        <keepattribute name="LineNumberTable" />
        <keepattribute name="Deprecated" />
        <keepattribute name="*Annotation*" />
        <keepattribute name="Signature" />
        <keepattribute name="Exceptions" />

        <!-- Preserve all public classes, and their public and protected fields and methods. -->

        <keep access="public">
            <field  access="public protected" />
            <method access="public protected" />
        </keep>

        <!-- Preserve all .class method names. -->

        <keepclassmembernames access="public">
            <method type      ="java.lang.Class"
                    name      ="class$"
                    parameters="java.lang.String" />
            <method type      ="java.lang.Class"
                    name      ="class$"
                    parameters="java.lang.String,boolean" />
        </keepclassmembernames>

        <!-- Preserve all native method names and the names of their classes. -->

        <keepclasseswithmembernames>
            <method access="native" />
        </keepclasseswithmembernames>

        <!-- Preserve the methods that are required in all enumeration classes. -->

        <keepclassmembers extends="java.lang.Enum">
            <method access="public static"
                    type="**[]"
                    name="values"
                    parameters="" />
            <method access="public static"
                    type="**"
                    name="valueOf"
                    parameters="java.lang.String" />
        </keepclassmembers>

        <!-- 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 library doesn't use serialization.
        With this code serializable classes will be backward compatible -->

        <keepnames implements="java.io.Serializable"/>
        <keepclassmembers implements="java.io.Serializable">
            <field  access    ="final"
                    type      ="long"
                    name      ="serialVersionUID" />
            <field  access    ="!static !transient"
                    name      ="**"/>
            <field  access    ="!private"
                    name      ="**"/>
            <method access    ="!private"
                    name      ="**"/>
            <method access    ="private"
                    type      ="void"
                    name      ="writeObject"
                    parameters="java.io.ObjectOutputStream" />
            <method access    ="private"
                    type      ="void"
                    name      ="readObject"
                    parameters="java.io.ObjectOutputStream" />
            <method type      ="java.lang.Object"
                    name      ="writeReplace"
                    parameters="" />
            <method type      ="java.lang.Object"
                    name      ="readResolve"
                    parameters="" />
        </keepclassmembers>

        <!-- Your application may contain more items that need to be preserved;
        typically classes that are dynamically created using Class.forName -->

    </proguard>
    <copy file="${build.dir}/obfuscated/${application.title}.jar" tofile="${dist.jar}" overwrite="true"/>
    <delete dir="${build.dir}/obfuscated"/>
</target>

 

Kategória: Java

Látogatók

237104
Ma15
Tegnap74
Ezen a héten257
Ebben a hónapban1091
Összesen237104
Statistik created: 2024-04-18T22:22:10+02:00
Bejelentkezett felhasználók 0
Regisztrált felhasználók 1
Ma regisztráltak 0