2015-10-13 14 views
61

Le librerie di terze parti che collego alla mia app includono spesso file di risorse che non vengono utilizzati dalla mia applicazione e, in quanto tali, finiscono per gonfiare il mio APK.Come rimuovo le risorse inutilizzate da librerie di terze parti che ho incluso su Android?

Ad esempio, inclusa la libreria dei servizi di Google Play, ma non utilizzando la funzionalità del pulsante di accesso; tutte quelle risorse di immagine e layout finiscono nella mia build finale.

Poiché queste risorse sono incluse in una libreria compilata, come posso rimuoverle dalla mia build?

risposta

69

Questa risposta è riassunta da Removing Unused Resources che spiega come utilizzare minifyEnabled e shrinkResources, che sono coperti in modo più approfondito al Official document page.

E 'un problema comune per le librerie di terze parti per includere le attività che il vostro percorsi di codice applicazione non utilizza, ed è estremamente importante per rimuovere tali attività al fine di produrre piccoli file APK per gli utenti. Per fortuna, l'ultima versione di Gradle e Android Studio fornisce una soluzione per aiutare.

Impostando minifyEnabled e shrinkResources true nella configurazione Gradle, il sistema andrà avanti togliendo risorse inutilizzate dalla vostra applicazione.

android { 
    ... 

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

E 'importante notare che la rimozione di risorse inutilizzate richiede l'minifyEnabled bandiera da impostare. Questo flag (come menzionato in Removing unused code) attiverà ProGuard per rimuovere i percorsi di codice che non vengono utilizzati dall'applicazione. Questo è un passo importante nella rimozione delle risorse dalle librerie incluse. Se i percorsi di codice non vengono rimossi, il compilatore continuerà a credere che le risorse siano referenziate da un codepath esistente e non le rimuoveranno correttamente.

Vale la pena notare che questo è un sistema piuttosto esteso. Ad esempio, guarderà attraverso specifiche costanti di stringa nel codice, oltre a varie risorse res/raw alla ricerca di qualsiasi URL sotto forma di file:///…. da conservare. Andrà anche al punto di analizzare anche i file CSS, HTML e JavaScript.

Ora, ci possono essere casi qui di falsi positivi o falsi negativi. Le risorse potrebbero essere tagliate o mantenute quando si desidera il comportamento contrario. (Per essere onesti, il restringimento delle risorse tende ad essere troppo superficiale ...) Per regolare questo, è possibile aggiungere gli strumenti : mantenere gli strumenti e : scartare gli attributi per definire il comportamento desiderato, per convenzione in un file 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" 
/> 
+0

Per le persone che utilizzano retrolambda - se la risorsa fa riferimento alla classe con espressioni lambda utilizzate in esso - la risorsa verrà rimossa in modo da frenare la build. Quindi, per ora shrinkResources deve essere impostato su false anche per la variante di release – curioushikhov

+0

@Colt McAnlis rimuoverà anche le lingue non utilizzate? possiamo usare resConfigs "en" in defaultConfig per rimuovere le lingue inutilizzate –

8

Se non è possibile utilizzare shrinkResources per alcuni motivi, per lo meno possiamo utilizzare resConfig per rimuovere le lingue che non sono supportate.

defaultConfig { 
    resConfig "en"  
} 
+1

Anche tu usi shrinkResources, aggiungendo resConfig net in basso apk size. –

+0

L'aggiunta di resConfig interromperà gli SPLITS APK ... – slott

Problemi correlati