Criando libs no Gradle com Android – Parte 1

Posted by rlecheta on janeiro 14, 2015
Android, Tutorial

Parte 2

Parte 3

Se você está trabalhando com Android, provavelmente precise criar sua própria lib para usar internamente em seus projetos e empresa, ou até você gostaria de criar uma lib e disponibilizar para a comunidade utilizar.

Mas então, como criar uma lib? Como disponibilizá-la?

Nesta primeira parte do tutorial, vou criar uma lib que você fará o deploy localmente em seu computador.

O 1º passo é criar um projeto normal no Android Studio (não precisa nem de activity launcher). Eu criei um projeto chamado MyLib. Neste projeto você deve colocar suas classes utilitárias, recursos, etc. Enfim tudo o que você deseja reutilizar nos outros projetos.

No arquivo app/build.gradle você precisa indicar ao build do gradle que este projeto é uma lib, então adicione as seguintes linhas no início do arquivo.

apply plugin: 'com.android.library'
apply plugin: 'maven'

Depois você vai precisar adicionar no arquivo app/build.gradle as configurações sobre sua biblioteca e o local onde ela deve ser instalada, ou seja, o local onde fica o seu repositório. O repositório pode ser uma URL da internet (se existir um servidor), ou até mesmo uma pasta local do computador, que será o que vamos fazer agora.

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file:///home/ricardo/gradle/rep")

            pom.groupId = GROUP
            pom.artifactId = POM_ARTIFACT_ID
            pom.version = VERSION_NAME
        }
    }
}
task install(dependsOn: uploadArchives)

Nesta caso foi criada a task  uploadArchives que define o repositório onde a lib deve ser instalada.

A última linha desta configuração indica que a task install depende da task uploadArchives. Portanto se você executar a task install será feito também o upload da lib para o repositório.

Para que você não tenha dúvidas, segue o arquivo app/build.gradle completo.

Atenção: Veja que uma lib não tem as configurações do applicationId como um projeto normal. Veja o arquivo exemplo abaixo e deixe igual.


apply plugin: 'com.android.library'
apply plugin: 'maven'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 21
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

uploadArchives {
    repositories {
        mavenDeployer {
            //repository(url: "file:///C:/gradle/rep/")
            repository(url: "file:///home/ricardo/gradle/rep")

            pom.groupId = GROUP
            pom.artifactId = POM_ARTIFACT_ID
            pom.version = VERSION_NAME
        }
    }
}
task install(dependsOn: uploadArchives)

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

Atenção: Altere a pasta do repositório deste exemplo para uma pasta que exista em seu computador!

No arquivo app/build.gradle foi referenciado 3 propriedades importantes do build de sua lib, que é o Group, ArtifactId e Version.

pom.groupId = GROUP

pom.artifactId = POM_ARTIFACT_ID

pom.version = VERSION_NAME

Neste caso as informações podem ficar fixas no projeto, mas por questões de boas práticas são criadas estas variáveis no arquivo app/gradle.properties (se não existir crie esse arquivo).

// arquivo app/gradle.properties
POM_ARTIFACT_ID=mylib
VERSION_NAME=0.0.1
GROUP=br.com.livroandroid

O artefato id é o nome de sua lib propriamente dita, e o grupo é seu pacote. Você pode ter mais de um artefato publicado no mesmo pacote. E a versão não preciso nem explicar.

Sendo assim quando eu for utilizar essa lib em outro projeto, basta utilizar a seguinte dependência:

compile 'br.com.livroandroid:mylib:0.0.1'

Onde o formato é:

compile 'groupId:artifactId:version'

Certo mas como faço o deploy da lib?

Basicamente nesse caso posso executar a task install, pois ela depende da task uploadArchives que foi configurada no build.

Existem 3 formas simples de fazer isso:

1) Abrir um terminal no seu computador, navegar até a pasta do projeto e digitar.

gradle install

Para isso você precisa instalar o gradle no seu computador e configurá-lo no PATH para encontrar o executável. Lembre-se de instalar a versão correta que o projeto do Android Studio utiliza. Por exemplo no arquivo gradle/wrapper/gradle-wrapper.properties que está no projeto, posso ver que o Android Studio está utilizando a versão 2.2.1 do Gradle (na época deste tutorial).

// gradle/wrapper/gradle-wrapper.properties
. . .
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip

Então neste caso no meu computador eu preciso garantir que estou utilizando esta mesma versão para fazer o build.

2) Outra maneira simples de executar e que não precisa instalar o gradle no computador é utilizar o gradle que está embutido no Studio.

Para isso abra a janela > Tools > Open Terminal do Studio.

b

O resultado é a janela terminal.

terminalb

Depois digite o seguinte comando. Note que usei a notação ./ pois estou no Linux.

./gradlew install

Obs: O arquivo gradlew é gerado pelo studio e está na pasta raiz do projeto. Tenha certeza de que ao abrir o terminal você vai estar na raiz, e não dentro da pasta app.

Ao executar este comando podemos ver o seguinte resultado na janela Terminal. Veja que o arquivo foi publicado no repositório local que configurei.

terminal3

Feito isso basta você olhar no seu computador nesta pasta que a lib foi publicada.

terminal4

Sobre o formato da lib não vou explicar pois você pode dar uma procurara no Google Estou citando apenas as partes mais importantes.

3) A 3ª maneira de fazer o deploy é executar a task install visualmente pelo Android Studio.

Basta abrir a janela Gradle Tasks que fica no canto direito superior do Studio, procurar a task intsall e executar com um clique.

Feito isso bingo! A lib será publicada.

terminal5

4) Utilizando a LIB.

OK mas e agora como faço para utilizar a lib?

Neste caso como criamos um repositório local, basta configurar este repositório no seu outro projeto e declarar a dependência.

No meu caso criei outro projeto com o nome HelloLib. Para sua conferência segue o arquivo app/build.gradle deste projeto.

 

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "br.com.livroandroid.hellolib"
        minSdkVersion 9
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

repositories {
    maven {
        url "file:///home/ricardo/gradle/rep"
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'

    compile 'br.com.livroandroid:mylib:0.0.1'
}

É isso aí pessoal, espero que tenham gostado do tutorial. Ainda tem as partes 2 e 3.
Parte 2

Parte 3

12 Comments to Criando libs no Gradle com Android – Parte 1

  • Excelente artigo!
    Sou iniciante no Android e procurei muito por uma forma de criar uma biblioteca.
    Seu artigo me ajudou muito. É de longe o melhor que eu encontrei…
    Uma pequena correção: No final da última linha faltou o @AAR.
    Obrigado.

  • Muito obrigado Lechetão, você é o cara! Aprendi Android lendo o seu livro “Google Android 3a edição”, e agora, depois de um bom tempo programando, e tendo algumas dificuldades no “Android Studio”, vem você com este belo artigo e salva a pátria! Vlw.

  • Olá.

    Ricardo, gostaria de saber como colocar essa lib para ser usada por outros usuários, como seria o procedimento, devo hospedá-la onde, como,alguma dica?

    Assim os outros projetos só colocaram no dependecnies (br.com.pacote.lib:versao)

    Obrigado.

    • Oi Marcelo.

      Expliquei isso nas outras partes do Tutorial, tem a parte 1, 2 e 3.

      Você pode publicar a lib no repositório global do Maven (para o mundo inteiro), ou publicar em um servidor privado seu (Nexus Sonatype).

      • Bah agora que vi que tem as outas partes…obrigado pela pronta resposta. rateada minha mesmo, ótimo conteúdo, parabéns.

  • Boa noite Ricardo,
    Você tem tutorial para criar libs para IOS.

    Pois vou precisar desenvolver para as duas plataformas.

    Obrigado e parabéns.