1. O documento resume as principais novidades do Android em 2023 anunciadas na conferência Google I/O, incluindo melhorias no Jetpack Compose como novos componentes, desempenho e bibliotecas.
2. Também apresenta novas funcionalidades para telas grandes como adaptação de apps, práticas recomendadas e ferramentas de teste.
3. O documento discute formas de lidar com mudanças de configuração e recriação de activities para manter o estado da aplicação, como View Model, Data Store e Saved State APIs.
7. Jetpack Compose
• Melhoria de 22% na performance dos Modifiers
• Melhorias e bug
fi
xes em Text e TextField
• Novos layouts:
• Pager (HorizontalPager e VerticalPager)
• Flow (FlowRow e FlowColumn)
• Novas bibliotecas:
• Glide (https://bumptech.github.io/glide/int/compose.html)
• Google Maps (https://github.com/googlemaps/android-maps-compose)
8. Jetpack Glance
• O Jetpack Glance é um framework sobre
o Compose que permite desenvolver e
projetar widgets.
• https://developer.android.com/jetpack/
compose/glance
10. Compose for TV (Alpha)
• Componentes especí
fi
cos pra TV
• TvLazyRow, TvLazyGrid,
TvLazyColumn, SideNavigation,
Content Cards, Carousel,
ImmersiveList, etc.
13. Crie experiências únicas em telas grandes
Usuários gostam de ter uma experiência diferenciada em dispositivos
maiores.
14. Adapte seu app para telas grandes
Quanto mais bem avaliado seu aplicativo for em um dispositivo, mais ele será
recomendado no Google Play em dispositivos da mesma categoria.
16. Práticas recomendadas pra telas grandes
• Testar aplicação usando mouse, trackpad, stylus e teclado físico.
• Usuários de tablets e foldables devem poder compartilhar informações
entre apps quando estiverem em split mode (drag and drop, copy & paste)
• Eventos de mouse devem funcionar, tais como menus secondários (right
click), scroll to zoom, mouse hover, etc.
• Tente fazer o app de modo a
fi
car como uma aplicação web ou desktop.
20. Activity Embedding
• Permite incluir duas activities na tela
• Útil para aplicativos que usam
navegação baseada em Activity
https://developer.android.com/guide/topics/large-screens/activity-embedding
23. Salve o estado do seu app!
• Quando a aplicação ou activity é destruída e recriada você deve restaurar o
estado anterior rapidamente para proporcionar uma boa experiência para o
usuário.
• Na maioria dos casos, os usuários esperam que o estado da UI permaneça
o mesmo.
24. Repitam comigo:
"É impossível evitar TODOS os casos
em que a activity deve ser recriada.”
Algumas con
fi
gurações SEMPRE
recriarão a activity.
26. Mudança de con
fi
guração
• Quando a aplicação está em execução e ocorre
uma mudança de con
fi
guração, a activity é
recriada com a nova con
fi
guração.
• Essas con
fi
gurações podem ser:
• Orientação da tela (portrait/landscape)
• Redimensionar a janela (Chromebook)
• Entrar ou sair do modo multi-window
• Alternar entre os modos Light e Dark.
• Entre outros…
27. Mudança de con
fi
guração
• View Model
• Recomendação do Google para manter o estado da UI, pois é o única maneira
suportada (o
fi
cialmente) para que objetos arbitrários sobrevivam às mudanças de
con
fi
guração.
• É mantido em memória
• Limitado apenas pela quantidade de memória do aparelho
• Muito rápido para ler/escrever os dados
• A biblioteca de navegação faz o cache dos View Models caso eles estejam na
backstack
28. Encerramento inesperado
• O usuário ou o S.O. pode encerrar a
aplicação abruptamente.
• O usuário pode remover a aplicação do
menu de recentes.
• Forçar a parada nas con
fi
gurações do
aparelho.
• A aplicação pode ter sido atualizada em
background.
29. Encerramento inesperado
• Armazenamento persistente
• Data Store
• Para dados simples e pequenos
• Room
• Para dados mais complexos
• Deve ser armazenado dados da aplicação, não de UI!
• Os dados são armazenados “em disco” limitando sua capacidade ao espaço disponível no
dispositivo
• Como necessita realizar operações de I/O, é mais lento
30. Sistema precisa de recursos
• Quando sua aplicação está em
background e o sistema precisa de
recursos.
• Quando o sistema está
fi
cando sem
memória, ele fará o possível para manter
seu app em memória, mas isso não é
garantido
• O S.O. pode “matar" a aplicação para
liberar memória, tendo em vista que o
usuário está interagindo com outras
aplicações.🤷
31. Sistema precisa de recursos
• Saved State APIs possui opções pra Compose, View system e View Model
• Sobrevive às mudanças de con
fi
guração e quando o sistema necessita de recursos.
• Os dados são armazenados em memória, mas caso haja necessidade, são persistidos em
arquivo.
• Tem um tamanho limitado. A recomendação é não exceder 50Kb
• A leitura/escrita pode ser lenta dependendo da complexidade do que está sendo armazenado
• Não armazene objetos grandes ou listas! O processo de serialização e deserialização é feito na
main thread!
• Armazene dados transientes que dependem da navegação ou input do usuário, como: posição
do scroll, ID do item na tela de detalhes, Texto de um input do usuário, etc.
32. Saved State APIs
• Jetpack Compose
• rememberSaveable
• Teste com StateRestorationTester
• View system
• onSaveInstanceState
• Teste com ActivityScenario.recreate()
• View Model
• SavedStateHandle (a informação só é salva no onStop)
34. Con
fi
g changes
• Dispositivos têm
con
fi
gurações diferentes e
essas con
fi
gurações podem
mudar durando o uso.
• Essas con
fi
gurações podem
ser obtidas na Activity, via
atributo resources.
35. Con
fi
g changes
• No Compose, as con
fi
gurações podem ser obtidas via
LocalConfiguration.
Dispara recomposição quando a
con
fi
guração muda
36. Modo Compatibilidade
• Acontece quando você coloca restrições às mudanças de con
fi
guração.
• Duas maneiras de entrar no modo de compatibilidade
37. Modo Compatibilidade
• Se uma restrição for aplicada e a
con
fi
guração do dispositivo não for
compatível, o sistema colocar o
aplicativo no modo compatibilidade.
• Isso permitirá todas as aplicações
executarem tanto em portrait
quanto em landscape, e também no
modo multi-window.
• As mudanças de con
fi
guração
serão recebidas da mesma forma.
38. Recomendação
• Não estabelecer restrições
de orientação ou
redimensionamento de tela.
• Adicionar essas restrições
não é a maneira de evitar o
ciclo de vida da aplicação.
39. Ferramentas
• Use o foldable emulator para testar como sua aplicação funciona ao dobrar
e desdobrar o aparelho.
• Use o Freeform/Desktop emulator (Chromebook) para testar o
redimensionamento da janela do aplicativo, minimizar, maximizar, eventos
de mouse (hover, right-click, scroll, scroll-to-zoom) e teclado físico.
• Resizable emulator é um "3 em 1": phone, tablet e unfolded foldable
40. Ferramentas
• Device Mirroring in Android Studio (requires Electric Eel or later). Permite
interagir com o device dentro do Android Studio. 🤔
• É tipo o scrcpy (https://github.com/Genymobile/scrcpy) dentro do Android
Studio
• Rotação da tela; Alterar o volume; Lock/Unlock the phone; Turn the
display on/off; acessar os controles de navegação; e fazer screen
recording
41. Multi Previews for Jetpack Compose
annotation class Preview(
val name: String = "",
val group: String = "",
@IntRange(from = 1) val apiLevel: Int = -1,
val widthDp: Int = -1,
val heightDp: Int = -1,
val locale: String = "",
@FloatRange(from = 0.01) val fontScale: Float = 1f,
val showSystemUi: Boolean = false,
val showBackground: Boolean = false,
val backgroundColor: Long = 0,
@UiMode val uiMode: Int = 0,
@Device val device: String = Devices.DEFAULT,
@Wallpaper val wallpaper: Int = Wallpapers.NONE,
)
44. Automated Testing Tools
• É possível usar Gradle Managed Devices para iniciar emuladores com
con
fi
gurações diferentes e rodar a suíte de testes em todos eles.
• Diferentes dispositivos requerem testes diferentes baseado no tamanho da
tela. Mas como de
fi
nir os testes que rodarão em cada device?
46. Espresso Device API
• Permite controlar o emulador diretamente do código de teste. Pode-se usar
telefones, tablets, foldables rodando Android API 24 ou superior.
• Com essa API é possível de forma síncrona: rotacionar, dobrar/desdobrar e
redimensionar o dispositivo durante o teste. Garantindo que seu aplicativo
trata as mudanças de con
fi
guração corretamente.
• Permite de
fi
nir regras para que não sejam executados testes em
dispositivos onde o teste certamente falhará. Por exemplo: não executar
testes de dobrar/desdobrar em dispositivos que não sejam foldables.
55. Soluções de Teste
• É possível escalar os testes para uma diversidades de dispositivos
utilizando o poder do Gradle Managed Devices e Firebase Test Lab.
• Com os testes de screenshot é possível veri
fi
car rapidamente regressões
em UIs feitas em Compose, pois as mudanças são apontadas visualmente.
56. Firebase Test Lab
• É possível rodar testes em dispositivos reais disponíveis no Firebase Test
Lab. Inclusive é possível criar grupos de aparelhos para rodar os testes.
• Os resultados podem ser visualizados em HTML, proto
fi
le no Android Studio
ou no Firebase Console
• Fique atento aos custos de rodar testes em vários aparelhos.
57. Screenshot tests
• Como feature experimental do Android Gradle Plugin será possível
converter os Previews dos Composables do Android Studio em imagens
de referência para testes de screenshot.
• Os screenshots
fi
carão em
Projeto/app/src/screenshotTest
• O comando do Gradle gerará as imagens de referência baseado nos
@Preview
60. Roadmap
• Network Inspector Tra
ffi
c Interception
• Themed App Icons Preview
• Lint Support for SDK Extensions
• Dynamic Color in Compose Preview
• Build Analyzer Task Categorization
• App Quality Insights v2
• Templates: Compose & Material 3
61. Next releases
Giraffe - Stable!!!🎉 Hedgehog - Canary
https://developer.android.com/studio/preview
62. New features
• Device Explorer
• New UI
• Kotlin DSL & Version Catalog Build
• Per-app language preferences
support in Android Gradle plugin
• Live Edit for Jetpack Compose
• Gradle Version Catalog
• Download Impact in Build Analyzer
• Jetpack Compose Animation Preview
• Integrated Bug Report
• Studio Bot
• Lite Mode
• Build Analyzer
• Jetpack Compose Visual Lint & Accessibility Test
• Wear OS 4 Emulator with Bluetooth & DWF Support
• Host-side Screenshot Testing
• Gradle Managed Devices on Firebase
• Baseline Pro
fi
les Gradle Plugin
• App Quality Insights + Android Vitals
• Espresso Device API
• Power pro
fi
ler
• Layout inspector integrado com o dispositivo
conectado
Giraffe Hedgehog
63. Android Studio (New Features)
• Novo visual (New IntelliJ UI)
• Target SDK Migration analisa o projeto e gera uma lista de etapas para serem realizadas
para migrar o projeto para um novo targetSdk.
• Compose é o default para novos projetos, assim como KTS é novo padrão para build scripts
(com opção de version catalog)
• Device Streaming (tipo um scrcpy) integrado com layout inspector para Compose
• Per-app language preferences support in Android Gradle plugin
• Live Edit impressionante 🤯
• Studio Bot 🤖
69. Recomposition State Debugger
• Agora no Debugger temos um Recomposition State ao inserir um breakpoint em um
Composable (Android Studio Hedgehog).
• Esse estado pode ser:
• Unchanged: o argumento dessa composable function não mudou
• Changed: o argumento agora tem um valor diferente
• Uncertain: o Compose ainda está avaliando se o argumento mudou
• Static: Compose determinou que esse
argumento nunca mudará
• Unstable: o argumento é um tipo instável
(unstable)
70. Travamentos na UI
• Listas são tipos instáveis. Kotlin possui a PersistentList
(experimental). Uma lista estável que pode resolver problemas de
recomposição causadas por listas.
• Layout inspector mostra o número recomposições
• Recomposições durante scroll é um "code smell”
• A ferramenta de Macrobenchmark dará um resultado de performance para
que você possa con
fi
rmar a melhoria de performance após a resolução do
problema.
76. Play’s Data Safety
• O desenvolvedor deve informar se coleta,
usa e/ou compartilha dados do usuário.
• As informações sobre privacidade no uso
dos dados virão no dialog de solicitação
de permissão.
• Essas informações de privacidade virão
do próprio Google Play e são preenchidas
no momento da publicação do app na
loja.
77. Granular Media Permissions
• A permissão READ_EXTERNAL_STORAGE está marcada como deprecated
em apps targeting Android 13 (API Level 33)
• Novas permissões:
READ_MEDIA_IMAGES para imagens e fotos
READ_MEDIA_VIDEO para vídeos
READ_MEDIA_AUDIO para arquivos de áudios
• Nenhum diálogo de permissão será exibido para o usuário se a permissão
de armazenamento já tiver sido concedida.
78. Photo Picker
• Não requer permissão em tempo de execução
• Melhor UX para acessar fotos e vídeos
• Muito fácil de integrar (< 5 linhas de código)
• Suporte a Android KitKat (API 19) ou superior
• 😔 Integração com serviços de mídias na cloud em
breve.
79. Reduza o pedido de permissão
• Se possível, diminua a precisão da localização. "Coarse location" muitas vezes é o
su
fi
ciente.
• Use as intents de câmera (ACTION_IMAGE_CAPTURE e ACTION_VIDEO_CAPTURE),
já que elas não precisam de permissão.
• Pre
fi
ra identi
fi
cadores com escopo de aplicação ao invés do ID do aparelho.
• Faça o pareamento Bluetooth e Wi
fi
usando a permissão dedicada adicionando a
fl
ag
“neverForLocation" se aplicável.
• Use SMS retriever API para OTP; e ACTION_DIAL para fazer chamadas.
• Remova permissões quando elas não forem mais necessárias.
80. Privacidade & Segurança
• Apps com target para Android 14 (API
34) devem usar a
fl
ag
RECEIVER_EXPORTED ou
RECEIVER_NOT_EXPORTED ao registrar
um runtime broadcast receiver (que não
seja de sistema). Não fazer isso, gerará
uma SecurityException.
• Implicit Intents só serão entregues para
componentes exportados. Apps terão
que usar Intents explícitas se quiserem
disparar componentes não exportados.
81. Target SDK Version
• A partir do Android 14, aplicativos com targetSdkVersion < 23 (Android
6) não poderão ser instalados. Esse requisito visa melhorar a segurança e
privacidade dos usuários.
• Várias mudanças de segurança e privacidade estão ligadas à target version
do Android de
fi
nida pela aplicação. Por exemplo, as permissões em tempo
de execução introduzidas no Android 6.
• Em aparelhos atualizados pro Android 14, todos os apps que tenham o
targetSdkVersion < 23 permanecerão instalados.
• Novos aplicativos devem usar targetSdk 33 (Android 13) desde 01/08/2023
e atualizações de apps devem fazer o mesmo até 01/11/2023.