Slide 1

Slide 1 text

Android Builds: Simple Recipes for Enhance Developer Productivity Aida Issayeva

Slide 2

Slide 2 text

@aida_isay About me Staff Software Engineer
 Tech Lead for POS Productivity team Google Developer Expert for Android Women TechMakers Ambassador

Slide 3

Slide 3 text

@aida_isay Agenda 01 Toast 02 POS App 03 Growth Pains The problem The results 04 Hardware 05 Gradle Properties 06 Dependencies 07 CI Scripts 08 CI Container Settings & Configuration 09 Recap

Slide 4

Slide 4 text

@aida_isay Toast’s Growth 2015 Customers:
 Restaurants 0 25,000 50,000 75,000 100,000 1,000

Slide 5

Slide 5 text

@aida_isay Toast’s Growth 2023 Customers:
 Restaurants 0 25,000 50,000 75,000 100,000 100,000 2023 Customers:
 Restaurants 0 25,000 50,000 75,000 100,000 100,000

Slide 6

Slide 6 text

@aida_isay POS App’s Current State 141 contributors 326 modules 2M+ lines of code ~150 avg remote builds/day

Slide 7

Slide 7 text

@aida_isay POS App’s Build Tooling State Gradle Build System Git Version Control Github Git hosting platform Jenkins CI Server

Slide 8

Slide 8 text

@aida_isay POS App’s Growth 2015 Features 0 250 500 750 1000 50 2015 Contributors 0 40 80 120 160 10 2015 Number of Builds 0 7500 15000 22500 30000 2000

Slide 9

Slide 9 text

@aida_isay POS App’s Growth 2015 Features 0 250 500 750 1000 50 2023 Contributors 0 40 80 120 160 141 2023 Contributors 0 40 80 120 160 141 2015 Number of Builds 0 7500 15000 22500 30000 2000

Slide 10

Slide 10 text

@aida_isay POS App’s Growth 2023 Features 0 250 500 750 1000 1000 2023 Features 0 250 500 750 1000 1000 2023 Contributors 0 40 80 120 160 141 2023 Contributors 0 40 80 120 160 141 2015 Number of Builds 0 7500 15000 22500 30000 2000

Slide 11

Slide 11 text

@aida_isay POS App’s Growth 2023 Features 0 250 500 750 1000 1000 2023 Features 0 250 500 750 1000 1000 2023 Contributors 0 40 80 120 160 141 2023 Contributors 0 40 80 120 160 141 2023 Number of Builds 0 7500 15000 22500 30000 26000 2023 Number of Builds 0 7500 15000 22500 30000 26000

Slide 12

Slide 12 text

@aida_isay The problem Build Time Uptick Minutes 0 40 80 120 160 Q1 2022 Q2 2022 Q3 2022 Q4 2022 Q1 2023 Q2 2023 77 74 69 56 51 48 75.76 72 67 52 45 42 P50 Build Time P95 Build Time

Slide 13

Slide 13 text

@aida_isay The problem Build Time Uptick Minutes 0 40 80 120 160 Q1 2022 Q2 2022 Q3 2022 Q4 2022 Q1 2023 Q2 2023 77 74 69 56 51 48 75.76 72 67 52 45 42 P50 Build Time P95 Build Time +44%

Slide 14

Slide 14 text

@aida_isay Why care about this problem? Developers Product Builds

Slide 15

Slide 15 text

@aida_isay Why care about this problem? Customers Business

Slide 16

Slide 16 text

@aida_isay Build Efficiency Project Results Q3 2023 - Q1 2024 Minutes 0 17.5 35 52.5 70 H1 2023 H2 2023 Q1 2024 P50 Build Time

Slide 17

Slide 17 text

@aida_isay Build Efficiency Project Results Q3 2023 - Q1 2024 Minutes 0 17.5 35 52.5 70 H1 2023 H2 2023 Q1 2024 P50 Build Time -61%

Slide 18

Slide 18 text

@aida_isay How we did it?

Slide 19

Slide 19 text

@aida_isay How we did it? By identifying and fixing low-hanging fruits

Slide 20

Slide 20 text

@aida_isay –Someone on internet “You can’t fix what you can’t see”

Slide 21

Slide 21 text

@aida_isay Develocity https://gradle.com/gradle-enterprise-solutions/build-scan-root-cause-analysis-data/

Slide 22

Slide 22 text

@aida_isay 1. Hardware ❌ Old devices Local builds Remote builds Longer build times

Slide 23

Slide 23 text

@aida_isay 1. Hardware ✅ New devices after benchmarking Local builds Old devices Rem ote builds More CPU and RAM

Slide 24

Slide 24 text

@aida_isay 1. Hardware ✅ New devices Costs More CPU + RAM

Slide 25

Slide 25 text

@aida_isay 2. Gradle Properties

Slide 26

Slide 26 text

@aida_isay 2a. Parallize Gradle Tasks ✅ org.gradle.parallel=true

Slide 27

Slide 27 text

@aida_isay 2b. Cache Gradle Tasks ✅ org.gradle.caching=true

Slide 28

Slide 28 text

@aida_isay 2c. Manage Gradle Workers ✅ org.gradle.workers.max=8* * Total Available CPU Cores / 1.5~2

Slide 29

Slide 29 text

@aida_isay 2d. Manage Memory ✅ org.gradle.jvmargs=-Xmx10g Max Heap Size

Slide 30

Slide 30 text

@aida_isay 2d. Manage Memory ✅ Xmx Metaspace and other native memory JVM Memory Hungriest Gradle Task 70% - 80% 100%

Slide 31

Slide 31 text

@aida_isay 2d. Manage Memory ✅ org.gradle.jvmargs=-Xmx10g -Xms10g Max Heap Initial Heap

Slide 32

Slide 32 text

@aida_isay 2d. Manage Memory ✅ kotlin.daemon.jvmargs=-Xmx8g -Xms8g

Slide 33

Slide 33 text

@aida_isay 3. Dependencies ❌

Slide 34

Slide 34 text

@aida_isay 3. Dependencies ❌ Unused Dependencies

Slide 35

Slide 35 text

@aida_isay 3. Dependencies ❌ Unused Dependencies 1. Time • Dependency Resolution • Configuration • Download 2. Size • Classpath

Slide 36

Slide 36 text

@aida_isay 3. Dependencies ❌ Unused Dependencies Outdated Dependencies 1. Time • Dependency Resolution • Configuration • Download 2. Size • Classpath

Slide 37

Slide 37 text

@aida_isay 3. Dependencies ❌ Unused Dependencies Outdated Dependencies 1. Time • Dependency Resolution • Configuration • Download 2. Size • Classpath 1. Time • Dependency Resolution • Inefficient build processes • Deprecated Features 2. Compatibility Issues 3. Security Patches 4. Maintainer Support

Slide 38

Slide 38 text

@aida_isay 3. Dependencies ✅ Unused Dependencies Outdated Dependencies

Slide 39

Slide 39 text

@aida_isay 3. Dependencies ✅ Unused Dependencies Outdated Dependencies Use Plugins

Slide 40

Slide 40 text

@aida_isay 3. Dependencies ✅ Unused Dependencies Outdated Dependencies Use Plugins 1. Dependency Analysis Gradle Plugin - unused & transitive dependencies 2. Dependabot - automated dependency updates in Github 3. RenovateBot - automated dependency updates in Github

Slide 41

Slide 41 text

@aida_isay 3. Dependencies ✅ New version Contribution to 
 Performance & Size Benchmark first

Slide 42

Slide 42 text

@aida_isay 4. CI Scripts ❌ • Serial Execution of CI Stages • Staggered Gradle tasks across different stages • Timeouts on different plugin responses https://devops.com/how-to-use-the-jenkins-pipelines/

Slide 43

Slide 43 text

@aida_isay 4. CI Scripts ✅ • Parallelize CI Stages • Combine Gradle tasks • Investigate and reduce timeouts https://www.jenkins.io/blog/2017/09/25/declarative-1/

Slide 44

Slide 44 text

@aida_isay 5. CI Container Settings & Config ❌ https://toolsqa.com/jenkins/jenkins-configuration/

Slide 45

Slide 45 text

@aida_isay 5. CI Container Settings & Config ❌ Instance Age https://toolsqa.com/jenkins/jenkins-configuration/

Slide 46

Slide 46 text

@aida_isay 5. CI Container Settings & Config ❌ Instance Age Agents Count https://toolsqa.com/jenkins/jenkins-configuration/

Slide 47

Slide 47 text

@aida_isay 5. CI Container Settings & Config ❌ Instance Age Agents Count Agent Instantiation https://toolsqa.com/jenkins/jenkins-configuration/

Slide 48

Slide 48 text

@aida_isay 5. CI Container Settings & Config ❌ Instance Age Agents Count Agent Instantiation Build Queue Congestion https://toolsqa.com/jenkins/jenkins-configuration/

Slide 49

Slide 49 text

@aida_isay 5. CI Container Settings & Config ❌ Instance Age Agents Count Agent Instantiation Build Queue Congestion Build Trigger on Unnecessary Events https://toolsqa.com/jenkins/jenkins-configuration/

Slide 50

Slide 50 text

@aida_isay 5. CI Container Settings & Config ✅ Instance Age Agents Count Agent Instantiation Build Queue Congestion Build Trigger on Unnecessary Events

Slide 51

Slide 51 text

@aida_isay 5. CI Container Settings & Config ✅ Instance Age Agents Count Agent Instantiation Build Queue Congestion Build Trigger on Unnecessary Events Migrate to newer instance

Slide 52

Slide 52 text

@aida_isay 5. CI Container Settings & Config ✅ Instance Age Agents Count Agent Instantiation Build Queue Congestion Build Trigger on Unnecessary Events Migrate to newer instance Allocate high number of agents

Slide 53

Slide 53 text

@aida_isay 5. CI Container Settings & Config ✅ Instance Age Agents Count Agent Instantiation Build Queue Congestion Build Trigger on Unnecessary Events Migrate to newer instance Allocate high number of agents Keep agents warm

Slide 54

Slide 54 text

@aida_isay 5. CI Container Settings & Config ✅ Instance Age Agents Count Agent Instantiation Build Queue Congestion Build Trigger on Unnecessary Events Migrate to newer instance Allocate high number of agents Keep agents warm Cancel ongoing builds if 
 new one is pushed

Slide 55

Slide 55 text

@aida_isay 5. CI Container Settings & Config ✅ Instance Age Agents Count Agent Instantiation Build Queue Congestion Build Trigger on Unnecessary Events Migrate to newer instance Allocate high number of agents Keep agents warm Cancel ongoing builds if 
 new one is pushed Revisit plugin events and 
 don’t trigger builds on 
 PR metadata change

Slide 56

Slide 56 text

@aida_isay Recap •enable parallel •enable cache •optimize memory config •manage gradle workers •upgrade hardware •optimize container settings •fine-tune plugin events •improve CI scripts Generated by Canva AI

Slide 57

Slide 57 text

@aida_isay Recap Developers + Product 0 17.5 35 52.5 70 H1 2023 Q1 2024 27 68 P50 Build Time

Slide 58

Slide 58 text

@aida_isay On the horizon Modularization…true modularization

Slide 59

Slide 59 text

@aida_isay Thank you

Slide 60

Slide 60 text

Android Builds: Simple Recipes for Enhance Developer Productivity Aida Issayeva

Slide 61

Slide 61 text

@aida_isay Resources • Setting Kotlin Daemon’s JVM args • Java Memory model specification • Introduction to Java's Memory model • Essential Tips to minimize Gradle Build Time • From laptops to advanced CI • Managing nodes in Jenkins Generated by Canva AI