ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system...

Preview:

Citation preview

ANDROID E GRADLEO GUIA DE SOBREVIVÊNCIA

Outubro de 2014

SOBRE MIM

Computeiro by ICMC/USP

Engenheiro de Software

Instrutor na Globalcode

Intel Software Innovator

Palestrante e etc

AGENDAMotivação

Configurando a Build

Gerenciamento de Dependências

Alguns Truques Rápidos

Migrando do Eclipse

Conclusões

MOTIVAÇÃO

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

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

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

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

[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

[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

[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

[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

[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'.

CONFIGURANDO A BUILD

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

Alguns parâmetros manipuláveis :

- minSDK e targetSDK

- versionCode e versionName

- applicationId (packageName)

- instrumentationTest

BUILD VARIANTSMecanismos para criar variantes de uma build

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

- Build Flavors

- Build Types

- APK Splits

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

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

BUILD TYPES!

android { buildTypes { !

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

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

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; } } }

GERENCIANDO DEPENDÊNCIAS

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

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') ! }

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)

ALGUNS TRUQUES RÁPIDOS

JDK7

!

android { !

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

... }

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 } }

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) }

MIGRANDO DO ECLIPSE

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+++

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

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

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 !

CONTATOS

ubiratan.f.soares@gmail.com

@ubiratanfsoares

google.com/+UbiratanSoares

ubiratansoares.github.io