Como diminuir o tamanho do apk Android: 3 dicas incríveis!

O post de hoje foi pesquisado e escrito por mim, mas com as técnicas descobertas e aplicadas pelo meu colega de serviço Cleber Henriques, líder técnico de Android no Banco Agiplan. Com essas técnicas ele conseguiu reduzir o tamanho do nosso apk em torno de 50% usando as técnicas abaixo descritas.

Tem pouco mais de um mês que estou trabalhando no Banco Agiplan. Somos um banco com um foco muito grande no mobile banking, uma vez que não possuímos agências físicas, sendo puramente um banco digital. Como um banco de varejo com um grande foco nas classes C e D, temos muitos correntistas com smartphones extremamente simples, sem grandes recursos e isso inclui armazenamento interno, que concorremos com o espaço consumido pelo Whatsapp, jogos e é claro, o Facebook, o devorador de armazenamento!

Conseguir gerar um apk pequeno, que não consuma muitos recursos do smartphone do nosso cliente, é uma garantia que teremos de que a) ele vai conseguir baixar o app rapidamente, talvez até com 3G e b) ele não vai desinstalar nosso app caso fique sem espaço no smartphone. Ele vai desinstalar apps que realmente ocupem um espaço grande.

Se o app que você trabalha também possui um público semelhante, usar as dicas abaixo podem ajudá-lo enormemente. Obviamente o ganho com estas técnicas pode variar para mais ou para menos, dependendo dos assets que você possui e que serão otimizados.

#1 – Otimize suas imagens com o ImageOptim

ImageOptim
ImageOptim

Na maior parte das vezes, o “inchaço” dos apps é devido à grande quantidade de imagens necessárias para se construir um app bonito e com boa usabilidade. Claro que isso não é uma regra, mas é o que geralmente acontece.

Assim como na web, focar seus esforços de otimização nas imagens é atacar 20% do app que geram 80% do tamanho de seu app, como no bom e velho princípio de Pareto.

Comece usando o ImageOptim, uma aplicação gratuita e de código aberto disponível para várias plataformas que diminui o tamanho de imagens JPG, PNG e GIF sem perda de qualidade usando diversas técnicas e aplicações diferentes (AdvPNG, AdvanceCOMP, OptiPNG, Pngcrush, JpegOptim, jpegtran, Gifsicle e PNGOUT).

Não tem bruxaria aqui, apenas matemática. Através do descarte de informações “inúteis” para o app como comentários e perfis de cor, consegue-se reduzir de 20-60% do tamanho original de imagens não otimizadas. Para quem já usou o recurso “Save for the Web” do Photoshop, sabe que os ganhos são bem expressivos, pois a mecânica aqui é a mesma.

O uso é muito simples: você apenas arrasta as imagens para dentro da janela do software e elas são otimizadas.

#2 – Converta suas imagens para WebP

Imagens que não possuam transparência podem ser convertidas para o formato WebP, que é um formato de imagem criado pelo Google que fornece imagens extremamente comprimidas sem perdas de qualidade aparente (assim como JPG), em um algoritmo de compressão muito superior ao JPG tradicional. Imagens WebP são suportadas a partir do Android 4.0 (API 14) sendo possível usar este formato para imagens com transparência se definir o SDK mínimo do seu projeto como 4.3 (API 18).

O Android Studio pode converter PNG, JPG, BMP ou imagens GIF estáticas para o formato WebP. Você pode converter imagens individuais ou pastas de imagens. Para converter uma imagem ou pasta de imagens, faça o seguinte:

  • Clique com o botão direito do mouse em uma imagem ou pasta de imagens, e então escolha a opção “Convert to WebP”.
  • A janela “Converting Images to WebP” vai se abrir, sendo que as configurações default dependem do SDK mínimo que estiver usando no app:
WebP Convert Image
WebP Convert Image
  • Selecione tanto lossy quanto lossless, sendo que lossless (sem perdas de qualidade) está disponível apenas com SDK mínimo 18+. Se você selecionar lossy (com perdas), defina a qualidade da codificação e se deseja ou não ver um preview da imagem convertida antes de salvar.
    Você também pode escolher pular a conversão de quaisquer imagens cuja versão final fique com tamanho maior da versão original, ou ainda imagens com transparência. Uma vez que o Android Studio somente permite criar imagens WebP transparentes se seu SDK mínimo for 18+, o checkbox “Skip images with transparency/alpha channel”é automaticamente selecionado se seu SDK mínimo for menor de 18.
  • Click OK para iniciar a conversão.  Se você está convertendo mais de uma imagem, a conversão é um passo único que não pode ser desfeito, tenha isso em mente.
    Se você selecionou a conversão lossless, a mesma acontecerá imediatamente. Suas imagens serão convertidas no lugar das originais. Se você selecionou lossy, continue lendo os passos abaixo.
  • Se você selecionou lossy, e escolheu ver o preview de cada imagem convertida antes de salvar, o Android Studio vai lhe mostrar cada imagem durante a conversão para que você inspecione o resultado. Caso contrário, ele fará a compressão de todas imagens automaticamente. Durante a etapa de preview, você pode ajustar a configuração de qualidade de cada imagem, como abaixo.
Qualidade da conversão
Qualidade da conversão

Na esquerda temos a imagem original, e na direita a comprimida, exibindo o tamanho dos arquivos (note um ganho de 68% nesse exemplo). Ajustando o slider você vê em tempo real as mudanças na imagem comprimida, sendo que na área central aparecem os pixels diferentes nelas.

#3 – Exporte seu apk por densidade de tela

Por padrão, o Android trabalha com as imagens para diferentes resoluções de tela tendo diferentes versões de cada imagem, certo? Isso é feito na pasta drawables, onde temos subpastas para densidades de tela como ldp, mdpi, hdpi, etc, conforme aumentam o tamanho e densidade das telas. Não é raro ter três versões de cada imagem o que, mesmo otimizadas, consome um grande espaço dentro do seu app.

Não seria muito legal se o seu app tivesse somente as imagens necessárias para o “tipo” de dispositivo no qual ele está sendo instalado? Assim, quem tem um Android low-end teria apenas pequenas imagens, enquanto que os usuários felizes de Androids high-end teriam apenas as imagens grandes.

Isso é possível de ser feito, usando o próprio Android Studio, mais especificamente usando o Gradle adequadamente. O Gradle é tão poderoso e versátil que não permite apenas criar apps com imagens diferentes, mas com código diferente também (usando ABI – Application Binary Interface)! Além disso, embora eu esteja mencionando aqui o recurso de exportar vários apks baseados em densidade de tela, você exportar vários apks baseado em variáveis de build também (mas isso fica para outro tutorial).

Para configurar seu build para múltiplos apks, adicione um bloco ‘splits’ no seu arquivo build.gradle a nível de módulo. Dentro do bloco ‘splits’, forneça um bloco ‘density’ que especifique como o Gradle deve gerar APKs por densidade. No seu bloco density, forneça uma lista de densidades de tela desejadas e tamanhos de tela compatíveis.

A lista de tamanhos de tela compatíveis deve somente ser usada se você precisa de elementos <compatible-screens> no manifesto de cada APK.

As opções seguintes do Gradle são usadas para configurar múltiplos APKs baseados em densidade de tela:

  • enable: se true, Gradle gera múltiplos APKs baseados nas densidades de tela que você definir. O valor default é false.
  • exclude/include: uma lista de densidades separadas por vírgula que o Gradle deve ignorar ou adicionar na geração de múltiplos APKs (serve para excluir as densidades que seu app não suporta).
  • reset(): limpa a lista default de densidades de tela. Use somente em conjunto com o elemento include. O exemplo a seguir define a lista de densidades para somente ldpi e xxhdpi chamando reset() para limpar a lista e depois usando include.

  • compatibleScreens: especifica uma lista de tamanhos de tela compatíveis separados por vírgula, injetando nós <compatible-screens> no manifesto de cada APK. Esta configuração fornece um jeito conveniente de gerenciar tanto densidade de tela quanto tamanho na mesma seção. Entretanto, tenha em mente que usar <compatible-screens> pode limitar os tipos de dispositivos nos quais o seu app irá funcionar.

Para garantir o máximo de compatibilidade, o Gradle sempre irá gerar um APK universal, mais “inchado”, que contém todos os recursos, independente de densidade, que servirá de fallback para os dispositivos que não se encaixem nos padrões estabelecidos. Esta versão universal deve ser publicada juntamente com as demais.

O exemplo seguinte gera um APK separado para cada densidade listada, exceto ldpi, xxhdpi, e xxxhdpi. Isto é feito usando exclude para remover três densidades da lista default.

Para mais detalhes de como distribuir o seu app para tipos específicos de telas e dispositivos, consulte este artigo.

Uma vez que você configure o seu build.gradle a nível de módulo para compilar múltiplos APKs, clique em Build > Build APK para compilar todos os apks para o módulo selecionado no painel Project. Para mais informações, consulte a documentação oficial.

E aí, o que achou do artigo de hoje? Conseguiu alguma economia no seu app? Coloque outras técnicas que você conhece nos comentários!

* OBS: curtiu o post? Então dá uma olhada no meu livro de Android clicando no banner abaixo pra aprender a criar outros tantos apps incríveis!

Criando apps para empresas com Android

Tutorial app Android com Firebase – Analytics e Crashes

Recentemente iniciei uma série de artigos sobre a plataforma Firebase para Android e hoje trago mais um, desta vez falando sobre a API de Analytics e de Crash Reporting deles.

Para quem não está acostumado com o termo, analytics é basicamente o registro e análise de dados dos seus usuários durante o uso de seu software. Ter uma boa ferramenta de analytics é essencial para entender o seu público e conseguir engajá-lo cada vez mais. Um público engajado tende a realizar comportamentos que você deseja como adquirir seus produtos, fazer upgrades ou até mesmo recomendar seu software/app para amigos.

Já Crash Reporting é o ato de registrar todos os ‘crashes’ do seu app nos dispositivos dos usuários, para entender o que está acontecendo e poder tomar providências para corrigir estas falhas. Sabe quando dá aquela mensagem de “O app parou!”? Pois é, o Crash Reporting te ajuda a descobrir que está acontecendo isso com seus usuários e dá muitas pistas da causa desses crashes.

Pré-requisitos

Este tutorial exige que você tenha um projeto Android criado e funcionando no Android Studio. Minha sugestão é que você realize o primeiro artigo da série, onde criei um app que tem apenas uma tela de login e permite o cadastro de usuários para posterior autenticação. Ele não faz nada demais ainda, mas já nos permitirá analisar o comportamento dos usuários que, por enquanto, sou apenas eu. 😀

Outro ponto importante de ler o artigo introdutório desta série é entender o que é a plataforma Firebase, como criar uma conta gratuita e como funciona o modus operandi dela.

Embora alguns possam acreditar que colocar coleta de dados nesta fase do desenvolvimento é inútil, eu discordo. Quanto antes você começar a coletar dados dos seus usuários melhor, e colocando nessa etapa do desenvolvimento você evita se esquecer, já cria o hábito de coletar dados e terá um histórico completo assim que tiver tempo para analisar o resultado do seu trabalho duro.

Vamos ver:

  1. Firebase Analytics
  2. Capturando eventos
  3. Analisando os dados
  4. Firebase Crash Reporting

#1 – Firebase Analytics

Existem diversas plataformas para coleta e análise de dados analíticos, como o Mixpanel, que eu já usei e excelente, mas hoje usaremos o Google Firebase. É importante que você já tenha uma conta criada no Firebase Console e um projeto ativo, que no meu caso é o ForcaVendas.

Firebase Console
Firebase Console

Agora abra o seu projeto de app no Android Studio e no meu Tools > Firebase, você abrirá o Firebase Assistant, com todas as opções de APIs que ele possui.

Selecione a opção Analytics e você deverá ver a tela abaixo:

Firebase Analytics
Firebase Analytics

No meu caso o passo 1 está marcado como “Connected” pois eu já me conectei na minha conta do Firebase no primeiro artigos desta série. Caso o seu tenha um botão para conectar no lugar, você terá de fazer todo um passo-a-passo que é bem simples, porém necessário.

Como eu já possuo uma conta no Firebase, vou partir para o passo 2, clicando no botão “Add Analytics to your app”, que abrirá um popup pedindo para aceitar algumas dependências novas no projeto. Tudo muito rápido e simples.

Uma vez com as dependências instaladas, é muito simples sair usando a ferramenta de Analytics no Firebase para capturar eventos dos usuários no seu app, que é o que faremos agora!

#2 – Capturando eventos

Você pode capturar todo tipo de ação do usuário no seu app para entender o comportamento dele. Muitas vezes é função do desenvolvedor apenas coletar os dados e cabe a um profissional de marketing digital, de UX, ou ambos, analisá-los, para propor mudanças no app visando melhorar a experiência do usuário como um todo. Geralmente são usadas ferramentas de marketing chamadas “funis de conversão”, que servem para analisar o fluxo de ações que os usuários realizam até comprarem seu produto ou executarem uma ação que você deseja muito.

Como nosso app até o momento possui poucas funcionalidades, podemos pensar em um funil de conversão bem simples: de todos os usuários que entram no app, quantos decidem se cadastrar e quantos de fato conseguem se cadastrar? Aqui considerarei usuários anônimos como o topo do meu funil (a boca, maior parte), usuários que clicam no botão Registrar como meio do meu funil (anônimos com intenção de cadastro) e novos cadastros realizados como a base do meu funil (a menor parte).

O objetivo do funil é medir as conversões, sendo usuários anônimos que viram novos cadastros a definição de ‘conversão’ neste caso. Sendo assim, precisamos coletar dados de 3 momentos distintos.

Primeiro, para permitir que o Firebase Analytics passe a funcionar no seu app, vamos começar adicionando a seguinte variável no topo da Activity que vamos coletar dados, neste caso a LoginActivity:

Depois, no evento onCreate desta mesma Activity, vamos inicializar o nosso objeto mFirebaseAnalytics:

As visualizações e transições de tela são automaticamente rastreadas pelo Firebase Analytics, então não há nada que precisamos fazer em relação ao screenview da tela de login por usuários anônimos.

No entanto, precisamos saber quando houve o clique no botão “Registrar”. Para capturar este clique, vamos na LoginActivity, bem no trecho de código que efetua o onClick, para adicionar o código de rastreamento:

O objeto Bundle permite que a gente adicione propriedades a este ‘evento’, mas aqui decidi por apenas registrar o evento em si como o nome ‘RegistrarClick’. Essa linha de código é interessante de ser colocada em todos os botões que você julga importantes no seu app, para entender se os usuários estão utilizando-os. Quando você detecta que botões importantes (como o botão de fazer Upgrade) não estão sendo utilizados, é hora de repensar o local onde estão, a cor e forma que possuem ou o texto contido neles. Somente com dados analíticos e vários testes é que é possível tirar essas conclusões.

Mas depois do usuário clicar no botão de Registrar eu quero coletar o evento se de fato ele conseguiu realizar o cadastro. Isso porque podem haver erros no cadastro como campos faltantes ou senha muito fraca que impedem o visitante anônimo de converter em usuário identificado. Para mapear este segundo evento,  basta modificarmos o método attemptLoginOrRegister da LoginActivity, mais especificamente o ‘if(isNewUser)’:

Com isso, temos todos os dados que precisamos para entender se os usuários anônimos, após manifestarem seu interesse em se cadastrar, estão conseguindo de fato. Note que armazenei dois eventos diferentes aqui: o de sucesso no registro (salvando o email do usuário que recém se cadastrou) e outro de falha, armazenando o email e senha, para entendermos porque o Firebase não permitiu esse cadastro.

Por que ele rejeitaria um cadastro? Existem diversas políticas e validações envolvidas que o Google Firebase pode fazer em cima de suas tentativas de cadastro como força de senha, formato de email, etc.

Agora teste o seu app e brinque um pouco com ele para gerar um pouco de dados para uma análise posterior.

#3 – Analisando os dados

Agora que temos eventos registrados e dados coletados, vá até o Firebase Console, acesse seu projeto e depois selecione a opção Analytics no menu lateral esquerdo. É importante ressaltar que os dados não são exibidos real-time aqui e é possível que demore a serem exibidos, até 1 dia, então não se preocupe.

Analytics Dashboard
Analytics Dashboard

Uma vez que os dados já estejam disponíveis para visualização, você pode criar filtros, acompanhar conversões, analisar cohorts, tempo de visita em cada tela, além de muitos dados demográficos, tais como:

  • porcentagem de usuários por versões do Android;
  • porcentagem de usuários por aparelho;
  • sexo dos usuários;
  • localização geográfica dos usuários;
  • idade;
  • categorias de interesse;

E isso só citando as informações que aparecem no dashboard, existe muito mais coisas interessantes para se explorar nesse ferramenta de analytics. Quem já conhece o Google Analytics, que é a ferramenta mais usada na web para acompanhar os dados analíticos de websites e sistemas web vai se sentir em casa aqui.

#4 – Firebase Crash Reporting

Além dos eventos que queremos coletar para entender o comportamento dos nossos usuários, é importantíssimo saber quando o app pára de funcionar no dispositivos deles, visando entender as limitações que podem estar prejudicando a experiência, as falhas que você pode ter deixado para trás sem querer ou até mesmo como está a qualidade geral do seu app.

Para ativar o Crash Reporting do Firebase é muito simples. No Android Studio, vá no menu Tools > Firebase e o Firebase Assistant se abrirá. Escolha a opção Crash Reporting.

Firebase Crash Reporting
Firebase Crash Reporting

Minha conta do Firebase já está conectada e, à essa “altura do campeonato”, você já deve saber como criar a sua caso ainda não tenha feito. Clique no botão “Add Crash Reporting to your app” e aceite a instalação das dependências necessárias.

O recurso de Crash Reporting funciona automaticamente para exceções não tratadas e você pode manualmente registrar exceções tratadas, se assim desejar, para entender o comportamento do usuário ou as exceções mais disparadas, para tomar medidas quanto a isso.

Enviar exceções manualmente para o Crash Report é simples como a linha abaixo demonstra, onde ex é o objeto de exceção capturado:

Para poder ver um crash facilmente no Firebase Console, experimente rodar o seu app e antes de realizar um login ou cadastro, desligue sua Internet para que não seja possível se comunicar com a nuvem do Google Firebase, certamente seu app vai quebrar e um crash será registrado no Firebase Console, não instantaneamente, mas em breve.

Crash
Crash

Caso esteja tendo problemas para rastrear seus crashes em produção, é sugerido dar uma lida nesta página aqui.

O Google está migrando sua ferramenta de análise de crashespara o Crashlytics, uma plataforma focada nesse tipo de serviço, então no futuro talvez seja mais interessante para você deixar de usar os relatórios de crashes do Firebase e passar a usar esta outra ferramenta.

Espero que tenha gostado do artigo, e  até a próxima!

* OBS: curtiu o post? Então dá uma olhada no meu livro de Android clicando no banner abaixo pra aprender a criar outros tantos apps incríveis!

Criando apps para empresas com Android

Tutorial app Android com Firebase – Autenticação

Lembro quando comecei a trabalhar com a plataforma Android em 2012 e me deparei com todo tipo de desafio inédito para mim, sendo o principal deles a necessidade de ficar construindo todo o tipo de APIs usando tecnologias web para serem consumidas pelo seu app. Preciso acessar o banco de dados remoto? Cria API. Precisa de autenticação? Cria API. Precisa de algum processamento mais pesado? Cria API.

Tem algum tempo que isso mudou. Com a aquisição da startup Firebase, o Google disponibilizou uma plataforma de backend-as-a-service pronta para uso em todo tipo de aplicação. E a ideia deste tutorial completo dividido em etapas, é criarmos um app Android que use as APIs fornecidas pelo Firebase para lhe ajudar a entender todo o poder desta plataforma.

Começaremos com a autenticação, mas passaremos por cada uma das grandes frentes do Firebase. Para o artigo de hoje veremos:

  1. Introdução ao Firebase
  2. Firebase Authentication
  3. Forçar a autenticação
  4. Permitir o registro
  5. Realizando o Login
  6. Realizando o Logout

Em outros artigos devo cobrir as demais APIs do Firebase como Database, Storage, Analytics, Crash, Messaging e Ads.

Atenção: se você nunca programou para Android antes, sugiro fazer primeiro este tutorial aqui e/ou ler meu livro de Android.

Vamos lá!

#1 – Introdução ao Firebase

Basicamente o Google Firebase é uma plataforma de Backend-as-a-Service, fornecendo um set de recursos prontos para usar em APIs e SDKs que permitem ao desenvolver Android se focar na construção do seu app, sem se preocupar com desenvolvimento de backend, banco de dados, etc. Com um modelo de negócio escalável, permite que você comece seu app sem pagar nada e depois ir pagando conforme a sua base de usuários cresce.

Pré-requisitos

Para poder usar em apps Android é necessário que o dispositivo possua a versão 4.0 ou superior, e o Google Play Services 11.0.4 ou superior. Também é necessário que você tenha instalado na sua máquina o Google Play Services do Repositório do Google, disponível no SDK Manager do Android Studio. E sim, é necessário usar o Android Studio versão 1.5 ou superior.

Existem duas formas de adicionar Firebase ao seu projeto Android no Android Studio. Uma é inserindo as dependências manualmente no arquivo build.gradle. A outra, mais moderna e disponível no Android Studio a partir da versão 2.2, é usando o Firebase Assistant, que é a que usarei neste tutorial.

Criando o projeto

Nós vamos criar um app de força de vendas. Trabalhei com isto em 2007, no meu primeiro emprego oficialmente como programador (antes disso trabalhava com suporte, mas também programava). Basicamente imagine que representantes de vendas que trabalham na rua possam abandonar suas agendas físicas e usar esse app para registrar as vendas realizadas, os pedidos solicitados e que possam tirar relatórios simples de pedidos, vendas e dívidas. Nesse momento de desemprego no país em que muita gente está trabalhando por conta principalmente como representantes autônomos (Hinode, Mary Kay, Jequiti, etc), um app desses pode ajudar muita gente.

Crie no Android Studio um projeto chamado ForcaVendas, com SDK mínimo Android 4.0.3 (API 15) e uma Basic Activity por padrão (MainActivity). A partir de agora criaremos todo o app de força de vendas usando cada um dos recursos fornecidos na plataforma Firebase.

Atenção!

Uma última dica, antes de partir pro código: se for usar o emulador nativo do Android para os testes, certifique-se de criar seu AVD usando uma imagem que possua a Play Store instalada (a imagem abaixo mostra o ícone da Play Store em algumas imagens), para que o Google Play Services possa ser atualizado facilmente (uma das exigências do Firebase é ter a última versão do Google Play Services instalado).

Imagens com Play Store
Imagens com Play Store

#2 – Firebase Authentication

Nosso app exigirá autenticação do vendedor. Isso porque como nossos dados serão armazenados na nuvem do Google, temos que saber quem está autenticando no app para carregar os dados das vendas e prospecções deste usuário específico.

Adicione uma nova Activity do tipo Login Activity no seu projeto, como abaixo:

Login Activity
Login Activity

Depois disso, vá no menu Tools > Firebase e o Firebase Assistant se abrirá, com diversas opções. Vamos começar usando os recursos de autenticação do Firebase clicando na opção Authentication > Email and password authentication.

Firebase Authentication
Firebase Authentication

O Firebase Assistant abrirá um passo-a-passo para configurar o uso desse recurso no seu projeto. O primeiro passo é conectar seu app ao Firebase, o que você faz clicando no botão “Connect to Firebase”.

Passo 1: Connect ro Firebase
Passo 1: Connect ro Firebase

Ao clicar no botão, você será levado ao site do Google Accounts para fornecer permissões ao Firebase na sua conta do Google. Se tudo aconteceu corretamente, você deve ver a tela de sucesso informando que você já pode voltar ao Android Studio.

Firebase conectado
Firebase conectado

Quando voltar ao Android Studio, você terá de configurar um novo Firebase Project, que basicamente é o seu projeto de backend. Use o mesmo nome do seu projeto (ForcaVendas) e selecione a região Brazil, clicando no botão “Connect to Firebase” para continuar, como abaixo.

Configuração do Firebase
Configuração do Firebase

Nesse momento o Android Studio baixará algumas dependências necessárias e adicionará as configurações das mesmas no seu build.gradle, tudo isso sem que você tenha de saber muitos detalhes do processo. Quando esse processo automático terminar, o Firebase Assistant deve exibir que o Firebase está conectado e você deve passar para o passo 2, “Add Firebase Authentication to your app”.

Add Firebase Authentication to your app
Add Firebase Authentication to your app

Ao clicar no botão o Android Studio lhe apresentará algumas modificações que serão feitas automaticamente para você confirmar. Confirme e aguarde que as alterações se completem para ver que o passo 2 informará que as dependências foram instaladas corretamente.

Dependências corretamente instaladas
Dependências corretamente instaladas

Note que há uma descrição adicional logo abaixo do passo 2, que informa que você deve habilitar no Firebase Console o Sign-In Method que será utilizado no seu app.

Sendo assim, acesse o Firebase Console, que é o software web usado para gerenciar seus projetos Firebase. No nosso caso, basta clicar no projeto ForcaVendas, como na imagem abaixo:

Firebase Console
Firebase Console

No meu lateral, selecione a opção Authentication e depois clique no botão “Configurar Método de Login”.

Método de Login
Método de Login

Escolha a opção Email & Senha e clique em ativar, salvando logo em seguida. Existem diversas outras opções, como usar Facebook Auth ou Google Auth, por exemplo. Aqui usaremos o bom e velho “email e senha”.

A partir do passo 3, o processo é manual, pois o Firebase Assistant apenas ensina como utilizar o recurso de autenticação no seu app, então vamos programar!

#3 – Forçar a autenticação

Quando nosso app foi criado, definimos que a MainActivity seria a activity inicial, lembra?

Pois é, mas caso o usuário não esteja autenticado em nosso app ele não deve ver a MainActivity primeiro, mas sim a LoginActivity. Então, vamos começar a programar nossa autenticação verificando na MainActivity se o usuário está logado. Se ele não estiver, vamos redirecioná-lo para a LoginActivity.

Para começar, na sua MainActivity.java coloque a seguinte variável a nível de classe (imports serão necessários, use o recurso ALT+ENTER do Android Studio para auto completar as dependências):

E agora dentro do seu onCreate da MainActivity, coloque o seguinte código que verifica se há um usuário logado no app e, caso contrário, redireciona o fluxo para a LoginActivity:

Neste código nós carregamos a instância atual da autenticação do Firebase (FirebaseAuth) e com ela, tentamos carregar o usuário atualmente autenticado. Se ele estiver null, é porque ninguém está autenticado neste app neste dispositivo.

Com isso, você vai notar que ao mandar rodar o app, mesmo a MainActivity sendo a principal, você deverá ver primeiro a LoginActivity, pois não está autenticado. Na verdade nem mesmo você possui um usuário, o que faremos no passo seguinte.

Tela de Login
Tela de Login

#4 – Permitir o registro

A própria LoginActivity já considera a possibilidade do auto-registro por parte do usuário que ainda não está cadastrado no app. Dependendo das suas necessidades de segurança (e de cadastro), você pode querer fazer algo diferente do que vou fazer aqui, mas a ideia é basicamente o que vou mostrar.

Quando criamos uma Activity com o padrão LoginActivity, o Android Studio não cria apenas o layout XML de uma tela de login, mas toda uma lógica básica de autenticação na LoginActivity.java, que inclui validação de campos, autenticação via coleção in-memory e algumas coisas mais. Vamos modificar algumas coisas presentes neste exemplo para que fique mais funcional.

Primeiro, abra o activity_login.xml na pasta res/layout para mudarmos o texto do botão de Sign In, sua cor de fundo e para adicionarmos um segundo botão para Sign Up (registro ou cadastro), ficando da seguinte forma:

Vamos começar nossa programação declarando a variável abaixo a nível de classe na LoginActivity.java:

Para aproveitar o código já existente, vamos modificar o método attemptLogin para que ele sirva para signin ou signup, de acordo com um parâmetro passado à ele.

Note que apenas alterei a assinatura do método e criei um if que verifica se é um novo usuário ou não, que está tentando se autenticar/registrar. Se for um novo cadastro (o usuário clicou no botão Registrar), nos comunicamos com o FirebaseAuth para criar um usuário com email e senha informados (createUserWithEmailAndPassword). Quando essa criação terminar (o que depende de Internet sempre pode demorar um pouco), escondemos o loader e exibimos uma mensagem de texto ao usuário informando que agora ele pode se autenticar com o usuário e senha criados.

Com essas mudanças no método, incluindo sua assinatura, vamos mudar no onCreate da LoginActivity as chamadas ao antigo attemptLogin e também vamos adicionar o listener de onClick ao botão de signup:

Note que aproveitei para instanciar a variável mAuth com a instância atual de autenticação do Firebase. Note também que nenhum dos dois botões de fato faz alguma coisa, mas sim que delega ao attemptLoginOrRegister que tem o ‘if’ que expliquei anteriormente.

Agora mande rodar sua aplicação, preencha os dois campos e clique no segundo botão, o de registrar.

Nova tela de login
Nova tela de login

Você deve ver o loader aparecer por alguns segundos e sumir, voltando à tela de login com uma mensagem de texto (Toast) dizendo que você já pode se autenticar. Não vai funcionar o login, porque não programamos ele ainda (oque vamos fazer no próximo passo), mas antes de falar disso, vamos ver como sabemos os usuários da nossa aplicação.

Volte ao Firebase Console, na aba Authentication você deve ver os usuários já cadastrados e inclusive poderá realizar cadastro manual se quiser.

Usuários registrados
Usuários registrados

Uma dica legal é enviar por email ao usuário um email de boas vindas, falando das features do seu app e informando a senha que ele escolheu. Você pode aprender como enviar emails em Android neste tutorial aqui.

#5 – Realizando o login

Agora vamos programar o login!

Para fazer isso, basta modificarmos o ‘if’ que deixamos pronto no método attemptLoginOrRegister anteriormente.

Note que a alteração foi somente no ‘else’, onde uso o método assíncrono signInWithEmailAndPassword que vai no servidor do Firebase, verifica a autenticidade das informações fornecidas e retorna um usuário, se existir, que tenha aquele email e senha. Neste caso, enviamos o usuário para a MainActivity, caso contrário, exibimos uma mensagem de erro pra ele.

Rode novamente seu projeto e, se tudo deu certo, você deve conseguir se autenticar com um usuário criado no Firebase Console ou mesmo no próprio app, usando o botão Registrar.

#6 – Realizando o Logout

Para terminar este primeiro artigo sobre Firebase e para concluir todo o processo de autenticação, devemos permitir que o usuário consiga ‘sair do app’, pois do jeito que está hoje, você se autentica uma vez e ele fica sempre logado. Para isso, vamos usar o menu superior direito da tela MainActivity, onde hoje há apenas um menu falso de Settings.

Vamos começar trocando o texto de Settings para Sair. Vá na pasta res/menue altere o arquivo menu_main.xml para ter um id e texto mais condizente com um menu Sair:

E agora, na MainActivity.java, procure pelo método onOptionsItemSelected, que faz o tratamento de itens selecionados de menu, alterando-o para que caso o item de Sair seja selecionado, vamos pedir ao Firebase que faça o signout e depois redirecionamos o usuário de volta à tela de Login:

Teste agora: se autentique usando um usuário já existente e depois selecione a opção Sair no menu superior direito do app para ser direcionado de volta à tela de Login.

Com isso finalizamos o primeiro de uma série de artigos sobre a plataforma Firebase que devem aparecer aqui no blog. Espero que tenham gostado!

Quer ler o próximo? Clica neste link!

* OBS: curtiu o post? Então dá uma olhada no meu livro de Android clicando no banner abaixo pra aprender a criar outros tantos apps incríveis!

Criando apps para empresas com Android