android gradle-build-system-overview

51
Android Gradle Build System Overview by kvh

Upload: kevin-he

Post on 16-Apr-2017

168 views

Category:

Mobile


2 download

TRANSCRIPT

Page 1: Android gradle-build-system-overview

Android Gradle Build System Overview

by kvh

Page 2: Android gradle-build-system-overview

About Me

• Android & Backend Service Dev

• bugtags.io, help developer ship product faster

• Interested in Tech & Biz

• Blog kvh.io/en

Page 3: Android gradle-build-system-overview

Outline• About This Topic

• Prerequisites

• Android New Build System

• Pearls in Code

• Gradle Plugin in Action

• Summary

Page 4: Android gradle-build-system-overview

About This Topic

• The very beginning

• Turn out to be huge

• Step by step

• Overview & action

Page 5: Android gradle-build-system-overview

The Very Beginning

• Users' problem in Bugtags SDK integration

• FAQ of beginners

• We should go further

Page 6: Android gradle-build-system-overview

Huge Topic• Source code: core lib > 2.5GB, whole system

25GB

• More than 50 sub-projects

• Android team is working on it since 2013(even earlier)

• Under heavy development(instant-run,jack jill,data-binding, native development support, etc.)

Page 7: Android gradle-build-system-overview

Overview & Action

• Project overview

• Pearls found in code

• Learn from code

• Plugin in action

Page 8: Android gradle-build-system-overview

Prerequisites

• Basics of Groovy and Gradleref: http://kvh.io/cn/embrace-android-studio-groovy-gradle.html

• Basics of Android Gradle build tool and process ref:http://kvh.io/cn/embrace-android-studio-indepth.html

Page 9: Android gradle-build-system-overview

Warmup: Groovy

• Dynamic language on JVM

• Improve development productivity

• Functional programming

• DSL support

Page 10: Android gradle-build-system-overview

Warmup: Gradle• Modern build tools for Java and other languages

• Build on Groovy

• Build file: every project has a build file

• Easy to learn and use

• DSL, not XMLbugtags { mappingUploadEnabled false }

Page 11: Android gradle-build-system-overview

Warmup: Gradle Cont'

• Project[rootProject, subProject]

• Plugin

• Task

• Action

Page 12: Android gradle-build-system-overview

Gradle Cli

• gradle & gradlew use specific version of gradle as you wish https://docs.gradle.org/current/userguide/gradle_wrapper.html

• wrapper structure gradlew (UN*X Shell script)gradlew.bat (Windows batch file)gradle/wrapper/gradle-wrapper.jar (Wrapper JAR)gradle/wrapper/gradle-wrapper.properties (Wrapper properties)

distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

Page 13: Android gradle-build-system-overview

Gradle Cli Cont'• Execute cli, UN*X & Windows

./gradlew (UN*X)gradlew.bat (Windows)

• Some useful commandsclean build --infoprojectstasksassemblebuild -x test

• Refhttp://kvh.io/cn/gradle-indepth-cmd.html

Page 14: Android gradle-build-system-overview

Android Gradle Build Tool• One plugin package

buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0' } }

• Two plugins

apply plugin: 'com.android.application' apk apply plugin: 'com.android.library' aar

Page 15: Android gradle-build-system-overview

Android Gradle Plugin Package Directory Structure

src/main

groovy    com    android    build

resources META-INF gradle-plugins android-library.properties android-reporting.properties android.properties com.android.application.properties com.android.library.properties com.android.test.properties

Page 16: Android gradle-build-system-overview

Android Gradle Build Output• apk: .── AndroidManifest.xml── META-INF── classes.dex── res

└── resources.arsc

• aar • /AndroidManifest.xml (mandatory) • /classes.jar (mandatory) • /res/ (mandatory) • /R.txt (mandatory) • /assets/ (optional) • /libs/*.jar (optional) • /jni/<abi>/*.so (optional) • /proguard.txt (optional) • /lint.jar (optional)

Page 17: Android gradle-build-system-overview

Android New Build System

• Website

• Bintray Repository & Dependencies

• Source Code

• Project Structure

Page 18: Android gradle-build-system-overview

Website

• http://tools.android.com/

• http://tools.android.com/tech-docs My favorite site

• http://tools.android.com/build how to build the [build system]

Page 19: Android gradle-build-system-overview

Android Gradle Plugin DSL for Users

• What we are familiar withapply plugin: 'com.android.application|library' android { defaultConfig{} buildTypes{} lintOptions{} packageOptions{} //...}

• Explain what you can config insidehttp://google.github.io/android-gradle-dsl/current/index.html

Page 20: Android gradle-build-system-overview

Bintray Repository• Android Gradle Plugin: version, developer

https://bintray.com/android/android-tools/com.android.tools.build.gradle

• Whole system: 40 projects https://bintray.com/android/android-tools

• Sometimes our library can depends on some android-tool projects

Page 21: Android gradle-build-system-overview

Android Gradle Plugin' s Dependencies

com.android.tools.build:gradle Gradle Plug-in for Android

> com.android.tools.build:gradle-core Core Library for Android Gradle Plug-in

->

com.android.tools.build:builder Android Builder library

com.android.tools.build:lint

com.android.tools.build:transform-api

com.android.tools.build:gradle-api Android Gradle API

com.android.databinding:compilerCommon Data Binding Compiler Common

...

Page 22: Android gradle-build-system-overview

Source Code

• Git repositoryhttps://android.googlesource.com/platform/tools/base/+/gradle_2.0.0

• Use USTC source instead https://lug.ustc.edu.cn/wiki/mirrors/help/aosp

Page 23: Android gradle-build-system-overview

Source Code Cont'• Download repo tool

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo ## if the above is not working, try the following ## curl https://storage-googleapis.lug.ustc.edu.cn/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

• Init: put source code in ~/android/gradle mkdir -p ~/android/gradle cd ~/android/gradle repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b gradle_2.0.0

• Syncrepo sync

• Waitabout 8 hours

Page 24: Android gradle-build-system-overview

Project Structure• Directories cd ~/android/gradle

external frameworks prebuilts sdk tools //main project

• Find out projectscd ~/android/gradle/tools ./gradlew projects

Page 25: Android gradle-build-system-overview

Part of the Project ListRoot project 'tools'

+--- Project ':base'

| +--- Project ':base:annotations'

| +--- Project ':base:ant-tasks'

| +--- Project ':base:api-generator'

| +--- Project ':base:archquery'

| +--- Project ':base:asset-studio'

| +--- Project ':base:builder'

| +--- Project ':base:builder-model'

| +--- Project ':base:builder-test-api'

| +--- Project ':base:chartlib'

| +--- Project ':base:common'

| +--- Project ':base:ddmlib'

| +--- Project ':base:docs'

Page 26: Android gradle-build-system-overview

Learn from Subproject's build.gradle File

• Every sub-project is a gradle project

• Read build.gradle file, find out what is it.eg. com.android.tools.build:builder cd ~/android/gradle/tools/base/build-system/builder

group = 'com.android.tools.build' archivesBaseName = 'builder' version = rootProject.ext.buildVersion project.ext.pomName = 'Android Builder library'project.ext.pomDesc = 'Library to build Android applications.'

Page 27: Android gradle-build-system-overview

Try to Build• Gradle build guideline

http://tools.android.com/build#TOC-Building-the-Android-Gradle-Plugin

• Create output directorycd ~/android/gradle mkdir -p out/dist

• Assemblecd ~/android/gradle/tools ./gradlew clean assemble

Page 28: Android gradle-build-system-overview

Try to Build Cont'

• May fail for JDK version check(i don't have JDK 1.6 in my mac) vim ~/android/gradle/tools/buid.gradleif (!jvmVersion.startsWith(requiredVersion)) { //throw new RuntimeException("Tools need to be compiled with Java $requiredVersion, you are using Java $jvmVersion.") }

• build result in out/dist

Page 29: Android gradle-build-system-overview

Pearls in Code

• Learn from the project structure

• Learn how Android team members code

Page 30: Android gradle-build-system-overview

buildSrc Project

• ~/android/gradle/tools/buildSrc

• Actually a plugin for sub-project

• Will run before any other sub-project

Page 31: Android gradle-build-system-overview

Gradle Plugin Types

• Three types of gradle plugin:build script:simple buildSrc projectstandalone project: share

• Ref:http://kvh.io/cn/embrace-android-studio-gradle-plugin.html

Page 32: Android gradle-build-system-overview

buildSrc Project Cont'• internal plugins

. META-INF

gradle-plugins clone-artifacts.properties jsoup.properties license-report.properties native-setup.properties offline-repo.properties pegdown.properties presubmit-runner.properties sdk-files.properties sdk-java-lib.properties sdk-tools.properties windows-setup.properties

Page 33: Android gradle-build-system-overview

buildSrc Project Cont'• Gradle build script collections, sub-project reference them

~/android/gradle/tools/buildSrc/base

• List .

base.gradle baseJava.gradle bintray.gradle build.gradle gradle.properties gradlew gradlew.bat javadoc.gradle publish.gradle release.gradle settings.gradle update_from_root.sh version.gradle

Page 34: Android gradle-build-system-overview

android.jar as classpath

• Android library with pure Java code

• You will never need an android library module

• eg. ~/android/gradle/tools/base/instant-run/instant-run-server

Page 35: Android gradle-build-system-overview

android.jar as classpath Cont'

• How it works apply plugin: 'java'

File androidJar = new File(System.env.ANDROID_HOME + '/platforms/android-23/android.jar'); if (!androidJar.exists()) {     throw new RuntimeException("android-23 android.jar not found at " + androidJar.absolutePath) }

configurations {     provided }

dependencies {     compile project(':base:instant-run:instant-run-runtime')     provided files(androidJar) }

sourceSets {     main { compileClasspath += configurations.provided } }

Page 36: Android gradle-build-system-overview

Dependency Configurations

• dependencies { compile|provided('a:b:1.0.0')}

• Customization for dependency

• ~/android/gradle/tools/base/build-system/gradle-core

Page 37: Android gradle-build-system-overview

Dependency Configurations Cont'

• includeInJar configurations {     includeInJar }

dependencies{includeInJar(':insta-run:server')

}

jar {     into('instant-run') {         from configurations.includeInJar     } }

Page 38: Android gradle-build-system-overview

Dependency Transitive• A -> B -> C

• compile(A) will have B, C downloaded

• compile(A){ transitive = false }

• will stop download B, C

Page 39: Android gradle-build-system-overview

Dependency Transitive Cont'

• When depends on an aar package

• eg.

• io.kvh.public:library:1.0.0 is an aar package

• depends on com.mcxiaoke.volley:library:1.0.19

Page 40: Android gradle-build-system-overview

Dependency Transitive Cont'using

• compile('io.kvh.public:library:1.0.0@aar')

orcompile('io.kvh.public:library:1.0.0') {     transitive = false }

• volley library won't be downloaded

Page 41: Android gradle-build-system-overview

Code Analysis Tool

• findbug: static code analysis tool

• jacoco: code coverage analysis tool

Page 42: Android gradle-build-system-overview

Gradle Plugin in Action

• Understand task dependency

• Learn about Android Gradle tasks

• Write a simple plugin

• Refhttp://kvh.io/cn/embrace-android-studio-gradle-plugin.html

Page 43: Android gradle-build-system-overview

Task Dependency• Gradle task dependencies

https://docs.gradle.org/current/userguide/more_about_tasks.html

• Eg.

task hello << { println 'Hello,'}

task world << { println 'World!' }

Page 44: Android gradle-build-system-overview

Task Dependency Cont'task intro(dependsOn: hello) << { println 'intro' }

world.finalizedBy hello

• ./gradlew introhello intro

• ./gradlew worldworld hello

Page 45: Android gradle-build-system-overview

Task Dependency Cont'

• Do things in right time

• Find the right task to dependsOn or finalizedBy

Page 46: Android gradle-build-system-overview

Android Gradle Plugin Tasks

• ./gradlew -p app tasks

• or

• ./gradlew -p app clean assembleRelease -x test -x lint

• -x: remove tasks of little importance

Page 47: Android gradle-build-system-overview

Critical Tasks• mergeReleaseResources: merge resources

• processReleaseManifest: process manifest

• processReleaseResources: process & compile resources

• compileReleaseJavaWithJavac: compile Java

• transformClassesAndResourcesWithProguardForRelease: proguard

• transformClassesWithDexForRelease: dex java class

• packageRelease: package aar or apk

Page 48: Android gradle-build-system-overview

Our Plugin Requirements

• Upload proguard mapping files to server

• Run before packaging finish

• Run after proguard, when mapping file is generated

Page 49: Android gradle-build-system-overview

dependsOn • task uploadMapping

• def variantName = 'release|debug'

• "package${variantName}".dependsOn uploadMapping

• uploadMapping.dependsOn "transformClassesAndResourcesWithProguardFor${variantName}"

Page 50: Android gradle-build-system-overview

Summary• Groovy & Gradle knowledge speedup your

development: know what, how, why

• Gradle Plugin: automation, copy output files to some dir

• SDK development: split module, and merge

• Next step: go further

Page 51: Android gradle-build-system-overview

Thanks

• Good day