Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introdução ao Gradle para Android

Felipe Costa
February 28, 2014

Introdução ao Gradle para Android

Introdução ao Gradle através do plugin para Android desenvolvido pelo Google.

Felipe Costa

February 28, 2014
Tweet

More Decks by Felipe Costa

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. Groovy?! • Linguagem de Script sobre a JVM • Combinação

    de Java e Ruby • Linguagem interpretada • Facilidade para a criação de DSLs
  4. … 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
  5. Projeto Legado com o Gradle Projeto/ src/ res/ libs/ AndroidManifest.xml

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

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

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

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

    build.gradle Pasta raiz/ gradlew/ gradlew build.gradle build/
  10. Tarefas • Dica: utilizar sempre o gradle wrapper • ./gradlew

    tasks [--all] • Android ◦ assemble ◦ clean ◦ connectedDevice ◦ check ◦ build
  11. 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"
  12. 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') } }
  13. 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
  14. 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
  15. 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
  16. 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!
  17. Customização de Build Type android { buildTypes { debug {

    ... } release { ... } staging.initWith(buildTypes.release) staging { ... } } }
  18. 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
  19. Signing Configuration android { signingConfigs { release { storeFile file(config.keystore')

    keyAlias config storePassword 'XXXXXX' keyPassword 'XXXXXX' } buildTypes { debug { /* default */ } release{ signingConfig signingConfigs.release } } }
  20. 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.
  21. 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/...
  22. 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
  23. 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
  24. 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') }
  25. 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" }
  26. 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’
  27. Sub-projetos apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include:

    '*.jar') compile project(':libraries:lib1’) compile project(':libraries:lib2’) } android { … }
  28. 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
  29. 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
  30. 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
  31. 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 } }
  32. Testes em projetos legados android { sourceSets { main {

    ... } androidTest { java.srcDirs = ['tests/src'] resources.srcDirs = ['tests/src'] res.srcDirs = ['tests/res'] assets.srcDirs = ['tests/assets'] } } }