2011-08-23 14 views
5

Actualmente estoy desarrollando una biblioteca Java propia para usar en otras aplicaciones de mi oficina, y estoy explorando formas de ofuscar la biblioteca.Uso de yGuard para ofuscar la biblioteca en Eclipse

Estoy trabajando con Eclipse Indigo, y estoy usando yGuard v2.3.0.1.

En primer lugar, mi código Java:

package com.test.ObfuscateTest; 

public class MainClass { 

    private String secretClassVariable; 

    public static void main(String[] args) { 

    } 

    protected void SecretMethod(String secretParameter) { 

     secretClassVariable = secretParameter; 
    } 
} 

Usando yGuard con el siguiente script ANT, me las redes de un archivo JAR vacío:

<?xml version="1.0" encoding="UTF-8"?> 

<project name="project" default="yguard" basedir="."> 

    <target name="init"> 
     <property name="project_name" value="ObfuscateTest"/> 
     <property name="srcDir" value="."/> 
     <property name="classDir" value="classes"/> 
     <property name="jar" value="${project_name}.jar"/> 
     <property name="obfjar" value="${project_name}_obf.jar"/> 
     <property name="renamelog" value="${project_name}_renamelog.xml"/> 
     <property name="shrinklog" value="${project_name}_shrinklog.xml"/> 
     <property name="mainclass" value="com.test.ObfuscateTest"/> 
     <mkdir dir="${classDir}" /> 
    </target> 


    <target depends="jar" name="yguard"> 
     <taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="/Users/foo/Desktop/yguard-2.3.0.1/lib/yguard.jar"/> 
     <!-- the following can be adjusted to your needs --> 
     <yguard> 

      <inoutpair in="${jar}" out="${obfjar}"/> 

      <!-- don't let the obfuscator remove the "Deprecated" --> 
      <!-- attributes from the .class file entries --> 
      <attribute name="Deprecated"/> 

      <shrink logfile="${shrinklog}"> 
       <keep> 
        <class classes="none" methods="protected" fields="none"> 
          <patternset> 
           <include name="com.test.ObfuscateTest.*"/> 
          </patternset> 
          </class> 
       </keep> 
      </shrink> 

      <rename mainclass="${mainclass}" logfile="${renamelog}"> 
       <keep> 
        <class classes="none" methods="protected" fields="none"> 
          <patternset> 
           <include name="com.test.ObfuscateTest.*"/> 
          </patternset> 
          </class> 
       </keep> 
      </rename> 

     </yguard> 

    </target> 

    <!-- compile --> 
    <target name="compile" depends="init"> 
     <javac srcdir="${srcDir}" includes="com/test/ObfuscateTest/*.java" destdir="${classDir}"> 
     </javac> 
    </target> 

    <!-- create .jar --> 
    <target name="jar" depends="compile"> 
     <jar jarfile="${jar}" basedir="${classDir}" includes="com/test/ObfuscateTest/*"/> 
    </target> 

    <!-- run project --> 
    <target name="run" depends="yguard"> 
     <java classname="${mainclass}" fork="true"> 
      <classpath> 
       <pathelement location="${obfjar}"/> 
      </classpath> 
     </java> 
    </target> 

    <!-- removes all that has been built --> 
    <target name="clean" depends="init"> 
     <delete dir="${classDir}" includeEmptyDirs="true" /> 
    </target> 
</project> 

¿Podría amablemente pedir algún consejo en cuanto a lo que estoy haciendo mal?

¡Muchas gracias de antemano!

+0

¿Por qué está confundiendo el código que se utilizará en su oficina? –

+0

La biblioteca potencialmente se lanzará a desarrolladores de terceros, por lo tanto, la necesidad de ofuscación. – Earthling

+0

Bueno, he conseguido que ProGuard ofusque mi código bastante bien, así que es uno, pero me encantaría saber si hay alguna forma de que YGuard funcione. – Earthling

Respuesta

3

El elemento de contracción está destinado a ser utilizado de manera diferente. Especifica los puntos de entrada desde los cuales yguard comienza a buscar clases dependientes. Todas las clases que no pueden ser alcanzadas son eliminadas. Por lo general, usted proporciona el método principal de esta manera:

<shrink logfile="${shrinklog}"> 
    <keep> 
    <method name="void main(java.lang.String[])" class="${mainclass}" /> 
    </keep> 
</shrink> 
+0

El resultado final sigue siendo el mismo: un pequeño archivo jar de 350 bytes sin clases dentro. (Solo la carpeta Meta-INF). La salida de error es: Error al cargar el atributo de manifiesto de clase principal desde C: \ Users \ foo \ Java \ ObsfucateTest \ src \ ObfuscateTest.jar Sin embargo, su ayuda es muy apreciada. – David

+0

También sucede sin las líneas de contracción en el xml en conjunto. – David

+0

Acabo de probar esto, y creo que mi respuesta es correcta. Con su configuración original de contracción, la clase principal se elimina y el archivo JAR está vacío. Con mi configuración de contracción, la clase se conserva. Por favor, eche un vistazo si ObfuscateTest.jar está vacío o no, porque esa es la entrada a yguard. Tal vez tengas un problema en el diseño de tu directorio. –

Cuestiones relacionadas