KOTLIN FILE
JAVA FILE
KOTLINC
JAVAC CLASS DEX APK
DX
Slide 9
Slide 9 text
CLASS DEX APK
Slide 10
Slide 10 text
CLASS DEX APK
Slide 11
Slide 11 text
CLASS DEX APK
Slide 12
Slide 12 text
CLASS DEX APK
fun hello(): String {
return "Hello"
}
Slide 13
Slide 13 text
CLASS DEX APK
fun hello(): String {
return "Hello"
}
Slide 14
Slide 14 text
CLASS DEX APK
fun hello(): String {
return "Hello"
}
Slide 15
Slide 15 text
CLASS DEX APK
fun hello(): String {
return "Hello"
}
Slide 16
Slide 16 text
CLASS DEX APK
fun hello(): String {
val world = "Hello World"
return world
}
Slide 17
Slide 17 text
CLASS DEX APK
fun hello(): String {
val world = "Hello World"
return world
}
Slide 18
Slide 18 text
CLASS DEX APK
fun hello(): String {
val world = "Hello World"
return world
}
Slide 19
Slide 19 text
CLASS DEX APK
fun hello(): String {
val world = "Hello World"
return world
}
Slide 20
Slide 20 text
CLASS DEX APK
JVM DALVIK-ART
Slide 21
Slide 21 text
CLASS DEX APK
JVM DALVIK-ART
STACK
BASED
REGISTER
BASED
1. POP 20
2. POP 7
3. ADD 20, 7, result
4. PUSH result
ADD R1, R2, R3 ;
Slide 22
Slide 22 text
CLASS DEX APK
fun hello(): String {
return "Hello"
}
Slide 23
Slide 23 text
CLASS DEX APK
fun hello(): String {
return "Hello"
}
Slide 24
Slide 24 text
CLASS DEX APK
fun hello(): String {
return "Hello"
}
http://mariokmk.github.io/programming/2015/03/06/learning-android-bytecode.html
https://source.android.com/devices/tech/dalvik/dalvik-bytecode
Slide 25
Slide 25 text
CLASS A
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
Slide 26
Slide 26 text
CLASS A
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
CLASS B
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
Slide 27
Slide 27 text
CLASS A
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
CLASS B
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
HEADER
String_ids
Type_ids
Proto_ids
Methods
Fields
Classes
Data
DEX
Slide 28
Slide 28 text
CLASS A
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
CLASS B
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
HEADER
String_ids
Type_ids
Proto_ids
Methods
Fields
Classes
Data
DEX
Slide 29
Slide 29 text
CLASS A
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
CLASS B
HEADER
CONSTANT POOL
CLASS
FIELD
ATTRIBUTES
METHODS
HEADER
String_ids
Type_ids
Proto_ids
Methods
Fields
Classes
Data
DEX
Slide 30
Slide 30 text
CLASS DEX APK
Slide 31
Slide 31 text
CLASS DEX APK
Slide 32
Slide 32 text
CLASS DEX APK MIN-SDK = 27
Slide 33
Slide 33 text
CLASS DEX APK MIN-SDK = 14
Slide 34
Slide 34 text
CLASS DEX APK MIN-SDK = 14
Slide 35
Slide 35 text
CLASS DEX APK
65536
MULTIDEXING EVERYWHERE
Slide 36
Slide 36 text
CLASS DEX APK
65536
MULTIDEXING EVERYWHERE
Slide 37
Slide 37 text
CLASS DEX APK
Slide 38
Slide 38 text
CLASS DEX APK
DEX
Slide 39
Slide 39 text
CLASS DEX APK
DALVIK ART
DEX
Slide 40
Slide 40 text
CLASS DEX APK
DALVIK ART
DEXOPT
ODEX
DEX
DEX2OAT
ODEX
VDEX
JIT AOT
JIT
COMPACTDEX
SHRINK OBFUSCATE OPTIMIZE
PROGUARD
R8
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
Slide 91
Slide 91 text
SHRINK OBFUSCATE OPTIMIZE
minification.InterfaceA -> ItfA:
int functionFromIntToInt(int) -> foo
minification.InterfaceB -> ItfB:
int functionFromIntToInt(int) -> bar
PROGUARD
R8
Slide 92
Slide 92 text
SHRINK OBFUSCATE OPTIMIZE
minification.InterfaceA -> ItfA:
int functionFromIntToInt(int) -> foo
minification.InterfaceB -> ItfB:
int functionFromIntToInt(int) -> bar
PROGUARD
R8
Slide 93
Slide 93 text
SHRINK OBFUSCATE OPTIMIZE
minification.InterfaceA -> ItfA:
int functionFromIntToInt(int) -> foo
minification.InterfaceB -> ItfB:
int functionFromIntToInt(int) -> bar
PROGUARD
R8
Slide 94
Slide 94 text
SHRINK OBFUSCATE OPTIMIZE
PROGUARD
R8
Slide 95
Slide 95 text
SHRINK OBFUSCATE OPTIMIZE
PROGUARD
R8
PROGUARD & R8
Remove unused classes/fields/methods
Inline constants
Propagate constants
Remove unused code
Propagate constant fields
Remove write-only fields
Simplify basic container classes
Merge interfaces with single implementations
Propagate constant return values
Inline methods
Outline common code into new methods
PROGUARD
Propagate constant arguments
Simplify plain enum types
Merge classes
Make methods private
Make methods static
Desynchronize methods
Simplify tail recursion
Remove logging code
Merge code
R8
Simplify basic container classes
Outline common code into new methods
Merge Kotlin lambda constructs
Optimize Kotlin lambda constructs https://www.guardsquare.com/en/blog/proguard-and-r8
Slide 96
Slide 96 text
SHRINK OBFUSCATE
OPTIMIZE
R8
Slide 97
Slide 97 text
SHRINK
R8
ABSTRACT METHOD REMOVER
ANNOTATION REMOVER
HORIZONTAL CLASS MERGING
VERTICAL CLASS MERGING
ASSUME VALUES API
OBFUSCATE
OPTIMIZE
Slide 98
Slide 98 text
SHRINK
R8
OBFUSCATE
OPTIMIZE
Slide 99
Slide 99 text
SHRINK
R8
OBFUSCATE
OPTIMIZE
IR
Slide 100
Slide 100 text
SHRINK
R8
OBFUSCATE
OPTIMIZE
IR
INLINING
STATICIZER
PROCESSING
MEMBER
VALUE
STRING
OPTIMIZE
DEVIRTUALI
ZER
JAVA 8
REWRITER
LAMBDA
REWRITER
LAMBDA
MERGER
Slide 101
Slide 101 text
SHRINK
R8
OBFUSCATE
OPTIMIZE
IR
REWRITE LONG COMPARE & REQUIRE NON NULL
SIMPLIFY ARRAY CONSTRUCTOR
SPLIT RANGE INVOKE CONSTANTS
SIMPLIFY IF
REWRITE SWITCH
LOG ARGUMENT TYPES
COLLECT CLASS INIT DEFAULTS
REWRITE THROWABLE ADD AND GET SUPRESS
IDENTIFY RETURN ARGUMENTS
NUMBER CONVERSION REGISTER ALLOCATION
INLINING
STATICIZER
PROCESSING
MEMBER
VALUE
STRING
OPTIMIZE
DEVIRTUALI
ZER
JAVA 8
REWRITER
LAMBDA
REWRITER
LAMBDA
MERGER
Slide 102
Slide 102 text
SHRINK
R8
OBFUSCATE
OPTIMIZE
IR
REWRITE LONG COMPARE & REQUIRE NON NULL
SIMPLIFY ARRAY CONSTRUCTOR
SPLIT RANGE INVOKE CONSTANTS
SIMPLIFY IF
REWRITE SWITCH
LOG ARGUMENT TYPES
COLLECT CLASS INIT DEFAULTS
REWRITE THROWABLE ADD AND GET SUPRESS
IDENTIFY RETURN ARGUMENTS
NUMBER CONVERSION REGISTER ALLOCATION
INLINING
STATICIZER
PROCESSING
MEMBER
VALUE
STRING
OPTIMIZE
DEVIRTUALI
ZER
JAVA 8
REWRITER
LAMBDA
REWRITER
LAMBDA
MERGER
Slide 103
Slide 103 text
SHRINK
R8
OBFUSCATE
OPTIMIZE
D8
Slide 104
Slide 104 text
SHRINK
R8
OBFUSCATE
OPTIMIZE
D8
Slide 105
Slide 105 text
SHRINK OBFUSCATE
OPTIMIZE
R8
Slide 106
Slide 106 text
SHRINK OBFUSCATE
OPTIMIZE
R8
Slide 107
Slide 107 text
R8
Slide 108
Slide 108 text
R8
SHRINK OBFUSCATE
OPTIMIZE
Slide 109
Slide 109 text
Show me numbers II
Slide 110
Slide 110 text
Show me numbers II
Slide 111
Slide 111 text
Use Case: Multi Module
Slide 112
Slide 112 text
Use Case: Multi Module
Gradle 4.9
Android Plugin 3.3.0-alpha08
15 Modules
+ 1000 Classes
R8 Disabled/Enabled
Slide 113
Slide 113 text
Use Case: Multi Module
Gradle 4.9
Android Plugin 3.3.0-alpha08
15 Modules
+ 1000 Classes
R8 Disabled/Enabled
Slide 114
Slide 114 text
Use Case: Multi Module
Gradle 4.9
Android Plugin 3.3.0-alpha08
15 Modules
+ 1000 Classes
R8 Disabled/Enabled
Slide 115
Slide 115 text
Kotlin Client Server assembleRelease
android.enableR8 = false
Slide 116
Slide 116 text
Kotlin Client Server assembleRelease
android.enableR8 = true