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

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:

  1. Crear un build.xml personalizado
  2. Copiar y modificar el objetivo de "ofuscar" para usar
  3. Utilizar los injares de un directorio donde Maven los pone
  4. 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.

  • Problema con Proguard y XmlPullParser
  • Crashlytics ProGuard duplicate zip entry
  • Error de ProGuard no puede encontrar superclase o interfaz org.apache.http.entity
  • Minify la aplicación para Android, pero no la ofusque
  • Aapt_rules.txt no se encuentra al crear apk en android studio
  • Kotlin y Proguard
  • Android, Scala y Proguard
  • ProGuard no funciona con okhttp
  • Proguard error si uso itext Library jar
  • El significado de { *; } En ProGuard
  • Android Build con Gradle y ProGuard: "El frasco de salida debe especificarse después de un tarro de entrada, o estará vacío"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.