¿Cómo puedo eliminar los recursos no utilizados de las bibliotecas de terceros que he incluido en Android?
Las bibliotecas de terceros que enlazo en mi aplicación a menudo incluyen archivos de recursos que no están siendo utilizados por mi aplicación y, como tal, terminan hinchando mi APK.
Por ejemplo, incluye la biblioteca de servicios de Google Play, pero no utiliza la funcionalidad del botón de inicio de sesión; Todos esos recursos de la imagen y de la disposición terminan para arriba en mi estructura final.
- Sqlite3 tabla con límite máximo de líneas (por elección) eficiencia
- HttpUrlConnection de Android: Publicar Multipart
- ¿Cuál es la mejor alternativa para las preferencias compartidas en Android?
- Vista de reciclador - cambia el tamaño de la vista de elemento mientras se desplaza (para efecto de carrusel)
- La aplicación de Android comienza muy lentamente en el primer lanzamiento, pero normalmente en los próximos lanzamientos
Dado que estos recursos se incluyen en una biblioteca compilada, ¿cómo puedo eliminarlos de mi compilación?
- ¿Es crucial para el rendimiento tener ViewHolder como estática en un patrón de ViewHolder?
- El desplazamiento de grandes listas de adaptadores basados en Cursor es más rápido que las listas mucho más pequeñas de adaptadores en memoria
- ¿Estoy bebiendo la plataforma / hardware?
- ¿Por qué usar Fragmentos?
- Android: ¿Qué hacer si el rendimiento de ListView sigue siendo insuficiente?
- Mi aplicación cordova webview es realmente más lento que en el navegador android en el mismo teléfono
- ¿Por qué Android Studio se está ralentizando al editar el archivo xml o cambiar el diseño?
- Cómo deslizar imágenes en ViewFlipper o ViewPager
Esta respuesta se resume en Eliminar recursos no utilizados, que explica cómo utilizar minifyEnabled y shrinkResources, que se tratan con mayor profundidad en la página del documento oficial .
Es un problema común que las bibliotecas de terceros incluyan los recursos que su aplicación codepath no utiliza, y es sumamente importante eliminar esos activos para producir archivos APK más pequeños para sus usuarios. Afortunadamente, la última versión de Gradle y Android Studio proporciona una solución para ayudar.
Al establecer minifyEnabled y shrinkResources en true en su configuración de Gradle, el sistema saldrá eliminando recursos no utilizados de su aplicación.
android { ... buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
Es importante tener en cuenta que la eliminación de los recursos no utilizados requiere que se establezca el indicador minifyEnabled . Este indicador (como se menciona en Eliminar código no utilizado ) disparará a ProGuard para quitar las rutas de código que su aplicación no esté utilizando. Este es un paso importante en la eliminación de los recursos de las bibliotecas incluidas. Si las rutas de código no se eliminan, el compilador seguirá creyendo que los recursos son referenciados por un path de código existente y no los eliminará correctamente.
Vale la pena señalar que este es un sistema bastante extenso. Por ejemplo, buscará a través de constantes de cadena específicas en su código, así como varios recursos res / raw buscando cualquier URL en forma de file:///….
mantener. Incluso llegará incluso a analizar los archivos CSS, HTML y JavaScript.
Ahora, puede haber casos aquí de falsos positivos o falsos negativos. Los activos podrían ser cortados, o mantenerse, cuando se desea el comportamiento contrario. (Para ser justos, la reducción de recursos tiende a ser exagerada …) Para ajustar esto, puede agregar las herramientas: keep y tools: descartar atributos para definir el comportamiento deseado, por convención en un archivo res/raw/keep.xml
.
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep= "@layout/l_used*_c, @layout/l_used_b*" tools:discard="@layout/unused2" />
Si no puede usar shrinkResources
por algunas razones, al menos podemos usar resConfig
para eliminar idiomas que no resConfig
.
defaultConfig { resConfig "en" }