Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[I/O Extended Android 2024] What`s new in Andro...

[I/O Extended Android 2024] What`s new in Android 2024

I/O Extended Android 2024 발표자료입니다.
Google I/O 2024 에서 나왔던 안드로이드 업데이트에 대해 담았습니다.

강경완

July 20, 2024
Tweet

More Decks by 강경완

Other Decks in Technology

Transcript

  1. Woowaw Bros. Android Developer GDG Korea Android Organizer Linkedin :

    https://www.linkedin.com/in/kyeongwan-lucas-kang/ Kyeongwan Kang
  2. Right-click and select ‘Replace image’ Android 도 Gemini 에 대한

    내용 외에는 키노트에서 발표되지 않았습니다.
  3. Gemini Nano Gemini Pro Gemini Ultra Gen AI with Android

    AI with Android 모바일 기기에 최적화되어있는 Gemini nano 가 발표되었습니다. Gemini nano 를 사용하면 네트워크 연결이나 클라우드로 데이터를 전송하지 않고도 풍부한 generative AI 경험을 제공할 수 있습니다. 온디바이스 AI는 낮은 지연 시간, 낮은 비용, 개인정보 보호가 주요 관심사인 사용 사례에 적합한 솔루션입니다. 이러한 Gemini Nano 는 Android 14 부터 제공되는 새로운 시스템인 AICore 를 통해서 쉽게 접근할 수 있습니다. 현재 Google Pixel 8 시리즈 그리고 Samsung 갤럭시 S24 시리즈 기기에서 사용할 수 있으며 더 많은 기기를 지원할 예정이라고 합니다.
  4. • Content consumption ◦ Text summarization ◦ Document Q&A •

    Input assistance ◦ Smart replay ◦ Magic Compose Gen AI with Android use cases AI with Android 온디바이스 Gen Ai 인 Gemini nano는 긴 텍스트를 가지고 요약을 해달라고하거나, document Q&A 를 하거나 하는 작업을 할 수 있습니다. 같은 방법인 타이핑에서도 사용할 수 있을텐데요, 입력 도중 텍스트를 자동완성하거나, 답변을 추천하는 작업 등을 시킬 수 있을 것 같습니다.
  5. • Local Processing • Offline availability • Potentially reduced latency

    • No inference cost • Lower parameter size (compared to cloud models) • Smaller context window • Less generalized model Advantages Limitations • Not good at all use-cases Implications AI with Android 이점이 많습니다. 모든 작업이 로컬에서 이뤄진다는 점. 그러므로 오프라인에서도 사용이 가능하다는 점. 그리고 로컬에서 작업을 하기 때문에 응답속도가 빠르다는 점. 그리고 온디바이스 모델이라 프로세싱 자체를 유저의 자원으로 하기때문에 별도의 비용도 들지 않습니다. 하지만 그만큼의 제약도 가지고 있습니다. 클라우드 모델에 비해 파라미터 사이즈가 작고, 하드웨어에서도 제약을 받습니다. 기기 내에서 사용하기 때문에 작은 메모리와 렘도 제약이 될 수 있습니다. 모델 자체가 작기 일반화의 문제가 생길 수도 있습니다. 설계 자체가 제한된 환경에서 작동하도록 설계가 되었기 때문에 모든 use-case 에서 좋을 수 없다는 전제를 가지고 사용하려고 하는 use-case 에 맞는 모델을 선택해야합니다.
  6. Gemini API aistudio.google.com multi model capabilities (text, image, video, audio)

    Start prompting on Google AI Studio. AI with Android Gemini pro 모델이나 pro 보다는 조금 가볍고 빠른 gemini flash 모델의 테스트는 모두 aistudio.google.com 에서 해보실 수 있습니다. Text 와 채팅에 초점이 맞춰져있었던 gemini 1.0 버전의 성능을 능가하는 gemini 1.5 pro 버전에서는 텍스트 뿐만아니라 이미지, 비디오, 오디오 등의 파일도 지원하며, 멀티모델을 활용한 프롬포팅을 가능하게 해주었습니다. aistudio.google.com 에 들어가시면 바로 이 gemini 1.5 pro 모델을 가지고 프롬포팅을 시작하실 수 있으며, api 형태로 앱과 연동하여 서비스를 바로 만드실 수도 있습니다.
  7. Studio bot is now Gemini in Android Studio • Coding

    assistance • Generate Android Code • Explain errors and improve code • Code suggestions (Koala) • Multimodal Image Uploads (Upcoming soon) ◦ Given this wireframe, implement a compose UI using material 3 Gemini in Android Studio Android Studio Studio bot 이 올해 다시 gemini in android studio 로 이름을 통합해서 나왔습니다. Gemini in android studio 는 개발자가 코드를 생성하고, 관련 리소스를 찾고, 더 나은 코드를 생성하고, 배우는데 시간을 절약시켜줄 수 있습니다. 다만 생성형 AI 이기 때문에 Gemini 가 자신있게 제시하는 코드가 거짓된 정보를 제공할 수 있다는 점을 항상 명심하고 Gemini 의 응답을 항상 두번 확인하고, 코드에 오류나 버그가 있는지 확인해야합니다. 아직은 지원하지 않지만, 구글 I/O 에서 시연을 보였던 기능이 있습니다. 조만간 멀티모델로 이미지 업로드도 지원을 할 예정이라고 합니다. 가령 이미지를 업로드하면 Gemini 1.5 가 이미지를 분석하여 디자인 이미지를 바로 컴포즈 코드로 변환해주거나 분석해주는 기능이 나올 예정입니다.
  8. • compose material3 adaptive 1.0.0 beta ◦ ListDetailPaneScaffold ◦ SupportingPaneScaffold

    Build adaptive layout Adaptive Layout https://developer.android.com/develop/ui/compose/layouts/adaptive/list-detail 새로 출시된 Material 3 기반의 적응형 라이브러리는 ListDetailPanScaffold 와 SupportingPaneScaffold 과 같은 일반적인 적응형 시나리오를 구현할 수 있는 새로운 API를 추가되었습니다. 이러한 API를 사용하면 앱에서 사용 가능한 크기에 따라 하나 또는 두 개의 창을 표시할 수 있습니다.
  9. Compose compiler bundled with Kotlin release Compose [plugins] compose-compiler =

    { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } [build.gradle.kts] plugins { alias(libs.plugins.compose.compiler) apply false } android { composeOptions { kotlinCompilerExtensionVersion = ... } } 코틀린 2.0 이 출시되었고, 이제 컴포즈 컴파일러가 코틀린에 직접 배포됩니다. Compose Compiler가 Kotlin 저장소로 옮겨지면서 Kotlin과 Compose의 통합이 더욱 원활해졌습니다. 개발자 여러분은 Kotlin 버전과 일치하는 Compose Compiler 버전을 지정할 필요가 없으며, Compose Compiler Gradle 플러그인을 통해 쉽게 업데이트할 수 있습니다.
  10. Compose • Faster time to first draw 17% up •

    Strong Skipping Mode • Lambda memoization • Indication API • Slot table rewrite Compose performance https://developer.android.com/develop/ui/compose/performance/stability/strongskipping https://developer.android.com/develop/ui/compose/touch-input/user-interactions/migrate-indication-ripple Jetpack Compose 는 출시될 때 마다 더욱 빨라지고 있습니다. 컴포저블 함수의 성능을 최적화하기 위해 Strong Skipping mode 가 도입되었습니다. 이 모드는 컴포저블 함수를 효율적으로 건너뛰어서 성능을 향상시키는데 중점을 둡니다. 이 모드는 모든 매개변수가 stable 하지 않더라도 컴포저블을 건너뛸 수 있습니다. 그러므로 strong skipping mode 를 활성화하지 않은 것 보다 더 많은 recomposition 이 skip 되고, 이로인해 성능이 향상될 수 있습니다. 이 모드는 컴포즈 컴파일러 1.5.4 부터 실험적인 기능으로 사용할 수 있으며 2.0.20 부터는 기본으로 활성화될 예정입니다.
  11. Compose • Faster time to first draw 17% up •

    Strong Skipping Mode • Lambda memoization • Indication API • Slot table rewrite Compose performance https://developer.android.com/develop/ui/compose/performance/stability/strongskipping https://developer.android.com/develop/ui/compose/touch-input/user-interactions/migrate-indication-ripple 람다 메모리제이션이 생겼습니다. Lambda 호출을 위해 remember 로 감싸야했던 적이 있으셨다면, strong skipping mode 가 활성화 된 상태라면 자동으로 컴포저블에 사용되는 모든 labmda 가 remember 로 감싸줍니다.
  12. // Stable data class User( val id: Int, val name:

    String, ) @Composable fun UserList( userList: List<User>, // List = Unstable, User = Stable modifier: Modifier = Modifier // Stable ) { ... } @Composable private fun UserListScreen() { Column { var toggle by remember { mutableStateOf(false) } Button(onClick = { toggle = toggle.not() }) UserList(listOf(User(1, "aaa"))) } } User data class 는 모두 불변하기때문에 Stable 합니다. UserList 의 매개변수를 잠시 보겠습니다. User 데이터 클래스는 Stable 한 상태이지만, List 같은 경우는 Unstalbe 한 객체입니다. 따라서 UserList 는 Unsable 한 매개변수를 가지고 있습니다. 따라서 위 결과처럼 20번의 클릭에 20번의 recomposition 이 일어나지만, strong skiping mode 를 활성화 할 경우 recomposition 이 일어나지 않습니다.
  13. Compose • Faster time to first draw 17% up •

    Strong Skipping Mode • Lambda memoization • Indication API • Slot table rewrite Compose performance https://developer.android.com/develop/ui/compose/performance/stability/strongskipping https://developer.android.com/develop/ui/compose/touch-input/user-interactions/migrate-indication-ripple 다음으로는 인디케이터 API 가 변경되었습니다. Indication API 에서 리플 효과를 그리는 구현이 변경되었으므로 이 API 를 사용하고 계시다면 마이그레이션이 필요합니다. 그 외에도 소소한 퍼포먼스 업데이트가 있습니다.
  14. Compose • SharedTransitionLayout • Modifier.sharedElements() • Modifier.sharedBounds() Shared elements compose

    1.7.0-beta01 부터 사용가능하며 실험적인 기능임. https://developer.android.com/develop/ui/compose/animation/shared-elements Compose 1.7.0-beta01 부터 사용가능한 Shared Elements tansition 가 추가되었습니다. 새로운 Modifier.sharedElement()와 Modifier.sharedBounds()를 사용하여 화면 간 아름다운 전환 효과를 만들 수 있습니다. 이 기능은 애니메이션 콘텐츠 컴포저블을 SharedTransitionLayout으로 감싸고, 전환할 콘텐츠에 Modifier.sharedElement()나 Modifier.sharedBounds()를 추가하면 됩니다. 주로 화면전환을 할 때 사용하실텐데, Navigation-compose 와도 함께 사용할 수 있습니다.
  15. SharedTransitionLayout { NavHost() { composable("home") { HomeScreen() } composable( "details/{item}",

    arguments = listOf(navArgument("item") { type = NavType.IntType }) ) { backStackEntry -> DetailsScreen() } } }
  16. // DetailsScreen with(sharedTransitionScope) { Image( painterResource(id = snack.image), modifier =

    Modifier.Companion .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "image-$id"), animatedVisibilityScope = animatedContentScope ) ) } // HomeScreen LazyColumn() { with(sharedTransitionScope) { Image( painterResource(id = item.image), modifier = Modifier.sharedElement( sharedTransitionScope.rememberSharedContentState(key = "image-$index"), animatedVisibilityScope = animatedContentScope ) ) } }
  17. open fun Modifier.animateItem( fadeInSpec: FiniteAnimationSpec<Float>?, placementSpec: FiniteAnimationSpec<IntOffset>?, fadeOutSpec: FiniteAnimationSpec<Float>? ):

    Modifier Column { Button(onClick = { list = list + "${list.count() + 1}" }) { Text("Add new item") } Button(onClick = { list = list.shuffled() }) { Text("Shuffle") } LazyColumn { items(list, key = { it }) { Text("Item $it", Modifier.animateItem()) } } } 다음으로 Compose foundation 1.7.0-beta05 에 추가된 animateItem API 입니다. 이 API 는 LazyList Item 에서 사용할 수 있으며, 항목의 삽입과 제거, 재정렬을 자동으로 animation 할 수 있습니다. Fade-in 효과와 fade out, 그리고 재정렬에 대한 애니메이션을 각각 줄 수 있습니다.
  18. AnnotatedString.fromHtml() 스타일러스 지원 (after Android14) ContextualFlowRow ContextualFlowColumn 최대 줄 수를

    정해 놓은 Flow Layout Text Contextual Flow Layouts Compose 이제 더이상 html 텍스트를 annotatedString 으로 변환하기 위한 코드를 별도로 작성할 필요가 없습니다. 인라인링크와 기본 HTML 포멧팅을 지원하는 새로운 AnnotatedString.fromHtml() 익스텐션을 추가가 되었기 때문입니다. Contextual Flow Layout 이 추가되었습니다. 이 레이아웃은 최대 줄 수를 지정하면, 화면에 들어갈 수 있는 만큼 항목을 구성한 다음 넘치는 항목에 대한 컨텍스트를 제공합니다. 이 컨텍스트를 활용하여 남은 항목 수를 표시하는 custom indicator 를 랜더링 할 수 있습니다.
  19. • 새로운 Service 유형 : Media Processing • mediaProcessing, dataSync

    타입의 24시간 내 최대 6시간 실행 제약 추가 • BOOT_COMPLETED 시 서비스 시작 제한 dataSync, camera, mediaPlayback, phoneCall, mediaProjection, microphone Foreground Service changes Android 15
  20. Edge to edge by default in Android 15 • Status

    bar ◦ Transparent by default ◦ setStatusBarColor is disabled • Gesture handle navigation bar ◦ Transparent by default • 3-button navigation ◦ Opacity set to 80% by default Edge to Edge Android 15 Android 15 에서는 target SDK 가 35 로 설정된 앱이 기본적으로 edge to edge 모드로 설정됩니다. material3 컴포넌트를 사용한 경우라면 예를들어 머테리얼3의 TopBar 나 Bottom Bar 등의 컴포넌트를 사용한 경우라면 자동으로 인셋을 처리하기 때문에 이 경우도 영향을 받지 않을 가능성이 높습니다. 그 외의 경우에는 수동으로 WindowInset 을 적용해줘야합나다. 그에 대한 가이드는 안드로이드 디벨로퍼 사이트를 참고하시기 바랍니다.
  21. GlanceTheme { Scaffold( backgroundColor = GlanceTheme.colors.surface, titleBar = { TitleBar(

    startIcon = ImageProvider(R.drawable.android), title = "Example" ) }) { Text("HelloWorld") } ) }
  22. • Health Services API • Health Connect Wear OS and

    Health Connect Health Health Connect 는 Android 기기에서 건강 및 피트니스 데이터를 저장하고 공유하는데 권장되는 구글의 솔루션입니다. Android 14 부터 기본적으로 지원되고, 이전 기기에서는 Play Store 에서 다운로드 받을 수 있습니다. Health Connect 를 사용하면 단일 API 를 사용하여 사용자는 여러 건강 앱들을 연결할 수 있고, 사용자는 자신의 건강 데이터를 보다 효과적으로 관리할 수 있습니다. Google Fit API 변경사항이 있습니다. 구글은 Google Fit 개발자 서비스가 Android Health 플랫폼으로 전환될 것이라고 예고했었고, 2025년 6월 30일까지만 사용할 수 있다고 예고했습니다. 따라서 기존 Google Fit API 를 사용하던 개발자들은 Android Health API 로 마이그레이션을 하는 것이 좋습니다. Google fit api 에서 마이그레이션을 위한 recording api 도 모바일에 도입했습니다. 이를 통해 걸음수를 추적할 수 있고, 조만간 이동거리와 열량소모도 측정할 수 있도록 할 예정입니다. Health Services API 를 사용하면 Wear OS 앱에서 더 쉽게 더 적은 전력소모로 운동 측정할 수 있습니다.
  23. • Supporting Talkback Image Captioning ◦ Image description using on-device

    ML • A11y announcement API is now discouraged Android A11y A11y Talkback 이 업데이트되면서 라벨이 지정되지 않은 아이콘이나, 이미지를 온디바이스 머신러닝 모델을 이용하여 설명해줍니다. 물론 설명하기전에 대체택스트 잘 넣어주면 좋습니다. 아직은 영어 버전으로만 지원이 됩니다. 예시를 하나 가져왔는데요. 강아지 사진을 설명해달라 했을 때는 퍼그 사진입니다. 라고 딱 설명을 해주었고. 옆에있는 사진을 설명해달라 부탁했더니. Desk with a labtop 이미지가 감지되었다고 talkback 이 친절하게 알려주었습니다.
  24. • Compose UI Check mode ◦ Compose UI 의 접근성

    문제를 자동으로 테스트 ◦ 대화면 등 다양한 상황을 모두 테스트하고, 크기, 대비 등 접근성 문제 감시 Android A11y A11y