Eliminar las clases no utilizadas con proguard para Android

Historia / Contexto Tengo un proyecto [1] donde el tamaño realmente importa – recientemente moví cosas a una biblioteca compartida [2] y pensé que proguard se hará cargo y eliminará las clases no utilizadas porque tenía una configuración que estaba reduciendo drásticamente el tamaño pero por Utilizando el lib i se acercó a la magia 100kb marca por lo que investigado: las clases que no uso con seguridad están en el archivo dex resultante – e incluso con el nombre completo (no abreviado a solo char) – por ejemplo, veo el SquareView en el Dex que de ninguna manera uso en la aplicación.

Pregunta Sorprendentemente encontré en la documentación proguard lo siguiente:

The library jars themselves always remain unchanged. 

¿Puedo de alguna manera decir / engañar a proguard (in) para procesarlos? Encuentro esto realmente extraño especialmente porque espero que más cosas sean removibles en la biblioteca que en la propia aplicación.

[1] https://github.com/ligi/FAST [2] https://github.com/ligi/AndroidHelper

Los procesos de generación de Eclipse / Ant / Gradle en el SDK de Android especifican automáticamente el código (de bin/classes ) y sus bibliotecas (de libs ) con la opción -injars . Esto significa que la aplicación completa está compacta, optimizada y ofuscada (en versiones de lanzamiento, suponiendo que ProGuard esté habilitado).

Los procesos de compilación sólo especifican el android.jar Android con la opción -libraryjars . Es necesario procesar el código, pero no debe terminar en el apk procesado, ya que ya está presente en el dispositivo.

Así que todo debería funcionar automáticamente. Todavía puede ver bibliotecas enteras con sus nombres originales en apks procesados, si su configuración proguard-project.txt contiene líneas como -keep class org.mylibrary.** { *; } -keep class org.mylibrary.** { *; } . Tal configuración es típicamente una solución conservadora para dar cuenta de la reflexión. Con un poco de investigación y experimentación, a menudo se puede refinar la configuración y obtener mejores resultados. Usted puede averiguar por qué las clases se mantienen con la opción -whyareyoukeeping .

Creo que tienes que usar -injars :

-injars class_path Especifica los jars de entrada (o guerras, oídos, cremalleras o directorios) de la aplicación que se va a procesar. Los archivos de clase en estos frascos serán procesados ​​y escritos en los tarros de salida. De forma predeterminada, los archivos que no sean de clase se copiarán sin cambios. Tenga en cuenta todos los archivos temporales (por ejemplo, creados por IDE), especialmente si está leyendo los archivos de entrada directamente desde los directorios. Las entradas en el camino de la clase pueden ser filtradas, como se explica en la sección de filtros. Para una mejor legibilidad, las entradas de ruta de clase se pueden especificar usando varias opciones -injars.

Fuente: http://proguard.sourceforge.net/index.html#manual/usage.html

  • Reducir la biblioteca de Google Play Services para usarla únicamente con Google Analytics
  • Android Build con Gradle y ProGuard: "El frasco de salida debe especificarse después de un tarro de entrada, o estará vacío"
  • Error de compilación referenciando archivo build.xml y proguard: "null returned: 1"
  • GoogleAnalyticsV2 y Proguard
  • Cómo proteger la llamada a webservice en Android
  • Error de Proguard, no se puede exportar la aplicación
  • ¿Se recomienda la combinación de clases con ProGuard en Android / Dalvik?
  • Facturación en aplicaciones Android y Proguard (fuente desconocida)
  • Quitar la biblioteca externa de clases obfuscated.jar (en Android Studio / Gradle)
  • Excepción sobre la serialización de array usando proguard android
  • Eliminar actividad de apk a través de Proguard
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.