Quando abiliti l'ottimizzazione dell'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 le parti del codice che 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 del codice necessario per l'app, causando 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 è in grado di identificare quando si accede a classi, campi o metodi con reflection. Ad esempio, R8 non è in grado di 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 un'eccezioneClassNotFoundExceptionoNoSuchMethodExceptionin 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 di stringhe dinamiche del nome del metodo. R8 non è in grado di vedere la chiamata al metodo basata su stringhe dinamiche, pertanto 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.
Se il tuo codice utilizza reflection o viene chiamato da JNI, puoi annotare quel codice con Jetpack Keep annotazioni anziché scrivere manualmente le regole di conservazione. Il relativo plug-in Gradle genera le regole di conservazione dalle annotazioni in fase di compilazione.
Come aggiungere regole di conservazione all'app
La configurazione delle regole di conservazione dipende dalla versione di AGP che utilizzi.
In genere, le app più grandi hanno codice in più moduli di libreria. In questi casi, spesso è meglio inserire le regole di conservazione insieme al codice a cui si applicano all'interno del modulo di libreria specifico. La differenza fondamentale nella gestione delle regole di conservazione per le
librerie risiede nel modo in cui dichiari queste regole all'interno del file del modulo di libreria
build.gradle.kts (o build.gradle). Per saperne di più, consulta la sezione Ottimizzazione per gli autori
di librerie.
Per le versioni di AGP 9.3 e successive
Aggiungi le regole a un file con il suffisso .keep nella
src/<variant>/keepRules directory. Ad esempio, src/main/keepRules/custom-rules.keep. Tieni presente che l'utilizzo del DSL aggiornato per AGP 9.3 e versioni successive consente l'ottimizzazione sia del codice sia delle risorse e non richiede di definire esplicitamente il file di regole di conservazione Android predefinito (proguard-android-optimize.txt), perché è incluso per impostazione predefinita, a meno che non venga omesso esplicitamente.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Alla moda
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Omettere le regole di conservazione predefinite della piattaforma Android (avanzate)
AGP fornisce un insieme di regole predefinite della piattaforma Android. Per omettere queste regole dalla configurazione del progetto e gestire autonomamente tutte le regole di conservazione, imposta optimization.keepRules.includeDefault su false.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
Alla moda
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
DSL legacy per le versioni di AGP precedenti alla 9.3
Aggiungi 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 dichiarare il file nel file a livello di modulo
build.gradle.kts (o build.gradle).
Per impostazione predefinita, il file di build include anche il file proguard-android-optimize.txt. Questo file include le regole necessarie per la maggior parte dei progetti Android, quindi dovresti lasciarlo nel file di build. Questo file si basa sul file proguard-common.txt e ne condivide i
contenuti.
DSL legacy (Kotlin)
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
// Default file with default optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
}
}
}
DSL legacy (Groovy)
android {
buildTypes {
release {
minifyEnabled = true
shrinkResources = true
// Default file with default optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
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 modo in cui R8 opera sull'intero codebase. Per saperne di più, consulta la sezione Opzioni globali.
Regole di conservazione: le regole di conservazione devono essere progettate con attenzione per garantire il giusto equilibrio tra la massimizzazione dell'ottimizzazione del codice e l'interruzione involontaria dell'app. Per scoprire come scrivere regole di conservazione, consulta la sezione Aggiungere regole di conservazione.
Regole di conservazione per gli autori di librerie
Dopo aver appreso le opzioni globali e la sintassi per le regole di conservazione, consulta la sezione Ottimizzazione per gli autori di librerie per ulteriori dettagli.