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:
- No se puede generar APK firmado con proguard habilitado cuando se usa Joda Time
- Cómo ofuscar un apk con Proguard a través de Eclipse?
- Biblioteca "libmaliinstr.so" no encontrado
- ADT R22 - Proguard - No se puede encontrar la clase referenciada
- Aplicación de bloqueo de Android después de proguard
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
- Multidex de Android no compatible con proguard
- Android apk Modo de depuración funciona bien, pero el modo de liberación da demasiadas advertencias
- DexIndexOverflowException sólo al ejecutar pruebas
- Proguard.cfg Falta
- Nombre de clase obfuscated personalizado en proguard
- Al ofuscar con ProGuard, ¿hace -keepattributes SourceFile, LineNumberTable hacer el apk resultante más fácil de ingeniería inversa?
- PerferenceActivity con PreferenceFragment falla en el dispositivo con proguard okay sin proguard
- ¿Cómo hacer que org.apache.http.legacy funcione con ProGuard (azure mobile services)?
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
- Los sabores de los productos Android Studio solo reconocen uno de los dos sabores
- LoadData intenta utilizar datos como url en la vista web