이번에는 기회가 되어 현장에 직접 참가할 수 있었습니다 :pray: :pray:
특히 놀랍거나 중요하다고 생각되는 부분은 굵게 표시했습니다.
AI의 도움을 받아 정리했기 때문에, 잘못된 부분이 있다면 알려주시면 감사하겠습니다 :bow: :bow:
한마디로 말하자면: 키노트답게 Android 개발 관련 업데이트를 요약한 느낌이었습니다.
Matthew McCullough(키노트 시작과 끝에 발표한 사람)
Android 개발자가 만드는 경험은 매월 전 세계 30억 명에게 도달하고 있습니다.
Android Studio에 당신의 에이전트를 가져올 수 있게 됩니다.
Compose를 사용해 토큰 비용이 33% 감소했다는 내용. Instagram Direct 내부 분석에서, 동일한 작업을 Compose와 Views로 비교했을 때 에이전트 1세션당 값입니다. -
Shopify의 네이티브화(native化)로 50% 빨라졌다는 내용
Intelligence Experience
Adobe Premiere가 Media3와 Dawn/WebGPU를 이용해 멀티 트랙 4K 영상 편집과 AI 노이즈 제거 기능을 만들었다는 이야기. Compose + Navigation3으로 적응형(adaptive) 대응도 했다고 합니다.
android prototype (이름은 검토 중이며 가칭이라고 함).
android prototype jetpacker.apk
처럼 APK 파일을 전달하면, 노트북상의 경량 프로세스로 앱이 실행되어 조작할 수 있습니다. - phone / foldable / desktop의 여러 크기에서 동시에 구동 가능합니다. 에이전트도 조작하여 동작 확인이 가능하다고 합니다.
Bring Your Own Agent. ACP(Agent Client Protocol)을 통해 Android Studio에서 다양한 에이전트를 사용할 수 있게 됩니다.
-
실제로 Android Studio에서 Claude Code의 서브 에이전트를 사용하는 데모
-
Compose first
-
2클릭으로 레이아웃 XML을 Compose로! 오른쪽 클릭하여 migrate to compose로 Compose로!
-
Intelligence
-
Navigation3 같은 라이브러리로 다양한 폼 팩터(form factor) 대응을 쉽게 하는 이야기
-
새로운 App State 라이브러리군 (Compose의 개념으로 앱 상태를 관리합니다. 여러 UI 간에 세션 상태를 공유하는 등). 알파 버전이며 피드백을 받고 있다고 합니다.
-
A2UI Compose로 UI를 표시하고 항공권 예약을 하는 데모
-
Gemini Nano ML Kit
-
ML Kit Agentic API
-
Function call이 가능합니다.
-
비행기 모드에서 에펠탑 티켓을 경비에 추가하고, “할인으로 30유로였다”고 말하자 에이전트가 경비를 업데이트하는 데모
-
https://x.com/new_runnable/status/2115496680254750817
-
Android MCP는 AppFunctions으로 공개한 Android 앱의 기능을 Gemini 등의 에이전트가 이용할 수 있도록 하는 메커니즘입니다. - Connected Apps Platform에서는 원격(remote) MCP 서버와 나란히 연결하는 방식으로 준비되어 있습니다. 앱 측은 AppFunctions으로 구현하고, Google Connected Console에서 등록 및 테스트할 수 있습니다. Android MCP의 Connected App은 연동된 Play 앱의 제품 버전 출시 일정에 맞춰 심사 및 공개됩니다.
-
공식적인 등록/공개 절차
-
Connected Apps Platform
Gemini에게 Android Dev Summit에 물어보면, 앱에 접근하여 답변해 주는 데모. 이런 것이 가능한 것을 Connected App이라고 부르는 것 같습니다.
-
Googlebook laptop
-
스마트폰과 대형 화면을 모두 사용하는 사용자는 스마트폰만 사용하는 사용자보다 앱에 지출하는 비용이 9배 높은 것으로 알려졌습니다.
-
5개 노트북 PC 제조사(OEM)와 협력하여 하이엔드급 Googlebook을 준비한 것으로 보입니다.
-
Antigravity CLI + Android CLI의 adaptive skill을 사용하여, Googlebook 상에서 가로로 길게 늘어진 앱을 데스크톱 환경에 대응시키는 사례를 확인했습니다 (예: Navigation3의 list-detail, 키보드 단축키, 툴팁 등).
Android XR
-
XREAL AURA Android XR.
AndroidXR 시연****음악 감상 중 사용 등의 활용 예시 - https://x.com/new_runnable/status/2115502028793528645
연말까지 AURA를 $1,099에 저렴하게 제공할 예정입니다.
-
Android XR Engine Hub가 안정화(stable)되었습니다 (Unity / Unreal Engine / Godot용). 또한, XR Jetpack SDK와 에뮬레이터도 안정화되었습니다.
-
요약하자면:
-
어떻게 빌드하는지
-
앱의 AI 경험 (intelligent experiences)
-
하드웨어
한마디로 말하면: 기본적으로 Connected Apps를 서버에서 구축하고 MCP(Minimum Capability Platform)에 등록하는 방식이었습니다. 즉, Gemini 앱과 서버가 통신하기 때문에 Android 고유의 색채는 다소 옅어졌습니다.
-
사용자가 무언가를 할 때 '앱 메뉴를 터치하여 사용하는' 방식에서 'AI와 대화하는' 방식으로 변화하고 있습니다.
-
Connected apps: 사용자 의도에 따라 액션을 실행합니다.
-
Connected Apps Platform을 통해 현재 Gemini 앱과 Search에서 사용할 수 있으며, 향후 다른 제품군으로도 확대될 예정입니다.
-
한 번 Connected Apps Platform의 MCP spec 등으로 스키마를 만들면 어디서든 활용할 수 있습니다.
-
첫 번째 프리뷰는 미국(US) 개발자만 대상으로 합니다. 단계적으로 범위를 넓혀갈 계획입니다.
-
폼을 통해 접근을 신청합니다 (개발자 가이드 또는 Play Console 홈에서).
-
승인되면 Google Connected Console을 사용할 수 있게 되며, 여기서 실제 출시 준비를 하게 됩니다.
-
아래의 Gemini Developer Mode는 접근 승인이 되어 있지 않아도 테스트해 볼 수 있습니다.
Gemini Developer Mode. 미국(US) 전용. 지연 시간(latency) 및 응답 속도를 확인할 수 있습니다. 향후 eval, 벤치마크 등의 평가 기능도 추가될 예정입니다. -
단순 정보 검색은 확인하지 않고 실행한 후, book 등에서 미리 확인하는 방식으로 사용하도록 합니다.
MCP 서버 도구에 read only / destructive 어노테이션을 붙일 수 있습니다. destructive의 경우 플랫폼이 실행 전에 사용자에게 확인 요청을 보냅니다. - Gemini 앱에서는 앱별 또는 액션별로 매번 확인 여부를 결정할 수 있습니다.
Connected App을 만드는 방법: 두 가지 방식 (MCP Server 또는 Android MCP). 원격(remote) MCP가 추천됩니다. 다른 플랫폼에서도 사용 가능하기 때문입니다. - (세션 외 보충 설명) 2026년 11월 기준 문서에 따르면, 하나의 Connected App으로 선택할 수 있는 연결 타입은 하나뿐이며 나중에 변경하는 것도 불가능합니다. "앱이 있으면 AppFunctions, 없으면 서버"와 같은 전환 방식은 하나의 Connected App으로는 구현할 수 없습니다. https://developer.android.com/ai/appfunctions/create-manage-connected-apps
테스트 방법:
- MCP 서버를 로컬에서 실행하여 MCP inspector로 확인합니다.
- gcloud run deploy (Cloud Run) 등을 사용하여 배포하고 확인합니다.
- Gemini Developer Mode에서 확인합니다.
- Developer Mode에서는 임의의 MCP 도구를 호출하거나 응답 JSON을 확인할 수 있습니다.
아카이브 액세스 프로그램 등록 -> Connected Console에서 Connected app과 앱을 등록하고 MCP를 등록합니다.
-
Connected Console은 MCP 스키마의 스냅샷을 가져가기 때문에, 스키마를 변경하면 재배포(redeploy)가 필요하다고 합니다.
-
한마디로 말하자면: Google Play에서의 Compose 전환에 대한 이야기였습니다. 어떤 구조를 만들었는지 매우 범용적인 내용을 다루어 흥미로웠습니다. 적용할 수 있는 앱이 많아 추천합니다.
-
2020년경, View/Fragment를 사용한 개발 속도, 신뢰성, 성능이 목표에 도달하지 못하게 되자 Compose를 채택했습니다.
-
Google Play의 주요 화면(검색 결과, 홈, 상세)에서 발생하던 Jank가 지난 14개월 동안 30% 개선되었다고 합니다. - Google Play는 Low Traffic Page부터 Compose 전환을 시작한 것 같습니다. 설정 화면 등이 예시입니다. 다음으로 High Traffic 컴포넌트를 대체했습니다.
-
Google Play에서의 Compose 전환 방법: 설정 화면 -> 컴포넌트 -> Activity 등이 Compose만 가지게 하고, Navigation을 Compose로 사용하며, AndroidFragment()를 통해 Fragment를 표시합니다.
-
Google Play의 Unidirectional Data Flow: https://x.com/new_runnable/status/2115522894034055312 여러 종류의 레이스 조건이 통째로 사라졌다고 합니다. 데이터 소스와 UI 변환을 병렬로 실행하기 쉬워졌고, 스토어 로딩 지연도 약 50ms 단축되었습니다.
-
코드 품질 자동화 (Code quality automation)
-
Lint를 준비하는 등 여러 방법을 통해 AI를 활용한 개발의 품질을 확보했습니다. 예시: 불필요한 재컴포지션을 찾아내는 FrequentlyChangingValueDetector, Scaffold의 패딩을 무시하고 있는지 확인하는 ScaffoldPaddingDetector 등의 Lint가 있습니다. BoxWithConstraints는 경고로 처리합니다.
-
테마 자동화 (Theming automation)
-
색상이나 타이포그래피의 하드코딩을 Lint로 금지합니다. Material 2 컴포넌트 사용이나, 레거시 XML에서 색상을 읽는 것까지 감지하는 시스템을 만들었다고 합니다.
-
한마디로 말하자면: Android MCP/AppFunctions를 사용하여 앱에서 에이전트에게 기능을 공개하는 방법입니다.
-
모바일 시대(Mobile Era)에는 원하는 작업을 수행하기 위해 여러 앱을 거쳐야 했습니다.
-
인텔리전스 시대(Intelligence Era)에는 프롬프트를 통해 여러 앱을 한 번에 조작하고 실행할 수 있습니다.
-
앱 내 지능 (In-app intelligence)
-
앱 자체를 똑똑하게 만드는 방식입니다. ML Kit을 통해 Gemini Nano 4를 사용하거나, Firebase AI Logic으로 클라우드의 Gemini를 호출하는 등의 방법이 있습니다.
-
지능 시스템 (Intelligence system)
-
앱의 기능을 시스템(Gemini와 같은 에이전트)에서 사용할 수 있도록 더 깊게 통합하는 방식입니다. 이번 주제는 이쪽입니다. - 사전 지원 (Proactive assistance)
-
다음에 할 일을 예측하여 잠금 화면, 알림, 키보드 등에 칩 형태로 제안합니다. 앱을 여기에 배치하는 방법은 언급되지 않았으며, 현재 가능한 것은 아래의 Prompted Assistance에 대비하는 것이라고 합니다.
-
프롬프트 기반 지원 (Prompted assistance)
-
사용자가 에이전트에게 의존하여 앱을 넘나드는 작업을 수행하게 하는 형태입니다. 작업 자동화(에이전트가 UI를 조작)보다 직접적인 API 연동이 권장된다고 합니다.
-
Android MCP는 로컬 컨텍스트나 기기 상에 존재하는 것이 중요할 때 가치가 있습니다. 예를 들어, Gemini 앱에서 사진 앱이 로컬 이미지를 반환하는 경우 등이 있습니다.
-
Android MCP 심층 분석 (deep dive):
-
goo.gle/jetpacker
-
심층 분석의 코드 예시는 여행 샘플 앱(JetPacker)에서 가져온 것이라고 합니다.
-
goo.gle/jetpacker
-
AppFunction은 특정 화면이나 Activity에 범위를 한정하여 만들 수 있습니다. 시그니처만 선언하고 UI 측에서 핸들러를 구현하며, 핸들러의 생명주기는 사용하는 coroutine scope에 자동으로 연결됩니다.
-
android skills add appfunctions: 사용자 여정(user journey)을 찾아 코드를 만들고, 에이전트가 사용할 KDoc을 정의해 줍니다.
-
android/appfunctions 샘플
-
한마디로 말하자면: 스마트폰에서 구동되는 Gemma 4의 능력과, 이를 뒷받침하는 최적화 기술(PLE, MTP, QAT)에 대한 이야기
-
Gemma의 역사와 관련하여, Gemma 4에는 E2B, E4B, 12B 등 대형의 Dense 모델과 MoE 모델이 존재합니다. 스마트폰용은 E2B/E4B입니다.
-
여기서 'E'는 Effective(실효 파라미터 수)를 의미하며, 이는 이후 설명할 Per-Layer Embeddings에서 비롯된 것입니다.
-
가능한 기능들
-
Vision, Audio (Gemma 3n에 탑재되었습니다. 작은 모델인 E2B/E4B와 12B에만 탑재된 것으로 보입니다), Agentic Reasoning(계획 수립이나 도구 호출 등이 가능함), Text(코드 생성 등)
-
E4b는 스마트폰에서 구동이 가능합니다.
-
객체 탐지 및 바운딩 박스(box) 그리기 기능도 구현된 것으로 보입니다.
-
스마트폰에서 효율적으로 작동하는 방법
-
Gemma의 최적화 기술
-
PerLayerEmbeddings: 메모리 절감 기법. 일반적으로는 임베딩(Embedding)을 거쳐 변환한 후 처리하지만, E 모델은 각 레이어마다 전용 Embedding 테이블을 추가합니다. PLE는 보통 '문자열 -> 토큰 벡터 -> Layer1 -> Layer2' 순서로 전달되지만, 이 기술은 각 레이어별 추가 Embedding 테이블을 가지고 있으며, 입력에 필요한 만큼만 읽어서 Layer1이나 Layer2에 전달하는 방식입니다.
-
파라미터 총 개수는 크지만, 메모리에 로드되는 것은 실효 파라미터(E2B의 경우 2B) 분량뿐이므로 RAM과 대역폭을 절약할 수 있습니다.
Multi-Token Prediction: 추론 속도를 높이는 기법으로, 여러 토큰을 미리 예측합니다. Quantization Aware Training (QAT): 양자화(Quantization)를 전제로 학습함으로써 양자화 성능을 향상시킵니다.
-
한마디로 말하자면: 온디바이스 AI를 다양한 사용 사례에서 쉽게 사용할 수 있도록 소개하는 ML Kit GenAI API입니다.
-
On device는 속도, 비용, 오프라인 구동, 민감 데이터 처리 측면에서 중요합니다.
(2배 이상 빨라질 수 있음)
-
ML Kit은 온디바이스 AI를 단순화시킵니다.
-
GenAI API 채택: 1,000만 다운로드 이상의 앱 9개가 이미 프로덕션 환경에서 사용하고 있다고 합니다.
-
175M+ 장치에서 AI Core를 사용할 수 있습니다.
-
AICore는 ML Kit 내부적으로 모델(Gemini Nano)의 다운로드, 실행 환경 제공, 입출력 안전 점검을 담당하는 시스템입니다.
-
prefix cache 덕분에 매번 system prompt를 처리할 필요가 없어집니다.
-
tool calling에서는 thinking mode를 사용하는 것이 권장됩니다. Google 테스트 결과에 따르면 정확도가 100점 만점에 13점 상승했다고 합니다.
-
Gemma 4 2B 모델도 Gemma 3 27B와 벤치마크 상 비슷한 수준으로 작동하게 되었다고 합니다.
-
최근의 네 가지 기능: Speech Translation, Embedding, Text to Speech, Function Calling
-
Retrieve (데모 시연 중 사기성 부재중 메시지 확인(Intake → Triage → Retrieve → Audit) 과정에서 주문 정보 등을 검색할 수 있도록 준비하는 단계)
ML Kit의 EmbeddingGeneration 기능으로 유사한 항목을 검색할 수 있습니다.
-
@Generable 어노테이션이 붙은 Kotlin 클래스를 전달하면, 출력을 해당 타입의 객체로 받을 수 있습니다 (구조화된 출력).
-
한마디로 말하자면: 백엔드 없이 앱에서 Gemini를 안전하게 호출하는 Firebase AI Logic에 대한 이야기입니다 (App Check, Server Prompt Template, Spend Caps 등).
-
모바일 환경에서 생성형 AI를 구현할 때의 문제점(API 키가 몇 분 만에 노출되는 등)을 해결하는 것이 Firebase AI Logic입니다. 앱으로부터의 요청을 Gemini Developer API 또는 Agent Platform Gemini API로 안전하게 라우팅합니다.
-
샘플 코드
-
Firebase AI Logic의 핵심 개념은 Direct Gemini Access입니다. 백엔드를 구축하지 않고도 앱의 Client SDK에서 직접 Gemini를 호출할 수 있다는 점입니다.
-
보안(Security)을 어떻게 처리하는가? App Check를 사용하여 앱으로부터의 접근만 허용하도록 제한합니다.
-
개발 중에는 debug provider를 사용하고, 프로덕션 환경에서는 Play Integrity 또는 reCAPTCHA Enterprise로 전환합니다. 샘플 코드에서 if (BuildConfig.DEBUG)와 같이 구현됩니다.
분리하여 사용했다. - 처음에는 enforce하지 않고 telemetry를 확인한 후, 문제가 없으면 enforce한다.
- 개발 중에는 debug provider를, 실제 서비스에서는 Play Integrity 또는 reCAPTCHA Enterprise로 전환한다. 샘플에서는
Server Prompt template
-
.prompt 포맷으로 작성하여 클라우드에 배치하므로, 릴리스 없이 언제든지 업데이트할 수 있다. Public Preview 기능이다.
프롬프트뿐만 아니라 모델 이름도 콘솔에서 설정할 수 있어, 새로운 모델이 나와도 앱을 릴리스하지 않고 전환할 수 있다. - Auth only(Firebase Auth의 사용자 토큰으로 요청을 인증)나 Template Only(Firebase Console에서 설정)도 가능하다. AI monitoring을 활성화하면 최종 프롬프트를 확인할 수 있다.
-
Firebase Spend Caps! 현 시대에 필수적인 기능 - 단순히 엄격한 상한선이 아니라, 멈출 때까지의 지연 시간으로 초과할 수 있으며, 초과된 부분도 청구되니 주의해야 한다. (Preview)
-
https://firebase.google.com/docs/projects/billing/spend-caps
-
비용 최적화로 소개된 것은 Firebase AI Logic triggers이다. generateContent의 앞뒤에 함수를 끼워 넣어, 사용자의 검사나 입력 필터링, 컨텍스트 추가, 응답 조정 등을 할 수 있다.
-
Gemini Live API를 통해 양방향 음성 대화(bidirectional voice conversation)가 가능하다고 한다.
-
npx skills add firebase/agent-skills
npx skills add firebase/agent-skills는 현재 Firebase의 스킬 목록이다. - https://x.com/new_runnable/status/2115579966134136895
-
한마디로 요약하면: ML Kit과 LiteRT(+ Google Play Services)로 할 수 있는 것들, 그리고 그것으로 만드는 사진 편집 앱이다.
-
LiteRT
-
Google의 온디바이스 추론 런타임(on-device inference runtime)이다.
-
이것이 Google Play Services에서 사용 가능하게 되었다. APK 크기 8MB를 절약할 수 있고, 런타임이 앱 간에 하나로 통용되며, Google이 업데이트할 수 있고, 1.4배 GPU로 구동되어 빠르며, API level 24부터 가능하다.
-
LiteRT는 250K개의 앱에서 작동하는 것으로 알려졌다.
-
Google의 앱에서도 작동한다. YouTube Shorts의 효과 등이 예시이다.
-
온디바이스 AI의 과제: 성능, 다양한 하드웨어(수백 개의 SoC)에서의 구동 여부, APK 크기, 모델 트레이닝 등 커스터마이징 문제
-
Turnkey on devices (바로 사용 가능한 환경)
-
바로 사용할 수 있는 방법은 ML Kit이다. 바코드, 텍스트, 번역 등 즉시 사용 가능한 vision/language API이며, 모델은 Play Services를 통해 제공되므로 ML 지식이 많이 필요하지 않다.
-
ML Kit으로 할 수 없는 것은 LiteRT로 자체 모델을 가져와서(커스텀) 처리할 수 있다. 두 가지 모두 하나의 런타임에서 사용할 수 있다.
-
LiteRT CompiledModel API: 하드웨어 가속 기능을 추상화한 API이다.
-
카메라 효과 등을 구현할 수 있다.
-
LiteRT in Google Play services
-
WearOS나 Android Automotive OS에서도 작동한다. 스마트폰의 컴패니언 앱을 거치지 않고, 시계나 차량 위에서 모델을 직접 구동할 수 있다.
-
OS 제한은 존재한다 (Automotive는 Android 11부터, Wear OS는 Wear OS 4부터)
-
구현 방법 예시
-
카메라 프레임에서 ML Kit의 Selfie segmentation으로 인물 마스크를 만들고, 배경에는 LiteRT Compiled Model로 커스텀 스타일(화풍 변환)을 적용한 뒤, 이를 합성하여 하나의 프레임을 만든다.
-
litert_torch (AI Edge Torch의 새로운 이름)를 사용하여 PyTorch 모델을 LiteRT용(TF Lite 파일)으로 변환한다.
-
litert_quantizer로 양자화하여 크기를 줄이고 속도를 높인다.
-
LiteRT CompiledModel이 상당히 빨라졌다고 한다.
-
이전 세대 GPU 처리 속도 대비 1.4배 향상.
-
CompiledModel에서 GPU 또는 CPU를 지정할 수 있다. CPU로 충분한 경우도 있다고 한다.
play-services-litert의 com.google.android.gms.litert.LiteRt를 사용한다.
Interpreter API와 CompiledModel을 혼합하여 마이그레이션 할 수 있다. 다만, 크기는 그대로 유지되는 경향이 있다.
LiteRT용 Android skill이 출시되었다. device-ai/litert에서 설치할 수 있다. 기존 앱의 업그레이드, 신규 앱의 템플릿 제작, Play services 버전으로의 전환을 지원한다.
LiteRT의 NNAPI 대응(2024년 비권장)은 2027년부터 제거될 것으로 예상된다고 한다. GPU나 NPU 가속화로 전환해야 할 것 같다.
한마디로 요약하면: ML Kit GenAI API를 이용해 AI 에이전트 기능을 사용하는 이야기이다.
ML Kit GenAI는 High-level tasks(요약 등)와 직접적인 접근(Direct access)을 모두 제공한다.
기존 온디바이스 사용 사례는 사기(scam)성 콘텐츠 감지나 통화 요약처럼 짧고 단발적인 작업에 국한되었다. 이번에는 여기서 앱 내부의 에이전트 기능으로 확장된다.
2027년 초에는 Gemini nano 4가 많은 사용자에게 이용 가능해질 예정이다.
ML Kit Direct access에 Function types와 Conversation history types가 추가되었다.
ML Kit에 Agentic flow API가 추가되었다.- 데모: 여행 앱에서 음성으로 “Mountain View까지의 택시비 45달러를 경비에 추가해줘”라고 말하면, 경비 추가 등의 Tool을 받은 Gemini Nano가 텍스트가 아닌 function call을 반환하여 실제로 경비가 추가된다.
val agent = Agent.builder()
...
.setMaxTurns(5)
...
singleTurn은 사용자의 질의가 한 번이라는 의미이며, 그 안에서 여러 개의 툴을 호출할 수 있다. setMaxTurns()는 이 루프의 상한선을 설정한다.
-
val session = runner.getOrCreateSession()
으로 세션을 만들 수 있다.
-
일반적으로 세션을 만들거나 turn 수를 지정하여 여러 개의 툴을 한 번에 호출할 수 있게 되었다. - AppFunction을 한 번 작성하면, 앱 내부의 Agent에도 전달할 수 있고 시스템 레벨의 Agent에도 전달할 수 있다.
-
3가지 팁
-
사용할 tool의 개수는 제한하는 것이 좋다. (focused)
-
max turn에 대한 가드레일(guardrail)은 설정하자.
-
availability를 체크하고 fallback을 구현하자.
한마디로 요약하면: TextField의 새로운 API와 그 실용적인 사용법이다.
TextFieldState가 도입되었다.
text는 외부에서는 ReadOnly이며, .edit{}을 호출해야만 TextFieldBuffer를 얻을 수 있고, 이 버퍼는 Mutable하다.
state.edit {
insert(5, ",")
delete(..)
...
- 등. setTextAndPlaceCursorToEnd 같은 함수도 있다.
- Input Transformation은 입력이 state에 들어가기 전에 개입하여, ChangeList로 변경된 부분만 보고 수정하거나 거부할 수 있다 (숫자 외의 문자를 차단하는 등).
- Output Transformation으로 전화번호에 하이픈(-)을 쉽게 넣는 것을 만들 수 있다 (예전에는 Visual Transformation으로 입력 ↔ 표시의 오프셋 변환을 양방향으로 직접 작성해야 했다. 지금은 자동으로 계산해 준다).
- TextFieldState를 어디서 사용할까?
- 보통 TextField 근처에 rememberTextFieldState()를 가진다.
- 전송 버튼을 누르는 등의 상황에서 state로부터 텍스트를 가져와, lambda로 호출원에게 전달한다.
- 다른 컴포넌트에서 텍스트 데이터가 필요하다면 그곳까지 호이스팅(hoist)한다.
비즈니스 로직으로 텍스트 입력을 다룰 경우, TextFieldState는 ViewModel에서 보관한다. UiState (StateFlow) 안에 TextFieldState를 넣는 것은 피해야 한다. mutable하기 때문에 내부 변경이 StateFlow에 통지되지 않는다. ViewModel에 직접 가지는 것이 권장된다.
편집 가능한 스타일의 텍스트를 만드는 방법은? Rich Text Edit API이다.
state.edit {
addStyle(SpanStyle(..., start = 0, end = ..., policy = ExpandPolicy.InsideOnly))
insert(0, "xxxx")
...
ExpandPolicy.InsideOnly로 그 안에서 텍스트를 추가하면 Span의 범위가 늘어나거나 한다. - 샘플
TextField에서 검색한 것을 하이라이트하고 싶을 때는 Output Transformation으로 텍스트를 검색하여 거기에 스타일을 적용한다****Jetpack Compose 공식에서 마크업 텍스트(Markdown 등) 표시를 지원하는 새 라이브러리를 개발 중인 것 같다. 예고 단계이다.
한마디로 말하자면: R8과 그 최적화를 돕는 새로운 도구
상위 앱의 41%가 Google Play 품질 요구 기준(최적화 25%)에 미달하는 것 같다. 13%는 이미 그 3배를 달성했다.