web-dev-qa-db-fra.com

Comment supprimer les ressources inutilisées des bibliothèques tierces que j'ai incluses sur Android?

Les bibliothèques tierces que je relie à mon application incluent souvent des fichiers de ressources qui ne sont pas utilisés par mon application et, à ce titre, finissent par gonfler mon APK.

Par exemple, y compris la bibliothèque de services Google Play, mais sans utiliser la fonctionnalité du bouton de connexion; toutes ces ressources d'image et de mise en page se retrouvent dans ma version finale.

Étant donné que ces ressources sont incluses dans une bibliothèque compilée, comment puis-je les supprimer de ma génération?

61
Colt McAnlis

Cette réponse est résumée dans Suppression des ressources inutilisées qui explique comment utiliser minifyEnabled et shrinkResources, qui sont traités plus en détail sur page du document officiel .

Il est courant pour les bibliothèques tierces d'inclure des ressources que votre chemin de code d'application n'utilise pas, et il est extrêmement important de supprimer ces ressources afin de produire des fichiers APK plus petits pour vos utilisateurs. Heureusement, la dernière version de Gradle et Android Studio fournit une solution pour vous aider.

En définissant minifyEnabled et shrinkResources sur true dans votre configuration Gradle, le système ira de l'avant en supprimant les ressources inutilisées de votre application.

Android {
    ...

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'),
                         'proguard-rules.pro'
        }
    }
}

Il est important de noter que la suppression des ressources inutilisées nécessite la définition de l'indicateur minifyEnabled . Cet indicateur (comme mentionné dans Suppression du code inutilisé ) déclenchera ProGuard pour supprimer les chemins de code qui ne sont pas utilisés par votre application. Il s'agit d'une étape importante dans la suppression des ressources des bibliothèques incluses. Si les chemins de code ne sont pas supprimés, le compilateur continuera de croire que les ressources sont référencées par un chemin de code existant et ne les supprimera pas correctement.

Il convient de noter qu'il s'agit d'un système assez étendu. Par exemple, il recherchera des constantes de chaîne spécifiques dans votre code, ainsi que diverses ressources res/raw à la recherche d'URL sous la forme de file:///…. garder. Cela ira même jusqu'à analyser les fichiers CSS, HTML et JavaScript.

Maintenant, il peut y avoir des cas de faux positifs ou de faux négatifs. Les actifs peuvent être coupés ou conservés lorsque vous souhaitez le comportement opposé. (Pour être juste, la réduction des ressources a tendance à être exagérée ...) Pour ajuster cela, vous pouvez ajouter les outils : garder et outils: supprimer les attributs pour définir le comportement souhaité, par convention dans un res/raw/keep.xml fichier.

<resources xmlns:tools="http://schemas.Android.com/tools"
     tools:keep= "@layout/l_used*_c,  @layout/l_used_b*"
     tools:discard="@layout/unused2"
/>
71
Colt McAnlis

Si vous ne pouvez pas utiliser shrinkResources pour certaines raisons, nous pouvons au moins utiliser resConfig pour supprimer les langues non prises en charge.

defaultConfig {
    resConfig "en"     
}
8