Slide 1

Slide 1 text

DEXS, R8 & 3.3 @INYAKI_MWC

Slide 2

Slide 2 text

DECKS, EFX & 909

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

D8 R8

Slide 5

Slide 5 text

KOTLIN FILE JAVA FILE

Slide 6

Slide 6 text

KOTLIN FILE JAVA FILE KOTLINC JAVAC CLASS

Slide 7

Slide 7 text

KOTLIN FILE JAVA FILE KOTLINC JAVAC CLASS DEX DX

Slide 8

Slide 8 text

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

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

D8

Slide 46

Slide 46 text

Android Gradle Plugin < 3.0

Slide 47

Slide 47 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS CLASSES.DEX Android Gradle Plugin < 3.0

Slide 48

Slide 48 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS CLASSES.DEX Android Gradle Plugin < 3.0

Slide 49

Slide 49 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS CLASSES.DEX Android Gradle Plugin < 3.0

Slide 50

Slide 50 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS CLASSES.DEX Android Gradle Plugin < 3.0

Slide 51

Slide 51 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS CLASSES.DEX Android Gradle Plugin >= 3.0

Slide 52

Slide 52 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS CLASSES.DEX Android Gradle Plugin >= 3.0

Slide 53

Slide 53 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS CLASSES.DEX Android Gradle Plugin >= 3.0

Slide 54

Slide 54 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS Android Gradle Plugin >= 3.0 A.DEX B.DEX

Slide 55

Slide 55 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS Android Gradle Plugin >= 3.0 A.DEX B.DEX

Slide 56

Slide 56 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS Android Gradle Plugin >= 3.0 A.DEX B.DEX DX MERGING CLASSES.DEX

Slide 57

Slide 57 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS Android Gradle Plugin >= 3.0 A.DEX B.DEX DX MERGING CLASSES.DEX

Slide 58

Slide 58 text

A.JAVA JAVAC A.CLASS DX B.JAVA B.CLASS Android Gradle Plugin >= 3.1 A.DEX B.DEX DX MERGING CLASSES.DEX D8

Slide 59

Slide 59 text

Desugaring .subscribe( this::handleSupportFeatureGet, error -> log.e(error, "Unable to updateSupportFeature”) )

Slide 60

Slide 60 text

Desugaring A.JAVA JAVAC A.CLASS 8 DX CLASSES.DEX DESUGARING A.CLASS 6-7 .subscribe( this::handleSupportFeatureGet, error -> log.e(error, "Unable to updateSupportFeature”) )

Slide 61

Slide 61 text

Desugaring A.JAVA JAVAC A.CLASS 8 DX CLASSES.DEX DESUGARING A.CLASS 6-7

Slide 62

Slide 62 text

D8 A.JAVA JAVAC A.CLASS 8 DX CLASSES.DEX DESUGARING A.CLASS 6-7 D8

Slide 63

Slide 63 text

Show me numbers

Slide 64

Slide 64 text

Show me numbers

Slide 65

Slide 65 text

56% MainDexFile Debug 75% MainDexFile Release 10% time Debug Builds

Slide 66

Slide 66 text

https://github.com/cdsap/Kotlin-Client-Server.git Gradle Profiler + Talaiot https://github.com/gradle/gradle-profiler https://github.com/cdsap/Talaiot

Slide 67

Slide 67 text

https://github.com/cdsap/Kotlin-Client-Server.git Gradle Profiler + Talaiot https://github.com/gradle/gradle-profiler https://github.com/cdsap/Talaiot

Slide 68

Slide 68 text

android.enableD8=true android.enableD8=false

Slide 69

Slide 69 text

android.enableD8=true android.enableD8=false

Slide 70

Slide 70 text

android.enableD8=false

Slide 71

Slide 71 text

android.enableD8=true android.enableD8=true

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

ivillar$ java -jar d8.jar --debug MainActivity.class

Slide 75

Slide 75 text

ivillar$ java -jar d8.jar --debug MainActivity.class ivillar$ dexdump classes.dex

Slide 76

Slide 76 text

Processing 'classes.dex'... Opened 'classes.dex', DEX version '035' Class #0 - Class descriptor : 'Lcom/example/myapplication/MainActivity;' Access flags : 0x0011 (PUBLIC FINAL) Superclass : 'Landroid/support/v7/app/AppCompatActivity;' Interfaces - Static fields - Direct methods - #0 : (in Lcom/example/myapplication/MainActivity;) name : '' type : '()V' access : 0x10001 (PUBLIC CONSTRUCTOR) registers : 1 ins : 1 outs : 1 insns size : 4 16-bit code units positions : 0x0000 line=6 locals : 0x0000 - 0x0004 reg=0 this Lcom/example/myapplication/MainActivity; Virtual methods - #0 : (in Lcom/example/myapplication/MainActivity;) name : 'onCreate' type : '(Landroid/os/Bundle;)V' access : 0x0004 (PROTECTED) registers : 3 ins : 2 outs : 2 insns size : 10 16-bit code units positions : 0x0000 line=9 0x0003 line=10 0x0009 line=11 locals : 0x0000 - 0x000a reg=1 this Lcom/example/myapplication/MainActivity; 0x0000 - 0x000a reg=2 savedInstanceState Landroid/os/Bundle;

Slide 77

Slide 77 text

3.1.X 3.2.X 3.3.X 3.0.X

Slide 78

Slide 78 text

3.1.X 3.2.X 3.3.X 3.0.X ENABLED ENABLED ENABLED DISABLED

Slide 79

Slide 79 text

3.1.X 3.2.X 3.3.X 3.0.X ENABLED ENABLED ENABLED DISABLED 1st Phase: D8/DX - 6 months approx 2nd Phase: D8/DX(deprecated) - 1 year approx 3rd Phase: DX Removed

Slide 80

Slide 80 text

R8

Slide 81

Slide 81 text

PROGUARD

Slide 82

Slide 82 text

SHRINK OBFUSCATE OPTIMIZE PROGUARD

Slide 83

Slide 83 text

A.JAVA JAVAC PROGUARD CLASSES.DEX AO.CLASS A.CLASS DX SHRINK OBFUSCATE OPTIMIZE PROGUARD

Slide 84

Slide 84 text

A.JAVA JAVAC PROGUARD CLASSES.DEX AO.CLASS A.CLASS D8 SHRINK OBFUSCATE OPTIMIZE PROGUARD DX

Slide 85

Slide 85 text

A.JAVA JAVAC PROGUARD CLASSES.DEX AO.CLASS A.CLASS D8 SHRINK OBFUSCATE OPTIMIZE PROGUARD Transformation API

Slide 86

Slide 86 text

No content

Slide 87

Slide 87 text

A.JAVA JAVAC PROGUARD CLASSES.DEX AO.CLASS A.CLASS D8 SHRINK OBFUSCATE OPTIMIZE R8

Slide 88

Slide 88 text

A.JAVA JAVAC CLASSES.DEX A.CLASS SHRINK OBFUSCATE OPTIMIZE R8

Slide 89

Slide 89 text

SHRINK OBFUSCATE OPTIMIZE PROGUARD R8

Slide 90

Slide 90 text

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

Slide 117

Slide 117 text

android.enableR8 = true

Slide 118

Slide 118 text

classpath "com.android.tools:r8:$versions.r8" android.enableR8 = true

Slide 119

Slide 119 text

Open Source

Slide 120

Slide 120 text

Test $ git clone https://r8.googlesource.com/r8 $ tools/gradle.py d8 r8 $ java -jar d8.jar —debug —output out HelloWorld.class $ java -jar r8.jar —output out --pg-conf proguard.cfg classes

Slide 121

Slide 121 text

No content

Slide 122

Slide 122 text

@INYAKI_MWC