2011-01-07 22 views

Respuesta

12

que he encontrado:

  1. Get Proguard - copia en el directorio proguard.jar conocido (por ejemplo MiProyecto/Proguard)
  2. Prepare proguard.cfg -describing qué y cómo optimizar el/obfuscate. Este proceso se describe a fondo en la Proguard manual
  3. Preparar siguiente build.xml de ANT (o algo bajo como éste) - gracias a el gran this guy

ACTUALIZACIÓN build.xml completa

<?xml version="1.0" encoding="UTF-8"?> 
<project name="MyProject" default="zipalign" basedir="."> 
    <property name="target" value="android-8"/> 
    <!--property file="default.properties" /--> 
    <property name="encoding" value="UTF-8"/> 

    <!-- dirs --> 
    <property name="sdk.dir" location="Location of Android SDK"/> 
    <property name="proguard.dir" value="proguard" /> 
    <property name="src.dir" value="src"/> 
    <property name="gen.dir" value="gen"/> 
    <property name="res.dir" value="res"/> 
    <property name="assets.dir" value="assets"/> 
    <property name="libs.dir" value="libs"/> 
    <property name="out.classes.unoptimized.dir" value="out"/> 
    <property name="out.classes.optimized.dir" value="out/optimized"/> 

    <!-- files --> 
    <property name="manifest.file" value="AndroidManifest.xml"/> 
    <property name="signed.apk" value="${ant.project.name}-signed.apk"/> 
    <property name="unsigned.apk" value="${ant.project.name}-unsigned.apk"/> 
    <property name="final.apk" value="${ant.project.name}.apk"/> 
    <property name="android.jar" value="${sdk.dir}/tools/platforms/${target}/android.jar"/> 
    <property name="unoptimized" value="unoptimized.jar" /> 
    <property name="optimized" value="optimized.jar" /> 
    <property name="proguard.config" value="${proguard.dir}/proguard.cfg"/> 

    <!-- tools --> 
    <property name="dx.jar" value="${sdk.dir}/platform-tools/lib/dx.jar"/> 
    <property name="aapt" value="${sdk.dir}/platforms/${target}/tools/aapt.exe"/> 
    <property name="zipalign" value="${sdk.dir}/tools/zipalign.exe"/> 
    <property name="jarsign" value="jarsigner.exe location is here"/> 
    <property name="keystore" value="Your key store is here"/> 
    <property name="keyalias" value="Your key alias is here"/> 


    <path id="android.antlibs"> 
     <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" /> 
     <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" /> 
     <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" /> 
     <pathelement path="${sdk.dir}/tools/lib/apkbuilder.jar" /> 
     <pathelement path="${sdk.dir}/tools/lib/jarutils.jar" /> 
    </path> 

    <taskdef name="setup" 
     classname="com.android.ant.SetupTask" 
     classpathref="android.antlibs" /> 
    <setup import="false"/> 

    <!--taskdef name="aaptexec" 
      classname="com.android.ant.AaptExecLoopTask" 
      classpathref="android.antlibs" /--> 

    <target name="clean" description="Removes output files created by other targets."> 
     <echo>Cleaning...</echo> 
     <delete dir="${out.classes.unoptimized.dir}" verbose="true" /> 
     <delete dir="${out.classes.optimized.dir}" verbose="true" /> 
    </target> 

    <target name="dirs"> 
     <echo>Creating output directories if needed...</echo> 
     <mkdir dir="${out.classes.unoptimized.dir}" /> 
     <mkdir dir="${out.classes.optimized.dir}" /> 
    </target> 

    <!-- Compiles this project's .java files into .class files. --> 
    <target name="compile" depends="dirs" 
      description="Compiles project's .java files into .class files"> 
     <echo>Compiling sources...</echo> 
     <javac encoding="${encoding}" target="1.6" debug="true" extdirs="" 
       destdir="${out.classes.unoptimized.dir}" 
       bootclasspathref="android.target.classpath" 
       includeantruntime="true"> 
      <src path="${src.dir}" /> 
      <src path="${gen.dir}" /> 
      <classpath> 
       <fileset dir="${libs.dir}" includes="*.jar" /> 
      </classpath> 
     </javac> 
    </target> 

    <target name="preobfuscate" depends="compile"> 
     <echo>Preparing to obfuscation...</echo> 
    <jar destfile="${unoptimized}" 
     basedir="${out.classes.unoptimized.dir}" 
     includes="**/**" 
     excludes="optimized/**" 
     /> 
    </target> 

    <!-- Obfuscation with ProGuard --> 
    <target name="optimize" unless="nooptimize" depends="preobfuscate"> 
     <echo>Proguard obfuscation...</echo> 
     <java jar="${proguard.dir}/proguard.jar" fork="true" failonerror="true"> 
      <jvmarg value="-Dmaximum.inlined.code.length=16" /> 
      <arg value="@${proguard.dir}/proguard.cfg" /> 
      <arg value="-injars ${unoptimized}" /> 
      <arg value="-outjars ${optimized}" /> 
      <arg value="-libraryjars ${android.jar}" /> 
     </java> 
     <unzip src="${optimized}" dest="${out.classes.optimized.dir}" /> 
     <!-- Delete optimized jar (now unzipped into bin directory) --> 
     <delete file="${optimized}"/> 
     <delete file="${unoptimized}"/> 
    </target> 

    <target name="dex" description="Converting JVM bytecodes into Dalvik bytecodes" depends="optimize"> 
     <echo>Converting bytecodes to Dalvik VM bytecodes...</echo> 
     <java jar="${dx.jar}" fork="true"> 
      <arg line="--dex --verbose --output=${out.classes.optimized.dir}/classes.dex ${out.classes.optimized.dir}"/> 
     </java> 
    </target> 

    <target name="aapt" depends="dex" description="compile resources"> 
     <echo>Packing resources...</echo> 
     <exec executable="${aapt}" logerror="true" osfamily="windows"> 
      <arg line="p 
      -f 
      -M ${manifest.file} 
      -I ${android.jar} 
      -S ${res.dir} 
      -A ${assets.dir} 
      -F ${out.classes.optimized.dir}/${unsigned.apk} 
      -m -J ${gen.dir}"/> 
     </exec> 
    </target> 

    <target name="sign" depends="aapt" description="sign apk"> 
     <input message="Please enter keystore password (store:${keystore}):" 
         addproperty="keystore.password" /> 
     <echo>Signing apk...</echo> 
     <exec executable="${jarsign}" logerror="true" osfamily="windows"> 
      <arg line="-verbose 
      -keystore ${keystore} 
      -storepass ${keystore.password} 
      -signedjar ${out.classes.optimized.dir}/${signed.apk} 
      ${out.classes.optimized.dir}/${unsigned.apk} ${keyalias}"/> 
     </exec> 
    </target> 

    <target name="zipalign" depends="sign" description="zip align"> 
     <echo>Aligning apk...</echo> 
     <exec executable="${zipalign}" logerror="true" osfamily="windows"> 
      <arg line="-f 
      -v 
      4 
      ${out.classes.optimized.dir}/${signed.apk} 
      ${final.apk}"/> 
     </exec> 
    </target> 

</project> 
  1. Esta tarea ANT debe agregarse a las tareas de constructores (Propiedades/Creadores) de Eclipse después del creador de Java y antes del creador de paquetes de Android.

  2. Prensa "Build All" (que es mejor fuera de verificación Generar automática en el menú de Eclipse)

+0

¿publicarías el build.xml completo? – eros

+0

no se puede encontrar jarutils.jar – eros

+0

¿Por qué agregó "es mejor desactivar el control de compilación automática en el menú de Eclipse"? ¿Es esto significativamente más lento que los constructores Eclipse Java/Android predeterminados? Si es así, ¿es solo por el paso de Proguard, o es el proceso de compilación de ant malo para detectar dependencias? –

9

El proceso de compilación de Android primero compila los archivos fuente de Java (.java) a los archivos de clase Java (.class) , luego convierte estos archivos de clase en código Dalvik (classes.dex), y finalmente empaqueta este código Dalvik en un archivo APK.

ProGuard lee y escribe archivos de clase Java, por lo que debe insertarse en esta interconexión entre el paso de compilación y el de conversión. No lee ni escribe el código Dalvik en sí, por lo que no puede funcionar en el archivo APK.

El Android SDK documentation on ProGuard explica cómo habilitar el paso de ofuscación en Ant build para android-9. En resumen, debe agregar una línea "proguard.config = proguard.cfg" al archivo default.properties, y luego ejecutar "ant release".

+1

No es exactamente lo que estaba preguntando ... Estoy compilando Android APK desde el interior de IDE (Intellij) y antes de la compilación o después de la compilación puedo comenzar una tarea de compilación ANT arbitraria. ¿Es posible de alguna manera definir una tarea ANT separada para eso? – barmaley

+2

Dado que el paso ProGuard debe ejecutarse en el medio de la canalización de compilación, no es posible simplemente agregar una tarea Ant antes o después de la compilación IDEA. Deberá crear un script Ant build.xml para todo el proceso de compilación y modificarlo. El comando de Android de Android SDK crea un archivo Ant para usted. Alternativamente, IDEA puede crear un archivo Ant para usted (Build> Generate Ant build ...). El complemento IDEA Android para IDEA ya parece crear el archivo Ant utilizando el SDK de Android. A continuación, puede ejecutar Ant build desde IDEA (barra de menú a la derecha, suponiendo que Ant plugin esté habilitado). –

1

El proceso de ofuscación proGuard necesita archivos .class para que no pueda iniciar una Ant antes de la compilación IDE (.java) o después (.dex empaquetado).

echar un vistazo a este post donde se explica cómo añadir el paso PROGUARD en su construcción Ant mundial:

http://www.androidengineer.com/2010/07/optimizing-obfuscating-and-shrinking.html

Si realmente desea utilizar la acumulación IDEA, puede intentar lo siguiente.

  • Después de la compilación IDEA, descomprimir el apk con apktool.
  • convertir los archivos a .dex .class con dex2jar
  • Run PROGUARD ya que el puesto anterior espectáculo que

sentimos que no te adjunto los enlaces de apktool y dexjar pero que a mí novato No puedo publicar más de un hipervínculo. solución

+0

Lo sé, pero solo necesito build.xml para Ant :) – barmaley

3

Atención: la respuesta de barmaley es desde el año 2011, y parece ser válida para la versión Android SDK Tools 8 o 10.

he intentado adaptar esta solución utilizando herramientas SDK de Android versión 18.1.1, pero están fracasando en el error:
taskdef class com.android.ant.SetupTask cannot be found

Incluso tualmente, lo que hice fue lo siguiente:

rm build.xml 
android update project -p . 
  • Si usted no tiene las herramientas del SDK en su camino, tendrá que utilizar la ruta completa de la herramienta androide, por ejemplo, en Windows: C: \ Android \ SDK \ tools

Esto creó un build.xml fresco, que es compatible con las actuales herramientas de SDK, y parecen automatizar una gran parte del trabajo manual que se describe en la respuesta del barmaley.

Después de eso pude ejecutar ant release, que se encargó de compilar y ofuscar el archivo .apk resultado de la caja.

Con el fin de automatizar la ofuscación a través de hormiga, tendrá que:

  1. Enable Proguard obfuscator (obviamente)
  2. Crear un archivo ant.properties y llenarlo con los parametros key.store apropiadas (ver this SO reply para más detalles)
+0

Tiene razón, hubo algunos cambios desde 2011. – barmaley

Cuestiones relacionadas