60
Anton Nurdin T Senior Software Engineer, Xendit anton46.com DEEP UNDERSTANDING ABOUT

ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Embed Size (px)

Citation preview

Page 1: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Anton Nurdin TSenior Software Engineer, Xendit

anton46.com

DEEP UNDERSTANDING ABOUT

Page 2: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

What is Gradle?

Page 3: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Android Build System

Page 4: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Android Build System

antMaven

Gradle

SBT

buck

Page 5: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Process

Page 6: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah
Page 7: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Multi-Language

Resource/Code Generation

Platform Diversity

Page 8: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Why Gradle?1. Powerful Build System

- Declarative, Flexible- Imperative Customization - Tooling API

2. Build System Toolkit- Plugins create own DSL, APIs, IDE integration

3. Free/Open Source

Page 9: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

StructureSettings File

- settings.gradle

Page 10: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

StructureSettings File

- settings.gradle

Top-level Build File

Page 11: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Top-level Build File

buildscript { repositories { jcenter() }

dependencies { classpath 'com.android.tools.build:gradle:2.0.0' } }

allprojects { repositories { jcenter() } }

build.gradle

Page 12: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

StructureSettings File

- settings.gradle

Top-level Build File

Page 13: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

StructureSettings File

- settings.gradle

Top-level Build File

Module-level Build File

Page 14: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

apply plugin: 'com.android.application'

android { compileSdkVersion 23 buildToolsVersion "23.0.3"

defaultConfig { ... }

buildTypes { ... }

productFlavors { ... } }

dependencies { ... }

Module-level Build File

build.gradle

Page 15: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Gradle Tasksassemble

check

build

clean

assemble + check

assembleDebug + assembleRelease

connectedCheckdeviceCheck

Page 16: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

COSTUMIZATION

Page 17: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Basic Customization

android { compileSdkVersion 23 buildToolsVersion "23.0.3"

defaultConfig { minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } }

build.gradle

Page 18: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Basic Customization

def getVersionCode() { def code = ... return code; }

android { defaultConfig { versionCode getVersionCode()

... } }

build.gradle

Page 19: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Basic Customizationandroid { defaultConfig {

applicationId “com.example.app” minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0"

applicationVariants.all { variant -> variant.outputs.each { output -> def file = output.outputFile def fileName = file.name.replace(".apk", "-v" + versionName + "-c" + versionCode + ".apk") output.outputFile = new File(file.parentFile, fileName) } } } }

build.gradle

Page 20: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Basic Customization

app-debug-v1.0-c1.apk

app-release-v1.0-c1.apk

Page 21: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Types- Build / Packaging customization

• Debuggable flag • ProGuard • Signing Configuration • Source / Resource Overlay\

- Debug and release prebuilt

Page 22: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Types

android { buildTypes { debug { applicationIdSuffix '.debug' versionNameSuffix '-DEBUG' } beta { applicationIdSuffix '.beta' versionNameSuffix '-BETA' } } }

build.gradle

Page 23: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Types : Source Folder

src/main/AndroidManifest.xml src/main/java src/main/resource src/main/res src/main/assets src/main/aidl src/main/rs src/main/jni

src/debug/... src/release/... src/beta/...

src/androidTest/java src/androidTest/resource src/androidTest/res src/androidTest/assets src/androidTest/aidl src/androidTest/rs src/androidTest/jni

Page 24: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Gradle Tasksassemble

check

build

clean

assemble + check

assembleDebug + assembleRelease + assembleBeta

connectedCheckdeviceCheck

Page 25: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Signing Configuration

\

android { signingConfigs { release { storeFile file('<name>.keystore') keyAlias 'keyAlias' keyPassword 'keyPassword' storePassword 'storePassword' } } }

build.gradle

Page 26: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Debuggable Release Builds

\

android { signingConfigs { debugRelease.intiWith(buildTypes.release) debugRelease { debuggable true applicationIdSuffix '.debugrelease' signingConfig signingConfigs.debug } } }

build.gradle

Page 27: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

DEPENDENCIES

Page 28: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Dependency Scope: Java Projects

compile

\

runtime

testCompiletestRuntime

Page 29: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Dependency Scope: Android Projects

compile

\

runtime

testCompiletestRuntime

compile

package

androidTestCompileandroidTestPackage

Page 30: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Local Dependencies

\

android { ... }

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }

build.gradle

Page 31: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Remote Dependencies

\

repositories { jcenter() }

android { ... }

dependencies { compile 'com.android.support:appcompat-v7:23.2.1'

}

build.gradle

Page 32: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Multi-Project Setup

\

settings.gradle

include ':app' include ':libraries:lib1' include ':libraries:lib2'

MyProject/ | settings.gradle + app/ | build.gradle

+ libraries/ + lib1/ | build.gradle

+ lib2/ | build.gradle

Page 33: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Project Dependencies

\

android { ... }

dependencies { compile project(‘:libraries:lib1’)

}

build.gradle

Page 34: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Android Library Project

\

apply plugin: 'com.android.library'

android { compileSdkVersion 23 buildToolsVersion '23.0.1' }

build.gradle

Page 35: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Android Library- Binary Bundle (.aar)

• Uploadable to repositories

\- Support for

• assets • Proguard rules • Custom Lint rules • . . .

Page 36: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

BUILD VARIANTS

Page 37: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Product Flavors- Different versions of the same application

• Paid vs Free • Multi-APK support in Google Play

\- Different Dimension(s) than BuildTypes

Page 38: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Android Library Project

\

android { productFlavors { flavour1 { applicationId "com.example.flavour1" minSdkVersion 16 } flavour2 { applicationId "com.example.flavour2" } } }

build.gradle

Page 39: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Types : Source Folder

src/main/AndroidManifest.xml src/main/java src/main/resource src/main/res src/main/assets src/main/aidl src/main/rs src/main/jni

src/androidTest/java src/androidTest/resource src/androidTest/res src/androidTest/assets src/androidTest/aidl src/androidTest/rs src/androidTest/jni

src/debug/... src/release/... src/beta/... src/flavor1/... src/androidTestFlavor1/...

Page 40: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Variant = Build Type + Product Flavor(s)

No Flavors :

\debug release

- debug release

- - -

Page 41: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Variant = Build Type + Product Flavor(s)

No Flavors :

\

debug release

- debug release

- - -

With Flavors : debug release

Flavor1 Flavor1Debug Flavor1Release

Flavor2 Flavor2Debug Flavor2Release

Page 42: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Variants : Source Code

Multiple source folders, single output

src/main/java

src/debug/java

src/free/java

Page 43: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Variants : Resource

Overlays

src/main/res

src/debug/res

src/free/res

Page 44: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Variants : Signing Configuration

Priority Order

android.defaultConfig.signingConfig

android.buildTypes.release.signingConfig

android.productFlavors.free.signingConfig

Page 45: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Variants : Package Name

Overlays + Suffix

android.defaultConfig.packageName

android.productFlavors.free.signingConfig

+ android.buildTypes.debug.packageNameSuffix

src/main/AndroidManifest.xml

Page 46: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Build Variants : Proguard

android { ... buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }

productFlavors { flavor2 { proguardFile 'flavor2-rules.pro' } } }

build.gradle

Page 47: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Res / Code Generation

buildConfigField

resValue

Page 48: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

build.gradleandroid { buildTypes { debug { buildConfigField "String", "SERVER_URL", '"http://staging.example.co"' resValue "string", "facebook_app_id", '"12345678910'

... } release { buildConfigField "String", "SERVER_URL", '"https://example.co"' resValue "string", "facebook_app_id", '"0987654321'

... } } }

Res / Code Generation

Page 49: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

PERFORMACE

Page 50: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

GRADLE IS FAST

Page 51: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

GRADLE IS FAST

200 Projects

grade clean assemble —-parallel 7s

Page 52: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

• Android Studio IDE (Android Tooling Team) • Gradle Android Plugin (Android Tooling Team) • Gradle Flatform (Gradle Team) • Android Tooling (Android Platform Team)

Toolchain

Page 53: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

BOTLENECK

Page 54: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Clean Install (61.9s)

1%8%

46% 27%

3%14% Install (8.89s)

After Dexing (2.06s)Dex (16.67s)Pre-Dex (28.54s)Before Dexing (5.04)Configuration (0.65)

Page 55: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Install After Code Change (33.31s)

2%15%

50%

6%

27% Install (8.89s)After Dexing (2.06s)Dex (16.67s)Before Dexing (5.04s)Configuration (0.65s)

Page 56: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

PRE-DEXINGDEXING

Page 57: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Hint• Enable the Gradle daemon and parallel build

dexOptions { incremental true }

• Incremental dexing

~/.gradle/gradle.properties

org.gradle.daemon=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx1024m org.gradle.java.home=/path/to/jvm

• Offline Mode• Separate project into modules

Page 58: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

https://source.android.com/source/jack.html

Jack Compiler

Page 59: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

http://gradle.org/training/

Page 60: ID Android TechTalk Series #6 : Google Service and Gradle - Anton Nurdin Tuhadiansyah

Anton Nurdin TSenior Software Engineer, Xendit

anton46.com

THANK YOU