Una asignatura pendiente que tengo es ofuscar el código con Proguard. Dos «requisitos»
- Que se haga automáticamente durante el proceso de desarrollo. Cada vez que compile y genere jars, que se generen los ofuscados.
- Y con el requisito anterior, que mi entorno de desarrollo use los jar ofuscados directamente. De esta forma, sobre mi entorno de desarrollo, según desarrollo y pruebo, veo si el ofuscado es correcto y todo funciona sin problemas.
Así que me decido a hacer el experimiento tanto con Gradle como con Maven en mi IntelliJ IDEA.
Proguard con Maven
Tienes el resultado en Proguard con Maven. Me llevó un rato, pero sin demasiados problemas.
- Poner el Plugin proguard-maven-plugin
- Decir que se ejecute durante la fase package de Maven
- Poner el Plugin build-helper-maven-plugin para indicar que el jar ofuscado generado, con apellido classifier small debe ser tratado como un segundo artifact del proyecto
Cree un proyecto maven padre con dos hijos, el de la librería que quiero ofuscar y del que he contado todo esto y luego un segundo hijo con un proyecto main que usa la librería ofuscada. Ahi puse la dependencia del jar ofuscado, básicamente, añadiendo <classifier>
IntelliJ me costó un poquito más configuarlo. Básicamente en la configuración de Run tuve que poner que ejecutara la tarea maven verify antes de la tarea build propia de IntelliJ. Eso me aseguraba que se construía el jar ofuscado cada vez.
Y todo bien. Toco los fuentes de mi código que se va a ofuscar, ejecuto desde IntelliJ el main y todo va bien. Se ejecuta Proguard y el main corre con el código ofuscado (lo veo en el log, por el nombre de las clases y métodos
09:32:41.606 [main] INFO com.chuidiang.examples.proguard_library.a.a – Toy sumando numeros
Fíjate que saca el log con el paquete »a», clase »a»
Proguard con Gradle
Esto si fue una odisea. Son las cosas de Gradle. Muy versátil, tanto, que cuesta hacerlo funcionar. Tienes el resultado en Gradle con Proguard.
Lo primero, que no me pasó con Maven, es que tras poner el plugin proguard-gradle y configurarlo, es que daba un error sin ninguna explicación. Poniendo la opción -i de gradle y verbose en la configuración de Proguard, ya si sale el error:
java.io.IOException: Please correct the above warnings first
y no hay más errores. La opción de gradle –stacktrace muestra la excepción pero tampoco da pista. Por un IOException esperaba que me diera el nombre de un fichero o qué IO le estaba dando el error.
Google y resulta que hay que poner en un libraryjars de Proguard las dependencias que hayas puesto en tu fichero build.gradle. Como no queremos ponerlas una a una, más google y encuentras un «gradle’s truco»
libraryjars configurations.findByName(‘runtimeClasspath’).getFiles()
Vale, ya soy capaz de crear el jar ofuscado con el comando gradle y lanzando la tarea de ofuscación que he creado. Ahora me queda hacer que se ejecute automáticamente al generar el jar. Sin mucho problema.
Ahora viene la parte de IntelliJ. El primer problema es la dependencia. Si en mi subproyecto de main pongo la depencia de esta forma
implementation project(‘:library’)
No soy capaz de decirle que use el jar ofuscado en vez de el normal. O al menos, no he encontrado la forma. Y si lo pongo como jar de terceros
implementation «com.chuidiang.proguard:library:${project.version}:small»
Pues gradle no lo encuentra. Para Gradle es neceario que este jar esté un un repositorio accesible (maven central, maven local, ….). Así que la solución pasa por poner el plugin maven-pulish , configurar los publishing y hacer que se publique ese jar en maven local al compilar.
Así que toca el lío de que la tareas proguard y publishMavenPublicationToMavenLocal se ejecuten en el orden adecuado de forma automática.
Con todo esto, al final quedó conseguido. En IntelliJ, en la configuración de Run, tuve que añadir la tarea previa a la ejecución de gradle jar. Esta tarea es estándar de gradle y tal cual hemos configurado en build.gradle es la que lanza todo lo demás (proguard y publish).
Resumiendo
Resumiendo, lo habitual. Tanto con Gradle como con Maven conseguí hacerlo. Con Maven me llevó una horita tenerlo todo montado y funcionando. Con Gradle un día entero.