34
ANDROID E GRADLE O GUIA DE SOBREVIVÊNCIA Outubro de 2014

ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

Embed Size (px)

Citation preview

Page 1: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

ANDROID E GRADLEO GUIA DE SOBREVIVÊNCIA

Outubro de 2014

Page 2: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

SOBRE MIM

Computeiro by ICMC/USP

Engenheiro de Software

Instrutor na Globalcode

Intel Software Innovator

Palestrante e etc

Page 3: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

AGENDAMotivação

Configurando a Build

Gerenciamento de Dependências

Alguns Truques Rápidos

Migrando do Eclipse

Conclusões

Page 4: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

MOTIVAÇÃO

Page 5: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

ANDROID E BUILD SYSTEMSNa edição 2013 do Google, o time ADT anunciou que um novo build system estava em desenvolvimento para substituir o padrão Eclipse / ANT

Anúncio simultâneo ao lançamento do Android Studio Preview

Objetivo : resolver alguns dos principais problemas de produtividade dos desenvolvedores Android

Page 6: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

SOBRE O GRADLE

"Gradle is build automation evolved. Gradle can automate the building, testing, publishing, deployment and more of software packages or other types of projects"

Solução madura, inicialmente desenhada como alternativa para outros build systems do mundo Java (ANT, Maven, Ivy)

Hoje é um build system poliglota

Orientado à tarefas, build dirigida por scripts com DSL Groovy

Page 7: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

PRINCIPAIS OBJETIVOSPermitir reúso otimizado de código e recursos da aplicação

Facilitar a criação de variantes da aplicação, por exemplo, para os casos com distribuição multi-APK

Facilitar integração com ferramentas/código de teste

Facilitar a extensão e configuração da build

Page 8: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

ANDROID-GRADLE-PUGLINEsforço do time ADT se concentra em amadurecer o plugin do Android para o Gradle

Atualmente na versão 0.13.x

Não é possível assumir - ainda - que há garantia compatibilidade total entre projetos construídos sobre versões “distantes" do plugin

http://tools.android.com/tech-docs/new-build-system/user-guide

Page 9: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

[ubiratan@mac] ~/AndroidStudioProjects/HelloGradle > tree -fL 2 . . ├── ./HelloGradle.iml ├── ./app │ ├── ./app/app.iml │ ├── ./app/build │ ├── ./app/build.gradle │ ├── ./app/libs │ ├── ./app/proguard-rules.pro │ └── ./app/src ├── ./build.gradle ├── ./gradle │ └── ./gradle/wrapper ├── ./gradle.properties ├── ./gradlew ├── ./gradlew.bat ├── ./local.properties └── ./settings.gradle

Script para digirir a build do módulo específico

Page 10: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

[ubiratan@mac] ~/AndroidStudioProjects/HelloGradle > tree -fL 2 . . ├── ./HelloGradle.iml ├── ./app │ ├── ./app/app.iml │ ├── ./app/build │ ├── ./app/build.gradle │ ├── ./app/libs │ ├── ./app/proguard-rules.pro │ └── ./app/src ├── ./build.gradle ├── ./gradle │ └── ./gradle/wrapper ├── ./gradle.properties ├── ./gradlew ├── ./gradlew.bat ├── ./local.properties └── ./settings.gradle

Script com definições válidas para todos os subprojetos

Page 11: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

[ubiratan@mac] ~/AndroidStudioProjects/HelloGradle > tree -fL 2 . . ├── ./HelloGradle.iml ├── ./app │ ├── ./app/app.iml │ ├── ./app/build │ ├── ./app/build.gradle │ ├── ./app/libs │ ├── ./app/proguard-rules.pro │ └── ./app/src ├── ./build.gradle ├── ./gradle │ └── ./gradle/wrapper ├── ./gradle.properties ├── ./gradlew ├── ./gradlew.bat ├── ./local.properties └── ./settings.gradle

Arquivos que serão lidos pelo Build System, definem as

propriedades para execução do Gradle

Page 12: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

[ubiratan@mac] ~/AndroidStudioProjects/HelloGradle > tree -fL 2 . . ├── ./HelloGradle.iml ├── ./app │ ├── ./app/app.iml │ ├── ./app/build │ ├── ./app/build.gradle │ ├── ./app/libs │ ├── ./app/proguard-rules.pro │ └── ./app/src ├── ./build.gradle ├── ./gradle │ └── ./gradle/wrapper ├── ./gradle.properties ├── ./gradlew ├── ./gradlew.bat ├── ./local.properties └── ./settings.gradle

Wrapper para o sistema de build e scripts para execução de forma

independentede de ambiente

Page 13: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

[ubiratan@mac] ~/AndroidStudioProjects/HelloGradle > ./gradlew tasks :tasks !------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ !Android tasks ------------- androidDependencies - Displays the Android dependencies of the project signingReport - Displays the signing info for each variant !Build tasks ----------- assemble - Assembles all variants of all applications and secondary packages. assembleDebug - Assembles all Debug builds assembleDebugTest - Assembles the Test build for the Debug build assembleRelease - Assembles all Release builds build - Assembles and tests this project. buildDependents - Assembles and tests this project and all projects that depend on it. buildNeeded - Assembles and tests this project and all projects it depends on. clean - Deletes the build directory. !Build Setup tasks ----------------- init - Initializes a new Gradle build. [incubating] wrapper - Generates Gradle wrapper files. [incubating] !Help tasks ---------- components - Displays the components produced by root project 'HelloGradle'. dependencies - Displays all dependencies declared in root project 'HelloGradle'. dependencyInsight - Displays the insight into a specific dependency in root project 'HelloGradle'.

Page 14: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

CONFIGURANDO A BUILD

Page 15: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

ANDROID MANIFESTAgora é facilmente configurável em tempo de build !

Alguns parâmetros manipuláveis :

- minSDK e targetSDK

- versionCode e versionName

- applicationId (packageName)

- instrumentationTest

Page 16: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

BUILD VARIANTSMecanismos para criar variantes de uma build

Três propostas (versão 0.13.x em diante)

- Build Flavors

- Build Types

- APK Splits

Page 17: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

BUILD TYPESMecanismo para diferenciar builds por tipo

Configuração pensada para ajudar deploys simultâneos em múltiplos ambientes (desenvolvimento, QA, produção, etc)

Dois tipos por padrão : debug e release

Page 18: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

BUILD FLAVORSMecanismo para diferenciar builds por “sabor"

Permite criar versões diferentes da mesma aplicação - Free e Pago - ARM e x86 - Cliente X e Cliente Y - Dentre outros

Possibilidade de agrupamento em FlavorGroups

Page 19: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

BUILD TYPES!

android { buildTypes { !

debug { applicationIdSuffix ".debug" versionNameSuffix "-debug" } !

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

Page 20: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

BUILD FLAVORS! // Adapted from http://tools.android.com/tech-docs/new-build-system/tips ! productFlavors { ! x86 { ndk { abiFilter "x86" versionCode = 3; } } ! arm { ndk { abiFilter “armeabi-v7a" versionCode = 2; } } }

Page 21: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

GERENCIANDO DEPENDÊNCIAS

Page 22: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

DEPENDÊNCIASAspecto fundamental de uma aplicação

Gradle oferece controle total sobre a árvore de dependências do projeto

Artefatos podem seguir diversos formatos, com destaque para artefatos do tipo Maven e Ivy e seus repositórios; módulos-cliente e outros projeto tipo Gradle

Declaração extremamente simplificada

Page 23: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

DECLARANDO DEPENDÊNCIAS! dependencies { ! compile 'com.android.support:support-v4:20.0.0' ! compile('de.keyboardsurfer.android.widget:crouton:1.8.4@aar') { exclude group: 'com.google.android', module: 'support-v4' } ! compile 'org.parceler:parceler-api:0.2.12' provided 'org.parceler:parceler:0.2.12' ! compile 'com.google.android.gms:play-services:5.+' ! compile files("libs/simple.facebook-2.1.jar") compile project(':UndoBar') ! }

Page 24: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

O FORMATO AARFormato de empacotamento reconhecido pelo plugin para projetos de bibliotecas do Android (.jar + resources)

Metadados descritores estilo Maven

Nem todas as dependências que precisamos no cotidiano — vide OSS - possuem artefato AAR disponível e versionado em repositórios do Maven … (ex : facebook-android-SDK)

Page 25: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

ALGUNS TRUQUES RÁPIDOS

Page 26: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

JDK7

!

android { !

compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } !

... }

Page 27: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

SIGNING CONFIGS! signingConfigs { debug { storeFile file("<path_to>/debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } … // Add your release signing config! } ! buildTypes { debug { signingConfig signingConfigs.debug } ! release { signingConfig signingConfigs.release } }

Page 28: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

CUSTOM APK NAME

!

def appendVersionNameVersionCode(variant, defaultConfig) { def file = variant.outputFile !

def fileName = file.name .replace("app", "MyApp") .replace(".apk", "-v" + defaultConfig.versionName + "-build" + defaultConfig.versionCode + ".apk") !

variant.outputFile = new File(file.parent, fileName) }

!

applicationVariants.all { variant -> appendVersionNameVersionCode(variant, defaultConfig) }

Page 29: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

MIGRANDO DO ECLIPSE

Page 30: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

PRELIMINARESEstrutura do projeto Eclipse é diferente da estrutura padrão reconhecida pelo Gradle / Android Studio

Gerenciamento de Project Libraries "inocente"do Eclipse (referências via Workspace) é problemático do ponto de vista de versionamento

OutrosProblemas+++

Page 31: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

ESTRATÉGIAS DE MIGRAÇÃOBasicamente duas linhas :

(A) Criar um novo projeto no Android Studio e migrar código, recursos e dependências manualmente

(B) Manter o projeto Eclipse, "ensinando" o Gradle a construir a aplicação a partir dessa estrutura

http://goo.gl/CXjcRz

Page 32: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

LIÇÕES DA VIDASe puder escolher, use a estratégia A

Caso o suporte ao Eclipse precise acontecer, comece pelo mapeamento das depedências e procure

- Maximar o uso de dependências externas e - Minimizar ao máximo as dependências que são transitivas

Reforçando : use a estratégia A

Page 33: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

CONCLUSÕES

Gradle é uma das melhores ferramentas adicionadas ao toolchain de quem é desenvolvedor Android!

Sistema robusto e flexível, mas exige curva de aprendizado

Build pode ser totalmente customizada de acordo com a necessidade !

Trabalhar no mesmo projeto com Eclipse e Androd Studio via Gradle é possível, porém penso que não vale (mais) a pena !

Page 34: ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system poliglota Orientado à tarefas, build dirigida por scripts com DSL Groovy PRINCIPAIS

CONTATOS

[email protected]

@ubiratanfsoares

google.com/+UbiratanSoares

ubiratansoares.github.io