Gradle-based Android Build System

Preview:

Citation preview

Gradle-based Android Build System

REZA MOALLEMI

REZA MOHAMMADI

What do we use?

Problems?

Heavy builds?

Long integration cycles?

Build projects?

Apache Ant - 2000

Complexity

Hard to reuse

Heavy build.xml files

Apache Maven - 2001

Maven central

Dependency management

Heavy xmls

Hard to implement custom behaviour

How we build?

What we have done?

Build integration tool

Declarative builds

Scalable – multi project builds

Dependency management

Ease of migration

Deep API

Groovy-based DSL

Gradle

A feature-rich

Java friendly

Dynamic language

For the Java platform

Groovy

Tasks

Task Dependencies

Project dependencies

Dependency

File dependencies

Dependency

Repository dependencies

Dependency

Repository

Use gradle without even downloading it manually

Every developer uses the same version

Specify version or full url

Gradle Wrapper

Plugins

Android Java scalagroovy cppcheckstylefindbugs pmdmaven git

Arbitrary multi-project layout

Configuration injection

Separate config/execution tree

Partial builds

Multi-project builds

Multi-project builds

Build Types

Product Flavors

Variants = build type + product flavors

no flavor: variant = build type

Base concepts

control how the app is build

debug flag

minify using proguard

Signing config

application version name suffix

Build types

product flavors: free, paid

application id flag

min-max sdk version

version code name

signing config

Product Flavors

Src/main/AndroidManifest.xml

Src/main/java/

Src/main/res/

Src/main/aidl/

Src/main/jni/

Src/main/rs/

Android SourceSets

Src/main/…

Src/debug/…

Src/release/…

Src/paid/…

Src/free/…

Available SourceSets

1. Varinat-specific(paidJBDebug)

2. Build Type (debug)

3. Multi-Flavor (paidJB)

4. Flavors

a) paid

b) JB

5. Default (main)

Variant SourceSet Priority

Src/main/…

Src/debug/…

Src/release/…

Src/freeDebug/…

Src/paidRelease/…

Src/paid/…

Android SourceSets

BuildConfig File

Change output file

Gradle Advanced Build Version Pluginhttps://github.com/moallemi/gradle-advanced-build-version

Automatic versionCode and versionName

Gradle Advanced Build Version Pluginhttps://github.com/moallemi/gradle-advanced-build-version

Automatic versionCode and versionName

Gradle Advanced Build Version Pluginhttps://github.com/moallemi/gradle-advanced-build-version

Automatic versionCode and versionName

Gradle Advanced Build Version Pluginhttps://github.com/moallemi/gradle-advanced-build-version

versoinCode = 931130

versoinName = 1.3.6.8

Automatic versionCode and versionName

We're not going to talk about importance of testing.

But testing is important!

Hey! We're not talking about that.

ok

...

TESTING IS SO IMPORTANT

Testing

It's about automation.

It's about continuous integration.

Testing & Gradle

How to ask gradle to run tests

Verification tasks

------------------

connectedAndroidTest - Installs and runs the

tests for Build 'debug' on connected devices.

lint - Runs lint on all variants.

test - Run all unit tests.

./gradlew connectedAndroidTest

< 1.1.0-rc1

./gradlew test

>= 1.1.0-rc1

The Tricks

Sample

https://github.com/congenialmobile/Hop

Reza Moallemi Reza Mohammadi

@moallemi @remohammadi

Recommended