Cómo especificar lesiones para proguard dentro de android gradle archivos de compilación para las bibliotecas que se extraen de maven central
Hay una manera de pasar las bibliotecas extraídas de maven central como injars para proguard? Quiero que se ofusque. Contexto: eliminar las clases no utilizadas con proguard para Android
- Escribir una excepción al paquete en la aplicación firmada
- Traducción no captada SimException: dx.rop.cst.CstInterfaceMethodRef no se puede convertir en com.android.dx.rop.cst.CstMethodRef (Proguard)
- ¿Cómo mantener el código de cruce cuando ofusque mi proyecto?
- Proguard Error / Dalvik Error 1 al firmar la aplicación para Android
- Google Analytics vuelve a consultar Proguard
- Proguard no funciona cuando se exporta con el complemento Eclipse ADT R19
- Cómo configurar proguard para eliminar SOLAMENTE llamadas de registro de android
- Proguard mess Javascript Funciones de interfaz al orientar SDK en Android Manifiesto por encima de 17
- Conflicto entre la vinculación de datos de Android y la guayaba provoca error en ProGuard
- ¿Cómo puedo decir a proguard para asumir un paquete no se utiliza?
- Excluyendo ciertos módulos de proguard Android Gradle Buildscript
- Proguard config para newrelic en la aplicación android?
- Android Proguard no está en línea
Nunca he utilizado Maven y estoy usando Gradle, pero ya sea construir sistema, lo mismo se aplica creo. Y no creo que lo que quieras sea posible …
La palabra clave -injars
es específica del archivo de configuración de ProGuard, que es un archivo de texto leído por las herramientas de compilación.
La única manera que veo es que si usted construye un cierto tipo de escritura que eso para usted. Es decir, lea todas las dependencias de Maven, cree el archivo de configuración apropiado de ProGuard especificando todos los -injars necesarios y pase al proceso de compilación. No estoy seguro de cuán factible es esto con Maven.
No debería ser demasiado difícil con Gradle. Con Gradle puede pasar fácilmente varios archivos de configuración de ProGuard y podría crear un método en el archivo build.gradle
para obtener todas las ubicaciones de archivos .jar de las dependencias y crear un archivo de texto temporal que luego pasaría a la configuración de ProGuard.
Supongo que el mismo proceso funcionaría con Maven, pero de nuevo, nunca lo usé.
EDIT: Veo ahora la pregunta formulada específicamente a Gradle. Mi respuesta es para Ant, pero puede darte ideas.
Una solución completa implica estos pasos:
- Crear un build.xml personalizado
- Copiar y modificar el objetivo de "ofuscar" para usar
- Utilizar los injares de un directorio donde Maven los pone
- Automatice Maven para poner frascos en un directorio. Y aquí es donde estoy perdido. No hay suficiente experiencia con gradle / maven.
Pasos en detalle:
1. Custom build.xml
En build.xml, poner en "personalizado", como tal:
<!-- version-tag: custom --> <import file="${sdk.dir}/tools/ant/build.xml" />
Antes de este bit, inserte el código a continuación, o póngalo en un archivo separado (general-build.xml) e importe eso en build.xml.
2. Objetivo
Inserte lo siguiente:
<!-- Obfuscate target This is only active in release builds when proguard.config is defined in default.properties. To replace Proguard with a different obfuscation engine: Override the following targets in your build.xml, before the call to <setup> -release-obfuscation-check Check whether obfuscation should happen, and put the result in a property. -debug-obfuscation-check Obfuscation should not happen. Set the same property to false. -obfuscate check if the property set in -debug/release-obfuscation-check is set to true. If true: Perform obfuscation Set property out.dex.input.absolute.dir to be the output of the obfuscation --> <target name="-obfuscate"> <if condition="${proguard.enabled}"> <then> <property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard" /> <property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar" /> <property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar" /> <!-- input for dex will be proguard's output --> <property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}" /> <!-- Add Proguard Tasks --> <property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar" /> <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}" /> <!-- Set the android classpath Path object into a single property. It'll be all the jar files separated by a platform path-separator. Each path must be quoted if it contains spaces. --> <pathconvert property="project.target.classpath.value" refid="project.target.class.path"> <firstmatchmapper> <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/> <identitymapper/> </firstmatchmapper> </pathconvert> <!-- Build a path object with all the jar files that must be obfuscated. This include the project compiled source code and any 3rd party jar files. --> <path id="project.all.classes.path"> <pathelement location="${preobfuscate.jar.file}" /> <path refid="project.all.jars.path" /> </path> <!-- Set the project jar files Path object into a single property. It'll be all the jar files separated by a platform path-separator. Each path must be quoted if it contains spaces. --> <pathconvert property="project.all.classes.value" refid="project.all.classes.path"> <firstmatchmapper> <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/> <identitymapper/> </firstmatchmapper> </pathconvert> <!-- Turn the path property ${proguard.config} from an A:B:C property into a series of includes: -include A -include B -include C suitable for processing by the ProGuard task. Note - this does not include the leading '-include "' or the closing '"'; those are added under the <proguard> call below. --> <path id="proguard.configpath"> <pathelement path="${proguard.config}"/> </path> <pathconvert pathsep='" -include "' property="proguard.configcmd" refid="proguard.configpath"/> <!-- INSERT SOME MAVEN STORAGE DIR BELOW --> <echo level="info">PROJECT.ALL.CLASSES.VALUE === ${project.all.classes.value}</echo> <echo level="info">PROJECT.TARGET.CLASSPATH.VALUE === ${project.target.classpath.value}</echo> <property name="project.all.classes.value2" value="${project.all.classes.value}:/some-maven-dir"/> <echo level="info">PROJECT.ALL.CLASSES.VALUE2 === ${project.all.classes.value2}</echo> <mkdir dir="${obfuscate.absolute.dir}" /> <delete file="${preobfuscate.jar.file}"/> <delete file="${obfuscated.jar.file}"/> <jar basedir="${out.classes.absolute.dir}" destfile="${preobfuscate.jar.file}" /> <proguard> -include "${proguard.configcmd}" -include "${out.absolute.dir}/proguard.txt" -injars ${project.all.classes.value2} -outjars "${obfuscated.jar.file}" -libraryjars ${project.target.classpath.value}(!META-INF/MANIFEST.MF,!META-INF/NOTICE.txt,!META-INF/LICENSE.txt) -dump "${obfuscate.absolute.dir}/dump.txt" -printseeds "${obfuscate.absolute.dir}/seeds.txt" -printusage "${obfuscate.absolute.dir}/usage.txt" -printmapping "${obfuscate.absolute.dir}/mapping.txt" -printconfiguration "${obfuscate.absolute.dir}/used_config.txt" </proguard> </then> </if> </target>
Otra manera de hacerlo es copiar en jarras sólo temporales (la misma técnica se utiliza para regular las dependencias del proyecto Java que no son proyectos de la biblioteca de Android):
<property name="lib.javalib1.project.dir" location="${basedir}/../../some-maven-dir" /> <target name="-pre-build"> <subant buildpath="${lib.javalib1.project.dir}" target="package" failonerror="true" /> <copy todir="${basedir}/libs" failonerror="true" verbose="true"> <fileset dir="${lib.javalib1.project.dir}/bin"> <filename name="general-api.jar"/> </fileset> </copy> </target> <target name="-post-package"> <delete verbose="true"> <fileset dir="${basedir}/libs" includes="general-api.jar" /> </delete> </target>
Pero compila los frascos uno por uno y los copia, por lo que para Maven, donde los tarros ya están disponibles, esto es una desventaja.
3. Maven dir
"/ Some-maven-dir" es un directorio donde se almacenan jarras.
4. Automatización Maven
No puedo ayudar aquí, pero he presentado una sugerencia para la primera parte. Tal vez alguien puede continuar con esto.
- ¿Cómo diferenciar entre múltiples solicitudes etiquetadas usando Google Volley con un onResponse en línea o un oyente de respuesta?
- ¿Es posible a los miembros de @Inject (proporcionados a través de @Provides), que contienen un Contexto de Actividad de la Actividad Base