2

コンテンツを表示するために多くのTableViewを持つ1つのJavaFXアプリケーションを作成しました。Jarファイルを実行すると、アプリケーションは正常に動作します。アプリケーションをクライアントに配布する必要があるため、コードを難読化する必要があります。コードの難読化にProguard-4.8を使用しています。

サンプルjarを難読化するAntを使用して1つのサンプルTableViewビルドスクリプトを作成しました。

難読化前はjarのみをコンパイルしました-

難読化前

難読化ジャーの後-

難読化後

完全なビルドスクリプトプロジェクトを -http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript.zipにアップロードしました

完全に実行しました。見つけるだろう -

  1. build.xml- http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/build.xml
  2. 難読化せずにコンパイルされたJar- http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/Sample.jar
  3. Obfuscated Jar- http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/obfuscated/SampleObfuscated.jar
  4. Proguard.map- http: //neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/obfuscated/ObfuscatedProguard.map
  5. ソースJavaクラス-http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/src/TableViewWithButton.java

他のことはそれです-これは私のbuild.xmlファイルです-

<project name="sample" default="cleanBuildPackage" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
    <property environment="env"/>


    <property name="WorkingFolder" location="."/>
    <property name="ClassPath" location="${env.JAVA_HOME}/jre/lib/jfxrt.jar;${env.JAVA_HOME}/lib/ant-javafx.jar;${WorkingFolder}/lib/proguard.jar;"/>
    <property name="dist" value="dist"/>  
    <property name="main.class" value="TableViewWithButton"/>
    <property name="app.name" value="Sample"/>


    <target name="init">
        <echo message="Java installation directory: ${java.home}"/>
        <!-- Create the time stamp -->
        <tstamp/>

        <delete dir="${WorkingFolder}/build"/>
        <delete dir="${dist}"/>
        <mkdir dir="${dist}"/>
        <mkdir dir="${WorkingFolder}/build"/>
    </target>

    <target name="CompilingSample" depends="init">
        <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"      
             uri="javafx:com.sun.javafx.tools.ant" classpath=".;${env.JAVA_HOME}/jre/lib/jfxrt.jar"/>
        <javac classpath="${ClassPath};" srcdir="${WorkingFolder}/src" destdir="${WorkingFolder}/build"/>
    </target> 



    <target name="CreatingSampleJar" depends="CompilingSample" description="generate the distribution" >
        <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"      
        uri="javafx:com.sun.javafx.tools.ant" classpath="${env.JAVA_HOME}/lib/ant-javafx.jar"/>
            <fx:jar destfile="${WorkingFolder}/${app.name}.jar">
                    <fx:application mainClass="${main.class}"/>
                <fileset dir="${WorkingFolder}/build"/>
            </fx:jar>
    </target> 

    <target name="Ofuscating" depends="CreatingSampleJar" >

        <taskdef resource="proguard/ant/task.properties" classpath="${WorkingFolder}/lib/proguard.jar" />
            <mkdir dir="obfuscated"/>
                <proguard printmapping="obfuscated/ObfuscatedProguard.map"
                                renamesourcefileattribute="SourceFile" ignorewarnings="true">

                    -dontshrink
                    -dontoptimize

                    -libraryjars "${java.home}/lib/rt.jar"
                    -libraryjars "${java.home}/lib/javaws.jar"
                    -libraryjars "${env.JAVA_HOME}/lib/ant-javafx.jar"
                    -libraryjars "${env.JAVA_HOME}/jre/lib/jfxrt.jar"           


                    -injars ${WorkingFolder}/${app.name}.jar                                    

                    -outjars ${WorkingFolder}/Obfuscated.jar

                    -ignorewarnings

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

                    -adaptresourcefilecontents **.fxml,**.properties,META-INF/MANIFEST.MF,images/*,publicCerts.store,.version

                            <!--  
                            If I am adding this then I am able to see TableView Contents, but it do not obfuscate all public classes and their methods.
                            <keep access="public">
                                                 <method access="public protected" />
                                        </keep> 
                                         -->

                    -keepclassmembernames class * {
                        @javafx.fxml.FXML *;
                    } 
                    -keepclasseswithmembers public class com.javafx.main.Main, TableViewWithButton {
                            public static void main(java.lang.String[]);
                    }                    
            </proguard>


    </target>

    <target name="Movejar" depends="Ofuscating">
        <move
        file="${WorkingFolder}/Obfuscated.jar"
        tofile="obfuscated/${app.name}Obfuscated.jar" verbose="true" overwrite="true" />
    </target>



    <target name="cleanBuildPackage" depends="Movejar">
            <fx:deploy width="800" height="600" nativeBundles="all" outdir="${dist}" outfile="${app.name}">
                <fx:info title="${app.name}"/>
                    <fx:application name="${app.name}" mainClass="${main.class}"/>
                    <fx:resources>
                        <fx:fileset dir="${dist}" includes="*.jar"/>
             </fx:resources>
         </fx:deploy>
    </target>

</project>

build.xmlでこの行を追加すると、TableViewの内容を表示できますが、すべてのパブリッククラスとそのメソッドがわかりにくくなるわけではありません。

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

プロジェクトを完全に難読化する必要があります。TableViewテキストを完全に表示できるように、パブリッククラスを難読化しないでjarファイルを難読化する他の方法はありますか?

ありがとう、

ニーラムシャルマ

4

1 に答える 1

2

PropertyValueFactoryの長い形式を使用することをお勧めします:

col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Test, String>,
             ObservableValue<String>>() {
     public ObservableValue<String> call(TableColumn.CellDataFeatures<Test, String> t) {
         // t.getValue() returns the Test instance for a particular TableView row
         return t.getValue().testProperty();
         // or
         return new SimpleStringProperty(t.getValue().getMessage());
     }
  });
于 2013-01-25T04:53:23.210 に答える