Quando attivi l'ottimizzazione delle app con le impostazioni predefinite, R8 esegue ottimizzazioni estese per massimizzare i vantaggi in termini di prestazioni. R8 apporta modifiche sostanziali al codice, tra cui la ridenominazione, lo spostamento e la rimozione di classi, campi e metodi. Se noti che queste modifiche causano errori, devi specificare quali parti del codice R8 non deve modificare dichiarandole nelle regole di conservazione.
Scenari comuni che richiedono regole di conservazione
R8 identifica e conserva tutte le chiamate dirette nel codice. Tuttavia, R8 non può vedere gli utilizzi indiretti del codice, il che può causare la rimozione di codice necessario per la tua app, provocando arresti anomali. Utilizza le regole di conservazione per indicare a R8 di conservare il codice utilizzato indirettamente. Di seguito sono riportate alcune situazioni comuni in cui è probabile che tu abbia bisogno di regole di conservazione:
- Codice a cui si accede tramite reflection: R8 non riesce a identificare quando si accede a classi, campi o metodi tramite reflection. Ad esempio, R8 non può identificare un
metodo cercato per nome utilizzando
Class.getDeclaredMethod()
o un' annotazione recuperata conClass.getAnnotation()
. In questi casi, R8 potrebbe rinominare questi metodi e annotazioni o rimuoverli completamente, causando unClassNotFoundException
o unNoSuchMethodException
in fase di runtime. - Codice chiamato da Java Native Interface (JNI): quando il codice nativo (C o C++) chiama un metodo Java o Kotlin oppure il codice Java o Kotlin chiama il codice C++ con JNI, la chiamata si basa su una ricerca dinamica della stringa del nome del metodo. R8 non riesce a vedere la chiamata di metodo dinamica basata su stringhe, quindi le sue ottimizzazioni potrebbero interrompere il codice.
Questo non è un elenco esaustivo degli scenari che richiedono regole di conservazione, ma questi scenari coprono la maggior parte dei casi in cui potresti aver bisogno di regole di conservazione.
Come aggiungere regole di conservazione all'app
Devi aggiungere le regole a un file proguard-rules.pro
che si trova nella directory root del modulo dell'app. Il file potrebbe essere già presente, ma se non lo è, crealo. Per applicare le regole nel file, devi dichiararlo nel file build.gradle.kts
(o build.gradle
) a livello di modulo, come mostrato nel codice seguente:
Kotlin
android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile("proguard-android-optimize.txt"), // File with your custom rules "proguard-rules.pro" ) // ... } } // ... }
Trendy
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile('proguard-android-optimize.txt'), // File with your custom rules. 'proguard-rules.pro' ) // ... } } // ... }
Per impostazione predefinita, il file di build include anche il file proguard-android-optimize.txt
. Questo file include regole necessarie per la maggior parte dei progetti Android, quindi
ti consigliamo di lasciarlo nel file di build. Questo file si basa sul file proguard-common.txt
e ne condivide i contenuti.
Le app più grandi in genere hanno codice in più moduli della libreria. In questi casi, è
spesso meglio inserire le regole di conservazione insieme al codice a cui si applicano all'interno del
modulo della libreria specifico. La differenza fondamentale nel mantenimento delle regole di conservazione per
le librerie risiede nel modo in cui vengono dichiarate all'interno del file
build.gradle.kts
(o build.gradle
) del modulo della libreria. Per saperne di più, consulta la sezione Ottimizzazione per gli autori di librerie.
Aggiungere una regola di conservazione
Quando aggiungi regole di conservazione, puoi includere opzioni globali e definire le tue regole di conservazione.
- Opzioni globali: le opzioni globali sono direttive generali che influiscono sul funzionamento di R8 sull'intero codebase. Per saperne di più, consulta Opzioni globali.
- Regole di conservazione: le regole di conservazione devono essere progettate con attenzione per assicurarti di ottenere il giusto equilibrio tra la massimizzazione dell'ottimizzazione del codice senza danneggiare inavvertitamente la tua app. Per scoprire la sintassi delle tue regole di conservazione, consulta Sintassi delle regole di conservazione.
Mantieni le regole per gli autori delle librerie
Dopo aver esaminato le opzioni globali e la sintassi per le regole di conservazione, consulta la sezione Ottimizzazione per gli autori di librerie per ulteriori dettagli.