2011-08-23 9 views
5

Attualmente sto sviluppando una propria libreria Java da utilizzare in altre app nel mio ufficio e sto esplorando modi per nascondere la libreria stessa.Uso di yGuard per offuscare la libreria in Eclipse

Sto lavorando con Eclipse Indigo e sto usando yGuard v2.3.0.1.

In primo luogo, il mio codice Java:

package com.test.ObfuscateTest; 

public class MainClass { 

    private String secretClassVariable; 

    public static void main(String[] args) { 

    } 

    protected void SecretMethod(String secretParameter) { 

     secretClassVariable = secretParameter; 
    } 
} 

Utilizzando yGuard con il seguente script ANT, mi cattura con la rete di un file JAR vuoto:

<?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> 

Potrei gentilmente chiedere qualche consiglio su quello che ho sto sbagliando?

Grazie mille in anticipo!

+0

Perché stai offuscando il codice che verrà utilizzato all'interno del tuo ufficio? –

+0

La libreria potrebbe essere potenzialmente rilasciata agli sviluppatori di terze parti, quindi, la necessità di offuscamento. – Earthling

+0

Beh, ho ottenuto ProGuard per oscurare il mio codice abbastanza bene, quindi questo è uno di questi aspetti, ma mi piacerebbe sapere se c'è un modo per far funzionare yGuard. – Earthling

risposta

3

L'elemento termoretraibile deve essere utilizzato in modo diverso. Specifica i punti di ingresso da cui yguard inizia a cercare le classi dipendenti. Tutte le classi che non possono essere raggiunte vengono rimosse. Di solito fornisci il metodo principale come questo:

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

Il risultato finale è sempre lo stesso: un minuscolo file jar da 350 byte senza classi all'interno. (Solo la cartella Meta-INF). L'output dell'errore è: Impossibile caricare l'attributo manifest Main-Class da C: \ Users \ foo \ Java \ ObsfucateTest \ src \ ObfuscateTest.jar Tuttavia, il tuo aiuto è molto apprezzato. – David

+0

Succede anche senza le linee di restringimento nel xml del tutto. – David

+0

Ho appena provato questo, e penso che la mia risposta sia corretta. Con la configurazione di restringimento originale la MainClass viene rimossa e il file JAR è vuoto. Con la mia configurazione riduttiva la classe viene mantenuta. Si prega di dare un'occhiata se ObfuscateTest.jar è vuoto o no, perché questo è l'input per yguard. Forse hai un problema nel tuo layout di directory. –

Problemi correlati