ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system...
-
Upload
dinhkhuong -
Category
Documents
-
view
224 -
download
0
Embed Size (px)
Transcript of ANDROID E GRADLE...outros build systems do mundo Java (ANT, Maven, Ivy) Hoje é um build system...

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 !