Slide 1

Slide 1 text

Introdução ao Gradle para Android Felipe Costa [email protected]

Slide 2

Slide 2 text

Antes do Google IO 2013... ● Dois build systems (Ant & Eclipse) ● Ant (XML) ● Manutenção de dois build systems é custoso ● O Ant não tem suporte a “artefatos” externos (por exemplo, bibliotecas) e gestão das mesmas ● Integração com o Maven é limitada

Slide 3

Slide 3 text

Gradle?? ● Build System ● DSL em Groovy ● Unificação de APIs, substituindo o Ant (XML) e o Eclipse ● Suporte a “artefatos” externos e gestão dos mesmos ● Fácil integração com IDEs do que o Ant ● Free / Open Source ● Convention over configuration ● Suporte a Plugins

Slide 4

Slide 4 text

Groovy?! ● Linguagem de Script sobre a JVM ● Combinação de Java e Ruby ● Linguagem interpretada ● Facilidade para a criação de DSLs

Slide 5

Slide 5 text

… pós Google IO 2013 ● Gradle como build system padrão ● Android Studio ○ Integração out of the box com Gradle ○ Atualização constante ○ Mais estável do que o Eclipse

Slide 6

Slide 6 text

Gradle Android Plugin

Slide 7

Slide 7 text

Projeto Legado Projeto/ src/ res/ libs/ AndroidManifest.xml build.xml Pasta raiz/

Slide 8

Slide 8 text

Projeto Legado com o Gradle Projeto/ src/ res/ libs/ AndroidManifest.xml build.gradle Pasta raiz/ gradlew/ gradlew build.gradle

Slide 9

Slide 9 text

Projeto Legado com o Gradle Projeto/ src/ res/ libs/ AndroidManifest.xml build.gradle Pasta raiz/ gradlew/ gradlew build.gradle

Slide 10

Slide 10 text

Projeto Legado com o Gradle Projeto/ src/ res/ libs/ AndroidManifest.xml build.gradle Pasta raiz/ gradlew/ gradlew build.gradle

Slide 11

Slide 11 text

Projeto Legado com o Gradle Projeto/ src/ res/ libs/ AndroidManifest.xml build.gradle Pasta raiz/ gradlew/ gradlew build.gradle build/

Slide 12

Slide 12 text

Projeto Legado com o Gradle Projeto/ src/ res/ libs/ AndroidManifest.xml build.gradle Pasta raiz/ gradlew/ gradlew build.gradle build/

Slide 13

Slide 13 text

Tarefas ● Dica: utilizar sempre o gradle wrapper ● ./gradlew tasks [--all] ● Android ○ assemble ○ clean ○ connectedDevice ○ check ○ build

Slide 14

Slide 14 text

build.gradle buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.8.+' } } apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') } android { compileSdkVersion 18 buildToolsVersion "19.0.1"

Slide 15

Slide 15 text

build.gradle sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } androidTest.setRoot('tests') debug.setRoot('build-types/debug') release.setRoot('build-types/release') } }

Slide 16

Slide 16 text

A Nova Estrutura do Projeto

Slide 17

Slide 17 text

Motivação ● Aumento da complexidade dos apps ● Múltiplos canais de distribuição: ○ Google ○ Amazon ○ etc ● Customização de um app para vários clientes (B2B) ● Suportar um app para diferentes tipos de devices ● Suportar um app que faz parte de um grande sistema (app & backend) ● Vários app com código comum, resources, e libs em comum ● O Gradle e a nova estrutura de pastas permitem que isso ocorra

Slide 18

Slide 18 text

Nova estrutura Projeto /src /res /libs build.gradle Pasta raiz /gradlew gradlew build.gradle

Slide 19

Slide 19 text

Source Folders src/main/AndroidManifest.xml src/main/java src/main/resources src/main/res src/main/assets src/main/aidl src/main/rs src/main/jni src/androidTest/java src/androidTest/resources src/androidTest/res src/androidTest/assets src/androidTest/aidl src/androidTest/rs src/androidTest/jni

Slide 20

Slide 20 text

Source Sets ● “Um source set é um grupo de arquivos fonte o qual são compilados e executados juntos." ● Diferentes source sets de acordo com a necessidade: ○ Produção versus staging ○ Interface versus implementação ○ etc ● A nova estrutura assume a existência de um source set, geralmente a main

Slide 21

Slide 21 text

Build Types ● Um build type é um eixo do resultado do processo de build ● Dois build types padrões: ○ debug ○ release ● Com o Eclipse e o Ant, esses eram os únicos tipos de build types somente ● Diferentes configurações para cada build type: ○ flag de debuggable ○ ProGuard ○ signing configuration ○ Sobreposição de arquivos ● Cuidado com a ordem de precedência!

Slide 22

Slide 22 text

Configuração básica android { defaultConfig { versionCode 12 versionName ‘2.0’ minSdkVersion 14 targetSdkVersion 19 } }

Slide 23

Slide 23 text

Customização de Build Type android { buildTypes { debug { ... } release { ... } staging.initWith(buildTypes.release) staging { ... } } }

Slide 24

Slide 24 text

Build Types & Source Folders src/main/AndroidManifest.xml src/main/java src/main/resources src/main/res src/main/assets src/main/aidl src/main/rs src/main/jni src/debug/... src/staging/... src/release/... src/androidTest/java src/androidTest/resources src/androidTest/res src/androidTest/assets src/androidTest/aidl src/androidTest/rs src/androidTest/jni

Slide 25

Slide 25 text

Tarefas novas dos Build Types ● assembleDebug ● assembleRelease ● assembleStaging

Slide 26

Slide 26 text

Signing Configuration android { signingConfigs { release { storeFile file(config.keystore') keyAlias config storePassword 'XXXXXX' keyPassword 'XXXXXX' } buildTypes { debug { /* default */ } release{ signingConfig signingConfigs.release } } }

Slide 27

Slide 27 text

Product Flavors ● Um product flavor é um eixo independente do build type para variar o resultado do processo de build ● Designado para cenários onde é necessários diferentes apks: ○ Play Store versus Amazon AppStore ○ Configuração diferenciado por cliente ● A definição de product flavor são opcionais. Se não declarado, assume-se o default.

Slide 28

Slide 28 text

Customização de Product Flavors android { productFlavors { google { ... } amazon{ ... } } }

Slide 29

Slide 29 text

Product Flavors & Source Folders src/main/AndroidManifest.xml src/main/java src/main/resources src/main/res src/main/assets src/main/aidl src/main/rs src/main/jni src/debug/... src/staging/... src/release/… src/google/… src/amazon/... src/androidTest/java src/androidTest/resources src/androidTest/res src/androidTest/assets src/androidTest/aidl src/androidTest/rs src/androidTest/jni src/androidTestGoogle/… src/androidTestAmazon/...

Slide 30

Slide 30 text

Flavors Group android { flavorGroups ‘arm’, ‘x86’ productFlavors { free { flavorGroup arm } paid { flavorGroup x86 } } }

Slide 31

Slide 31 text

Build Variants ● Esse termo designa o produto cruzado entre build types e product flavor. ● Em um projeto com buid type debug e release, e product flavors google e amazon, teríamos: ○ debug + google ○ debug + amazon ○ release + google ○ release + amazon ● Tarefas: ○ assembleDebugGoogle ○ assembleDebugAmazon ○ assembleReleaseGoogle ○ assembleReleaseAmazon

Slide 32

Slide 32 text

Dependências

Slide 33

Slide 33 text

Dependências?? ● Definição: “código externo o qual o projeto depende” ● Alguns exemplos no caso do Gradle Android: ○ Arquivos JAR locais ○ Arquivos .so locais no caso do NDK ○ Projetos Android locais ○ Sub-projetos ○ Artefatos obtidos de repositórios como o Maven Central ● Novo formato para projetos android (AAR) substituto do apklib com suporte: ○ ProGuard ○ Assets ○ Regras do Lint Customizadas

Slide 34

Slide 34 text

JAR repositories { mavenCentral() } android { … } dependencies { androidTestCompile ‘com.squareup:fest-android:1.0.4’ compile 'com.google.code.gson:gson:2.2.2' compile fileTree(dir: 'libs', include: '*.jar') }

Slide 35

Slide 35 text

Projetos de bibliotecas Android buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.8.+' } } apply plugin: 'android-library' android { compileSdkVersion 19 buildToolsVersion "19.0.1" }

Slide 36

Slide 36 text

Estrutura com vários sub-projetos app/ build.gradle build.gradle Pasta raiz/ settings.gradle libraries/ lib1/ build.gradle lib2/ build.gradle include ‘:app’ include ‘:libraries:lib1’ include ‘:libraries:lib2’

Slide 37

Slide 37 text

Sub-projetos apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile project(':libraries:lib1’) compile project(':libraries:lib2’) } android { … }

Slide 38

Slide 38 text

Artefatos ● Definção: um arquivo acompanhado de metadados sobre versão dependências daquele artefatos e demais informações. Geralmente identificados por três informações: ○ Um grupo: com.android.tools.build:gradle:0.8.0 ○ Um ID do artefato: com.android.tools.build:gradle:0.8.0 ○ Um número de versão: com.android.tools.build:gradle:0.8.0 ● Um repositório é uma coleção de artefatos, locais ou remotos ● Nem todos os artefatos estão localizados no Maven Central

Slide 39

Slide 39 text

Artefatos do Google ● Baixar via SDK Manager o Android Support Repository e o Google Repository ● Alguns artefatos desses repositórios: ○ com.android.support:support-v4:19.0.0 ○ com.android.support:support-v13:19.0.0 ○ com.android.support:appcompat-v7:19.0.0 ○ com.android.support:gridlayout-v7:19.0.0 ○ com.google.android.gms:play-services:4.0.30

Slide 40

Slide 40 text

Outros Repositórios repositories { maven { url 'http://mente.github.io/facebook-api-android-aar' } }

Slide 41

Slide 41 text

Repositórios Locais repositories { maven { mavenLocal() // No Linux fica em ~/.m2/ } }

Slide 42

Slide 42 text

Dependência por Build Type dependencies { stagingCompile: … }

Slide 43

Slide 43 text

Dependência por Product Flavor dependencies { amazonCompile: … googleCompile: ... }

Slide 44

Slide 44 text

Testes

Slide 45

Slide 45 text

Revisando ● Source Set ○ src/androidTest, ○ src/androidTestGoogle ● Dependências: ○ androidTestCompile ○ androidTestGoogleCompile ● Próprio AndroidManifest.xml ● Apenas um Build Type é testado ● Todos os testes são executados em paralelo em diferentes dispositivos e emuladores disponíveis ● Após os testes tudo é limpo e o apk de teste desinstalado ● Suporte a API de testes em servidores ● Suporte a Testes remoto

Slide 46

Slide 46 text

Configuração dos testes android { compileSdkVersion 18 buildToolsVersion "19.0.1" defaultConfig { testPackageName "com.test.foo" // ou usar o padrão gerado pelo Android studio testInstrumentationRunner "android.test.InstrumentationTestRunner" //default } }

Slide 47

Slide 47 text

Dependência nos testes dependencies { compile 'com.android.support:support-v4:19.0.0' androidTestCompile 'com.jayway.android.robotium:robotium-solo:4.3.+' }

Slide 48

Slide 48 text

Testes em projetos legados android { sourceSets { main { ... } androidTest { java.srcDirs = ['tests/src'] resources.srcDirs = ['tests/src'] res.srcDirs = ['tests/res'] assets.srcDirs = ['tests/assets'] } } }

Slide 49

Slide 49 text

Obrigado