SlideShare uma empresa Scribd logo
1 de 83
Baixar para ler offline
Novidades incríveis
do Android em 2023
Google I/O 2023
Nelson Glauber
Android GDE
@nglauber
io.google/2023/program
35 apresentações de Android
https://youtu.be/tu0UtDGC31A
1
Compose Material 3
• Novos Componentes 🎉
• Bottom sheets
• Date/Timer pickers
• Top App Bars
• Navigation Bar/Rail/Drawer
• Tooltips
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)
Jetpack Glance
• O Jetpack Glance é um framework sobre
o Compose que permite desenvolver e
projetar widgets.
• https://developer.android.com/jetpack/
compose/glance
https://youtu.be/_X4tswgV67Y
2
Compose for TV (Alpha)
• Componentes especí
fi
cos pra TV
• TvLazyRow, TvLazyGrid,
TvLazyColumn, SideNavigation,
Content Cards, Carousel,
ImmersiveList, etc.
https://youtu.be/5JQjk3ZqPWc
3
Crie experiências únicas em telas grandes
Usuários gostam de ter uma experiência diferenciada em dispositivos
maiores.
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.
https://developer.android.com/large-screens/gallery
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.
Window Size
Classes
goo.gle/windows-size-class-views
goo.gle/windows-size-class-compose
height > 900
480dp ≤ height < 900
height < 480
Window Size Classes
Compact Medium Expanded
https://youtu.be/zx20-3GSdHw
4
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
https://youtu.be/V-s4z7B_Gnc
5
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.
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.
Sua activity pode ser destruída por…
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…
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
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.
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
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.🤷
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.
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)
https://youtu.be/YHeWQ9MNuWg
6
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.
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
Modo Compatibilidade
• Acontece quando você coloca restrições às mudanças de con
fi
guração.
• Duas maneiras de entrar no modo de compatibilidade
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.
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.
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
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
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,
)
Multi Previews for Jetpack Compose
@DeviceSizePreviews
@Composable
fun GreetingPreview() {
val (w, h) = with(LocalConfiguration.current) {
screenWidthDp.dp to screenHeightDp.dp
}
MyApp(WindowSizeClass.calculateFromSize(DpSize(w, h)))
}
@Preview(showSystemUi = true, widthDp = 700)
@Preview(showSystemUi = true, device = “spec:width=800dp,height=1280dp,dpi=480")
@Preview(showSystemUi = true, device = "id:pixel_5")
@Preview(showSystemUi = true, device = "id:7.6in Foldable")
@Preview(showSystemUi = true, device = "id:medium_tablet")
@Preview(showSystemUi = true, device = "id:desktop_medium")
annotation class DeviceSizePreviews
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?
Automated Testing Tools
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.
Emulador 33.1.10
@RunWith(AndroidJUnit4::class)
class ScreenOrientationTest {
@get:Rule(order = 0)
val composeTestRule = createAndroidComposeRule<MainActivity>()
@get:Rule(order = 1)
val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
@Test
@RequiresDeviceMode(DeviceMode.FLAT)
fun screenOrientationShowRightPanel() {
onDevice().setScreenOrientation(ScreenOrientation.PORTRAIT)
composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed()
onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed()
}
Activity deve exibir
o conteúdo
@Test
@RequiresDeviceMode(DeviceMode.FLAT)
fun foldUnfold() {
onDevice()
.setScreenOrientation(ScreenOrientation.PORTRAIT)
.setClosedMode()
composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed()
composeTestRule.onNodeWithTag("rightPanel").assertDoesNotExist()
onDevice()
.setScreenOrientation(ScreenOrientation.PORTRAIT)
.setFlatMode()
composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed()
composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed()
}
Save Restoration Tester - Compose
Save Restoration Tester - Compose
@RunWith(AndroidJUnit4::class)
class SaveRestoreStateTest {
@get:Rule(order = 0)
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
@Test
fun testDeviceSaveState() {
val stateRestorationTester = StateRestorationTester(composeTestRule)
stateRestorationTester.setContent {
val (w, h) = with(LocalConfiguration.current) { screenWidthDp.dp to screenHeightDp.dp }
MyApp(WindowSizeClass.calculateFromSize(DpSize(w, h)))
}
composeTestRule.onNodeWithText("Counter 0").assertIsDisplayed()
composeTestRule.onNodeWithText("Add").performClick()
composeTestRule.onNodeWithText("Counter 1”).assertIsDisplayed()
stateRestorationTester.emulateSavedInstanceStateRestore()
composeTestRule.onNodeWithText("Counter 1").assertIsDisplayed()
}
}
TestHarness – Compose
TestHarness – Compose
@RunWith(AndroidJUnit4::class)
class ScreenWithHarness {
@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
@Test
fun testSpecificScreenSize() {
composeTestRule.setContent {
val size = DpSize(840.dp, 600.dp)
TestHarness(
size = size
) {
MyApp(WindowSizeClass.calculateFromSize(size))
}
}
composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed()
composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed()
}
}
https://youtu.be/L6CSaH0kDnI
7
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.
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.
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
https://youtu.be/7lubRrkxagk
8
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
Next releases
Giraffe - Stable!!!🎉 Hedgehog - Canary
https://developer.android.com/studio/preview
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
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 🤖
Studio Bot
🤷😩😭
App Quality Insights + Android Vitals
Power Pro
fi
le
Device
Pro
fi
le
https://youtu.be/Kp-aiSU8qCU
9
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)
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.
https://youtu.be/QGtB--ABiNM
10
Kotlin Compiler 2.0
Kotlin DSL for Gradle Builds
• KTS é o padrão no Android Studio Giraffe
• KTS + Version Catalog é uma opção (experimental)
KSP no lugar do KAPT
Checar se a biblioteca
suporta KSP…
goo.gle/ksp-support
Hilt 😭
https://youtu.be/MsNraIQ6mUI
11
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.
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.
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.
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.
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.
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.
io.google/2023/program
Obrigado!
Dúvidas?
Nelson Glauber
Android GDE
@nglauber

Mais conteúdo relacionado

Semelhante a Novidades incríveis do Android em 2023

TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...tdc-globalcode
 
Aulas Google Android
Aulas Google AndroidAulas Google Android
Aulas Google AndroidIury Teixeira
 
Mobile First e Offline First
Mobile First e Offline FirstMobile First e Offline First
Mobile First e Offline FirstDan Vitoriano
 
Aula02 android hands_on
Aula02 android hands_onAula02 android hands_on
Aula02 android hands_onRoberson Alves
 
Desenvolvendo para Android
Desenvolvendo para AndroidDesenvolvendo para Android
Desenvolvendo para AndroidClaudio Pereira
 
Minicurso code igniter aula 2
Minicurso code igniter   aula 2Minicurso code igniter   aula 2
Minicurso code igniter aula 2lfernandomcj
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidRafael Sakurai
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sitesthiagolima
 
Introdução Silverlight Windows Phone
Introdução Silverlight Windows PhoneIntrodução Silverlight Windows Phone
Introdução Silverlight Windows PhoneNuno Luz
 
Boas Práticas em Aplicações Silverlight 2
Boas Práticas em Aplicações Silverlight 2Boas Práticas em Aplicações Silverlight 2
Boas Práticas em Aplicações Silverlight 2sagostinho
 
Como criar interfaces gráficas com android
Como criar interfaces gráficas com androidComo criar interfaces gráficas com android
Como criar interfaces gráficas com androidRicardo Ogliari
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemRodrigo Valerio
 
Responsive Web Design - Introdução
Responsive Web Design - IntroduçãoResponsive Web Design - Introdução
Responsive Web Design - IntroduçãoVítor Teixeira
 
O uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
O uso de PWA e o futuro do desenvolvimento mobile com React Native e KotlinO uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
O uso de PWA e o futuro do desenvolvimento mobile com React Native e KotlinDavid Robert Camargo de Campos
 
Palestra urutai-mobile
Palestra urutai-mobilePalestra urutai-mobile
Palestra urutai-mobileRogerio Fontes
 
Desenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaDesenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaNelson Glauber Leal
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 

Semelhante a Novidades incríveis do Android em 2023 (20)

TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
 
Aulas Google Android
Aulas Google AndroidAulas Google Android
Aulas Google Android
 
Mobile First e Offline First
Mobile First e Offline FirstMobile First e Offline First
Mobile First e Offline First
 
Aula02 android hands_on
Aula02 android hands_onAula02 android hands_on
Aula02 android hands_on
 
Desenvolvendo para Android
Desenvolvendo para AndroidDesenvolvendo para Android
Desenvolvendo para Android
 
Apostila sobre o Visualg
Apostila sobre o VisualgApostila sobre o Visualg
Apostila sobre o Visualg
 
Minicurso code igniter aula 2
Minicurso code igniter   aula 2Minicurso code igniter   aula 2
Minicurso code igniter aula 2
 
Apresentação Google Android
Apresentação Google AndroidApresentação Google Android
Apresentação Google Android
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao Android
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sites
 
Introdução Silverlight Windows Phone
Introdução Silverlight Windows PhoneIntrodução Silverlight Windows Phone
Introdução Silverlight Windows Phone
 
Boas Práticas em Aplicações Silverlight 2
Boas Práticas em Aplicações Silverlight 2Boas Práticas em Aplicações Silverlight 2
Boas Práticas em Aplicações Silverlight 2
 
Como criar interfaces gráficas com android
Como criar interfaces gráficas com androidComo criar interfaces gráficas com android
Como criar interfaces gráficas com android
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvem
 
Aplicacoes responsivas
Aplicacoes responsivasAplicacoes responsivas
Aplicacoes responsivas
 
Responsive Web Design - Introdução
Responsive Web Design - IntroduçãoResponsive Web Design - Introdução
Responsive Web Design - Introdução
 
O uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
O uso de PWA e o futuro do desenvolvimento mobile com React Native e KotlinO uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
O uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
 
Palestra urutai-mobile
Palestra urutai-mobilePalestra urutai-mobile
Palestra urutai-mobile
 
Desenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaDesenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certa
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 

Mais de Nelson Glauber Leal

Seu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose MultiplatformSeu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose MultiplatformNelson Glauber Leal
 
Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Nelson Glauber Leal
 
Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Nelson Glauber Leal
 
Jetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidJetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidNelson Glauber Leal
 
Jetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no AndroidJetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no AndroidNelson Glauber Leal
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackNelson Glauber Leal
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackNelson Glauber Leal
 
O que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor AndroidO que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor AndroidNelson Glauber Leal
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackNelson Glauber Leal
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackNelson Glauber Leal
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackNelson Glauber Leal
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard LibraryNelson Glauber Leal
 
Aplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & JetpackAplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & JetpackNelson Glauber Leal
 
Introdução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinIntrodução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinNelson Glauber Leal
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using RoomNelson Glauber Leal
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackNelson Glauber Leal
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidNelson Glauber Leal
 
Desenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidDesenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidNelson Glauber Leal
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
Tudo que você precisa saber sobre Constraint Layout
Tudo que você precisa saber sobre Constraint LayoutTudo que você precisa saber sobre Constraint Layout
Tudo que você precisa saber sobre Constraint LayoutNelson Glauber Leal
 

Mais de Nelson Glauber Leal (20)

Seu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose MultiplatformSeu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose Multiplatform
 
Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)
 
Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021
 
Jetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidJetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on Android
 
Jetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no AndroidJetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no Android
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
O que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor AndroidO que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor Android
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e Jetpack
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard Library
 
Aplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & JetpackAplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & Jetpack
 
Introdução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinIntrodução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com Kotlin
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using Room
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com Jetpack
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos Android
 
Desenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidDesenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos Android
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Tudo que você precisa saber sobre Constraint Layout
Tudo que você precisa saber sobre Constraint LayoutTudo que você precisa saber sobre Constraint Layout
Tudo que você precisa saber sobre Constraint Layout
 

Novidades incríveis do Android em 2023

  • 1. Novidades incríveis do Android em 2023 Google I/O 2023 Nelson Glauber Android GDE @nglauber
  • 4.
  • 6. Compose Material 3 • Novos Componentes 🎉 • Bottom sheets • Date/Timer pickers • Top App Bars • Navigation Bar/Rail/Drawer • Tooltips
  • 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.
  • 12.
  • 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.
  • 18. Window Size Classes Compact Medium Expanded
  • 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
  • 22.
  • 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.
  • 25. Sua activity pode ser destruída por…
  • 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, )
  • 42. Multi Previews for Jetpack Compose @DeviceSizePreviews @Composable fun GreetingPreview() { val (w, h) = with(LocalConfiguration.current) { screenWidthDp.dp to screenHeightDp.dp } MyApp(WindowSizeClass.calculateFromSize(DpSize(w, h))) } @Preview(showSystemUi = true, widthDp = 700) @Preview(showSystemUi = true, device = “spec:width=800dp,height=1280dp,dpi=480") @Preview(showSystemUi = true, device = "id:pixel_5") @Preview(showSystemUi = true, device = "id:7.6in Foldable") @Preview(showSystemUi = true, device = "id:medium_tablet") @Preview(showSystemUi = true, device = "id:desktop_medium") annotation class DeviceSizePreviews
  • 43.
  • 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.
  • 48. @RunWith(AndroidJUnit4::class) class ScreenOrientationTest { @get:Rule(order = 0) val composeTestRule = createAndroidComposeRule<MainActivity>() @get:Rule(order = 1) val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) @Test @RequiresDeviceMode(DeviceMode.FLAT) fun screenOrientationShowRightPanel() { onDevice().setScreenOrientation(ScreenOrientation.PORTRAIT) composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed() onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed() } Activity deve exibir o conteúdo
  • 51. Save Restoration Tester - Compose @RunWith(AndroidJUnit4::class) class SaveRestoreStateTest { @get:Rule(order = 0) val composeTestRule = createAndroidComposeRule<ComponentActivity>() @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) @Test fun testDeviceSaveState() { val stateRestorationTester = StateRestorationTester(composeTestRule) stateRestorationTester.setContent { val (w, h) = with(LocalConfiguration.current) { screenWidthDp.dp to screenHeightDp.dp } MyApp(WindowSizeClass.calculateFromSize(DpSize(w, h))) } composeTestRule.onNodeWithText("Counter 0").assertIsDisplayed() composeTestRule.onNodeWithText("Add").performClick() composeTestRule.onNodeWithText("Counter 1”).assertIsDisplayed() stateRestorationTester.emulateSavedInstanceStateRestore() composeTestRule.onNodeWithText("Counter 1").assertIsDisplayed() } }
  • 53. TestHarness – Compose @RunWith(AndroidJUnit4::class) class ScreenWithHarness { @get:Rule val composeTestRule = createAndroidComposeRule<ComponentActivity>() @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) @Test fun testSpecificScreenSize() { composeTestRule.setContent { val size = DpSize(840.dp, 600.dp) TestHarness( size = size ) { MyApp(WindowSizeClass.calculateFromSize(size)) } } composeTestRule.onNodeWithTag("leftPanel").assertIsDisplayed() composeTestRule.onNodeWithTag("rightPanel").assertIsDisplayed() } }
  • 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
  • 58.
  • 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 🤖
  • 65. App Quality Insights + Android Vitals
  • 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.
  • 73. Kotlin DSL for Gradle Builds • KTS é o padrão no Android Studio Giraffe • KTS + Version Catalog é uma opção (experimental)
  • 74. KSP no lugar do KAPT Checar se a biblioteca suporta KSP… goo.gle/ksp-support Hilt 😭
  • 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.