Carlos Fernando Arboleda Garces
Ingeniero en sistemas, Co-fundador y CTO de La Manicurista, Co-fundador de Mobile Lab, Co-organizador y speaker del GDG Cali, Mentor en la escuela DevHack
Usando ProGuard/R8 y otros mecanismos para disminuir el tamaño e incrementar la velocidad de ejecución de tu aplicación Android
Carlos Fernando Arboleda Garcés
Los recursos de los dispositivos móviles son limitados
Nuestra app compite contra otras cientos de apps
Cada vez usamos mas librerías de terceros
La gama de dispositivos en Android es muy grande
Con Android App Bundle se descarga necesario para la aplicación funcione solo en ese dispositivo.
Administrado por Google
Personalizar las funcionalidades entregadas por País o tipo de dispositivo
Instalación de módulos por demanda
Samsung Android 8.1
Xiaomi Android 9
ProGuard es una mítica herramienta que reduce el código, detectando y eliminando las clases, campos, métodos, paquetes y atributos no utilizados (incluidas las librerías de tercero).
R8 es básicamente la evolución de ProGuard, fue anunciado a finales del 2018
DEX
Jack & Jill
D8
R8
Con ProGuard y R8 se reduce el tamaño del bytecode aproximadamente un 20 o 50% y mejora el rendimiento un 20%.
android {
...
buildTypes {
debug {
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true//Solo con este flag activamos ProGuard
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//App build.gradle
Activar ProGuard
...
android.enableR8=true
//Project gradle.properties
Activar R8
Con cada compilación, ProGuard crea los siguientes archivos:
Estos archivos se guardan en:
<module-name>/build/outputs/mapping/release/
######## CUSTOM RULES FOR MY CODE ########
# Application classes that will be serialized/deserialized over Gson
-keep class co.devhack.musicapp.domain.model.** { <fields>; }
######## CUSTOM RULES FOR MY CODE ########
######## RETROFIT ########
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod
# Retrofit does reflection on method and parameter annotations.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@retrofit2.http.* <methods>;
}
# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**
# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit
# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions
######## RETROFIT ########
# proguad-rules.pro
minifyEnabled false
useProguard false
minifyEnabled true
useProguard false
minifyEnabled true
useProguard true
private void calculatePayroll(specialList, employeeGroup) {
Employee employee;
while(employeeGroup.hasMore()) {
employee = employeeGroup.getNext(true);
employee.updateSalary();
distributeCheck(employee);
}
}
private void a(a, b) {
C c;
while(b.a()) {
c = b.ab(true);
c.a();
d(c);
}
}
Código original
Código ofuscado
By Carlos Fernando Arboleda Garces
Sabias que puedes inyectarle esteroides a tu aplicación Android para que se ejecute más rápido, sea mas liviana y a demás tenga un código muchos mas seguro? Al final de esta presentación sabrás como hacerlo...
Ingeniero en sistemas, Co-fundador y CTO de La Manicurista, Co-fundador de Mobile Lab, Co-organizador y speaker del GDG Cali, Mentor en la escuela DevHack