Pregunta

compartir cualquiera puede con la muestra / simple tarea ANT ofuscación para Android? Siempre que tengo que APK completa y necesito sólo tiene que pasar hru clase * Proguard y luego preparar * .dex para construir APK

¿Fue útil?

Solución

solución

He encontrado:

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

Actualizar 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 tiene que ser añadido a los constructores de Eclipse (Propiedades / Constructores) tareas después de Java constructor y antes androide constructor paquete.

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

Otros consejos

El proceso de generación de Android compila archivos Java primera fuente (.java) a archivos de clase Java (.class), a continuación, convierte estos archivos de clases en código Dalvik (classes.dex), y finalmente los paquetes este código Dalvik en un archivo APK.

ProGuard lee y escribe archivos de clase Java, así que tiene que ser insertado en esta tubería entre la etapa de compilación y la etapa de conversión. No leer ni escribir código Dalvik sí mismo, así que no puede trabajar en el archivo APK.

El documentación de Android SDK en ProGuard discute cómo habilitar el paso de la ofuscación de la construcción Ant para android-9. En resumen, hay que añadir una línea "proguard.config = proguard.cfg" a los default.properties de archivos y ejecute "liberación hormiga".

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

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

Con el tiempo, lo que hice fue lo siguiente:

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

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

Después de que yo era capaz de correr ant release, que se hizo cargo de la construcción y la ofuscación el resultado .apk presentar fuera de la caja.

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

  1. Habilitar Proguard Ofuscador (obviamente)
  2. Crea un archivo ant.properties y llenarlo con los parametros key.store apropiadas (ver este SO responder para más detalles).

Las necesidades del proceso PROGUARD ofuscación .class archivos, de manera que no se puede poner en marcha una hormiga antes IDE acumulación (.java) o después (.dex lleno).

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

http://www.androidengineer.com/2010/ 07 / optimizar-ofuscar-y-shrinking.html

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

  • Después de la acumulación IDEA de desempaquetado el archivo APK con apktool.
  • Convertir los archivos .class a .dex con dex2jar
  • Ejecutar PROGUARD ya que el puesto anterior espectáculo que

Lo siento que no te adjunto los enlaces de apktool y dexjar pero como yo soy novato no puedo publicar más de un hipervínculo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top