(pt-BR) Apresentação que expõe de forma leve e didática o desenvolvimento de aplicativos e protótipos Android levando em consideração tempo e qualidade.
Apresentada internamente no SIDI - CAmpinas
8. Você já está chegando? Você já está chegando?
Não esqueça o pão Não esqueça o pão
OK OK
Ad
Pão fresco é na padaria do Manuel!
9. Esforço
• Máquina servidora
– Instalação e manutenção de ambiente LAMP em máquina hospedada
– API para login
– API para armazenamento de mensagem
– API para armazenamento de imagens
– API para recuperação de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Construção de módulo de login
– Construção de módulo de comunicação HTTP
– Construção de módulo de conversão JSON <-> java objects
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
10. • Máquina servidora
– Instalação e manutenção de ambiente LAMP em máquina hospedada
– API para login
– API para armazenamento de mensagem
– API para armazenamento de imagens
– API para recuperação de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Construção de módulo de login
– Construção de módulo de comunicação HTTP
– Construção de módulo de conversão JSON <-> java objects
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
11. • Máquina servidora
– Instalação e manutenção de ambiente LAMP em máquina hospedada
– API para login
– API para armazenamento de mensagem
– API para armazenamento de imagens
– API para recuperação de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Construção de módulo de login
– Construção de módulo de comunicação HTTP
– Construção de módulo de conversão JSON <-> java objects
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
12. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API para login
– API para armazenamento de mensagem
– API para armazenamento de imagens
– API para recuperação de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Construção de módulo de login
– Construção de módulo de comunicação HTTP
– Construção de módulo de conversão JSON <-> java objects
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
13. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API para login
– API para armazenamento de mensagem
– API para armazenamento de imagens
– API para recuperação de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Construção de módulo de login
– Construção de módulo de comunicação HTTP
– Construção de módulo de conversão JSON <-> java objects
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
14. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API para armazenamento de mensagem
– API para armazenamento de imagens
– API para recuperação de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Construção de módulo de comunicação HTTP
– Construção de módulo de conversão JSON <-> java objects
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
15. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API para armazenamento de mensagem
– API para armazenamento de imagens
– API para recuperação de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Construção de módulo de comunicação HTTP
– Construção de módulo de conversão JSON <-> java objects
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
16. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API REST para GET e POST de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Adição de biblioteca para consumo de API REST (Retrofit +
Gson)
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
17. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API REST para GET e POST de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Adição de biblioteca para consumo de API REST (Retrofit +
Gson)
– Construção de módulo de exibição e cache de imagens
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
18. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API REST para GET e POST de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Adição de biblioteca para consumo de API REST (Retrofit +
Gson)
– Adição de biblioteca para exibição e cache de imagens (Glide)
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
19. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API REST para GET e POST de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Adição de biblioteca para consumo de API REST (Retrofit +
Gson)
– Adição de biblioteca para exibição e cache de imagens (Glide)
– Construção de módulo de polling por novas mensagens
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
20. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API REST para GET e POST de mensagens
– Otimizações do DB para troca de mensagens
– Envio de push notifications (GCM)
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Adição de biblioteca para consumo de API REST (Retrofit + Gson)
– Adição de biblioteca para exibição e cache de imagens (Glide)
– Adição de biblioteca para Recebimento de push notifications (GCM)
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
21. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API REST para GET e POST de mensagens
– Otimizações do DB para troca de mensagens
– Envio de push notifications (GCM)
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Adição de biblioteca para consumo de API REST (Retrofit + Gson)
– Adição de biblioteca para exibição e cache de imagens (Glide)
– Adição de biblioteca para Recebimento de push notifications (GCM)
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
22.
23. • Máquina servidora
– LAMP stack rodando em Amazon EC2
– API REST para GET e POST de mensagens
– Otimizações do DB para troca de mensagens
– Envio de push notifications (GCM)
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para SSN Login (Facebook Sign In)
– Adição de biblioteca para consumo de API REST (Retrofit + Gson)
– Adição de biblioteca para exibição e cache de imagens (Glide)
– Adição de biblioteca para Recebimento de push notifications (GCM)
– Adição de biblioteca para exibição de Ads (AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting (Crittercism)
24. • Aplicativo Android
– Construção de interface
– Adição de biblioteca para exibição e cache de
imagens (Glide)
– Adição da biblioteca Firebase
25. • Máquina servidora
– Instalação e manutenção de ambiente LAMP
em máquina hospedada
– API para login
– API para armazenamento de mensagem
– API para armazenamento de imagens
– API para recuperação de mensagens
– Otimizações do DB para troca de mensagens
• Aplicativo Android
– Construção de interface
– Construção de módulo de login
– Construção de módulo de comunicação
HTTP
– Construção de módulo de conversão JSON
<-> java objects
– Construção de módulo de exibição e cache
de imagens
– Construção de módulo de polling por novas
mensagens
– Adição de biblioteca para exibição de Ads
(AdMob)
– Adição de biblioteca para Analytics (Flurry)
– Adição de biblioteca para crash reporting
(Crittercism)
• Aplicativo Android
– Construção de interface
– Adição de biblioteca para
exibição e cache de
imagens (Glide)
– Adição da biblioteca
Firebase
31. // Write a message to the database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("message");
myRef.setValue("Hello, World!");
32. // Register a listener for a reference of the DB
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
Log.d(TAG, "Value is: " + value);
}
@Override
public void onCancelled(DatabaseError error) {
Log.w(TAG, "Failed to read value.", error.toException());
}
});
33. // Upload a data stream to Storage
InputStream stream = new FileInputStream(new
File(“path/to/images/my_image.jpg"));
UploadTask uploadTask = mountainsRef.putStream(stream);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
}
}).addOnSuccessListener(new
OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot)
{
Uri downloadUrl = taskSnapshot.getDownloadUrl();
}
});
Princípio de Pareto
80% dos efeitos são gerados a partir de 20% das causas
“Arquitetura Serverless” ou “Desenvolvimento Serverless”
Firebase começou em 2011 como uma startup. Na época, ela possuia o serviço de Realtime database, hosting e autenticação.
Em 2014, o Firebase foi comprado pelo Google. A partir da compra, não houve mais notícias da plataforma, até o anúncio no Google I/O 2016
O google detectou que uma queixa de programadores Android era a manutenção de diversos SDKs diferentes, além da necessidade de acesso a Dashboards diferentes para acesso à informações. Com isso, nos últimos 2 anos, reuniu as principais ferramentas em um único pacote, o novo Firebase, que é acessado via um único Dashboard.
Banco de dados NoSQL compartilhado, distribuido em tempo real
Autenticação multi-plataforma
Hosting
Cloud messaging
Armazenamento de dados
Test Lab
Crash reporting
Links dinâmicos
Advertisement
Configuração em tempo real
Analytics
Vamos tentar fazer um exercício. O que precisamos para contruir um app como o exemplificado?
Manter uma máquina dedicada em um servidor é caro, trabalhoso e ineficiente. A máquina vai ficar muito tempo ociosa, vai ter que ser configurada e, caso haja algum pico de requisição, não poderá atender. Além de que ela pode cair, prejudicando o funcionamento do serviço
Existem serviços como o da Amazon onde você pode ter disponibilidade de cloud server baseado em demanda, pagando apenas pela capacidade utilizada (inclusive tendo um serviço gratuito em determinadas condições). Esse serviço garante um uptime, maior facilidade de instalação e elasticidade
O módulo de login é um mal necessário, pois precisamos identificar unicamente nossos usuários, porém é uma solução que é cada vez menos usada. Usuários evitam criar contas novas para cada serviço ou aplicativo, pois cada conta é uma nova senha que deve ser lembrada, além de ser um novo ponto suscetível a quebras de segurança. Além disso, é uma implementação complicada, que normalmente envolve protocolos de segurança na comunicação e que não traz valor agregado ao produto
Ainda que numa solução final não seja uma boa ideia trocar o login tradicional por um login de SSN, uma vez que usuários podem não ter a conta de SSN pedida, para um protótipo é totalmente aceitável e incentivado, tornando o processo de login mais seguro, prático e simples, tanto pro usuário quanto pro desenvolvedor
A construção de APIs de servidor pode ser caótica. Mudanças no servidor podem acarretar em grandes mudanças no client. Além disso, todo um protocolo de comunicação deve ser estabelecido (e cumprido por ambas as partes), e barreiras como cookies, autenticação, tempo de sessão, compressão de dados, entre outros muitos problemas não planejados, podem (e vão) surgir durante a implementação
Padronizando as APIs do servidor em um formato REST, conseguimos minimizar o tamanho das respostas e diminuir os pontos de atrito utilizando bibliotecas que consomem uma API rest, mapeando-a em objetos java e tratando callbacks de forma simples, abstraindo comunicação e protocolos.
Imagens podem ser muito pesadas para um app e problemas como baixa performance, ou pior, crashes por falta de memória, não são raros. É necessária a implementação cuidadosa de um módulo responsável para exibição, cache de imagens e gerenciamento de memória
Alternativamente, existem bibliotecas especializadas e comprovadas no mercado, que facilitam muito a utilização e gerenciamento de imagens em apps
A prática de polling, apesar de ainda ser comum, é muito ruim. Essa técnica causa utilização excessiva de bateria e rede do usuário para checar por atualizações em um servidor.
Serviços como o Google Cloud Message (GCM) possibilitam a comunicação Servidor -> Cliente, com APIs e callbacks simples para implementação e serviço gratuito (em cenários razoáveis de utilização)
Tipos suportados:
String
Long
Double
Boolean
Map<String, Object>
List<Object>
Um mesmo código será produzido por (idealmente) 3 desenvolvedores diferentes, com pressa, e que talvez nunca tenham trabalhado juntos antes.
É necessário que exista uma preocupação para que o código não apodreça e se perca muito tempo com side-effects (o foco tem que ser sempre no CORE)
O padrão MVP é um entre vários padrões possíveis de arquitetura de apresentação de software (e o meu favorito)
Cada elemento de UI cria e passa seus eventos para o seu Presenter;
O presenter deve conter a lógica de apresentação desse elemento de UI;
O presenter atualiza os objetos de Model assíncronamente;
O modelo realimenta o presenter com os resultados da sua atualização;
O presenter atualiza a View;
Pontos extras para presenters que não mantém estado e podem ser recriados
Pontos extras para presenters que “não sabem” que fazem parte de um app android
Não deixar de lado a estética para favorecer um protótipo recheado de funcionalidades
Seu projeto será usado (e avaliado) por humanos, que gostam de padrões, de consistência, de beleza