AI에 Android 작업을 맡길 때는 원하는 결과부터 설명하게 됩니다.“불필요한 R8 keep 규칙을 찾아 줘.”요청은 짧지만, 규칙 파일만 읽어서 끝낼 수 있는 작업은 아닙니다. 어떤 빌드 설정을 사용하는지, 라이브러리가 이미 제공하는 규칙인지, 리플렉션으로 사용하는 코드인지도 살펴야 하죠. 이런 확인 순서와 판단 기준을 매번 설명하는 대신, 필요할 때 AI가 읽도록 묶어 둘 수 있습니다. Agent Skills가 하는 일입니다.Google의 android/skills 저장소에도 Android 개발용 지침이 공개되어 있습니다. 이번 글에서는 r8-analyzer 스킬의 원문을 읽으며, Skills가 어떤 정보를 담고 실제 개발 작업과 어떻게 연결되는지 알아보겠습니다.작업 절차를 담는 SkillsSki..
마이페이지에서 내 주문과 쿠폰을 조회한다고 해보겠습니다. 두 기능 모두 어떤 계정의 데이터를 조회할지 알아야 하므로 계정 정보를 전달합니다.loader.loadOrders(account)loader.loadCoupons(account)같은 계정을 사용하는 함수가 늘어나면 같은 인자도 반복해서 넘기게 됩니다. 그렇다고 계정 정보를 전역 변수로 옮기면, 함수가 어느 계정으로 조회하는지 확인하기 어려워지죠. Kotlin의 Context parameters는 함수가 필요한 값을 미리 선언하고, 호출하는 쪽에서 그 값을 제공하는 기능입니다. 호출마다 인자를 적는 대신, 여러 호출이 같은 값을 사용하도록 묶을 수 있습니다. 이번 글에서는 계정 정보를 전달하는 예제로 동작을 살펴보겠습니다. 익숙한 일반 인자와 확장 ..
공유받은 링크를 누르면 앱의 상품 상세 화면이 열립니다. 이 동작을 구현하려면 앱은 먼저 URL에서 어떤 상품을 보여줄지 알아내야 합니다. 예를 들어 https://shop.example.com/products/42를 받았다면 상품 42의 상세 화면으로 연결해야 하죠. 그런데 랜딩 되는 화면뿐만 아니라, 뒤로 갔을 때 어떤 화면을 보여줄지도 정해야 합니다. Navigation 3 1.2.0에는 이 작업을 돕는 딥 링크 API가 추가되었습니다. UriDeepLinkMatcher는 URL을 화면 키로 바꾸고, withBackStack은 그 화면 앞에 둘 경로를 구성합니다. 이번 글에서는 상품 링크 하나가 앱의 화면으로 연결되는 과정을 살펴보겠습니다. 예제는 Navigation 3 runtime·UI 1.2...
요즘 개발하면서 AI가 코드를 작성하는 일이 꽤 익숙해졌습니다. 아니요! 이제는 AI가 없으면 일을 할 수 없게 되었죠. 하핫...필요한 기능을 설명하면 코드가 나오고, 오류가 발생하면 다시 물어봅니다. 그런데 한편으로는 궁금합니다. 코드가 잘 나온다고 해서, 제가 AI를 잘 쓰고 있는 걸까요? 저는 주로 Claude를 사용하고 있습니다. 다른 AI도 써봐야 하는지, AI마다 어떤 차이가 있는지도 궁금하고요. 새로운 도구 소식이 계속 나오니 지금 사용하는 방식만으로 충분한지도 잘 모르겠습니다. 블로그의 첫 AI 글은 이 고민에서 시작해 보려고 합니다. 새로운 도구를 알아보기 전에, 지금 쓰는 AI에 개발 작업을 어떻게 맡기고 있는지부터 살펴볼게요.AI의 시대, 개발자의 역할AI에 코드를 물어보는 방식은 ..
목록에 중복된 항목이 있는지 확인할 때 distinctBy를 사용해 본 적 있으실 텐데요. 중복을 제거한 목록의 크기와 원래 크기를 비교하면 간단하게 확인할 수 있습니다. 그런데 우리가 필요한 값은 중복 여부인데, 코드에서는 중복을 제거한 목록까지 만들고 있습니다. 앞부분에서 중복을 발견해도 남은 항목을 계속 확인해야 하고요. Kotlin 2.4.20에는 이런 확인을 위한 allDistinct와 allDistinctBy가 추가되었습니다. 이번 글에서는 상품 목록을 검증하는 작은 예제로, 목록을 만드는 작업과 중복을 판단하는 작업이 어떻게 다른지 알아보려고 합니다.상품이 서로 다르면, 상품 번호도 다를까?상품을 등록하기 전에 같은 매장의 상품 번호가 겹치는지 확인한다고 해보겠습니다. 아래는 설명을 위한 실..
Compose에서 Flow를 수집할 때 collectAsStateWithLifecycle()을 많이 사용합니다. 화면의 Lifecycle에 맞춰 수집을 시작하고 중단해 주는 함수인데요. 그런데 이 함수를 사용했는데도 앱을 백그라운드로 보내면 API 요청이 계속 실행되는 경우가 있습니다. 수집을 멈춰 준다는데, 요청은 왜 멈추지 않을까요? 이번 글에서는 주기적으로 데이터를 가져오는 예제로 화면이 값을 받는 수명과 데이터를 만드는 작업의 수명을 나눠서 알아보려고 합니다.수집을 멈추면 요청도 멈출까? 우선 요청을 마친 뒤 1초를 기다렸다가 다음 숫자를 가져오는 간단한 Repository를 만들겠습니다. 실제 서버 대신 요청 횟수를 반환하는 실습용 코드입니다. class CounterRepository { ..
Google I/O 2025 'Add Predictive Back animations' 코드랩을 기반으로 작성되었습니다. What is predictive back?predictive back은 뒤로 가기 제스처를 진행하는 동안 이동할 화면을 미리 보여주는 기능입니다. 첨부된 자료처럼 손가락을 움직이는 정도에 따라 이전 화면이 서서히 나타나는 것을 볼 수 있습니다. 유저는 미리 보이는 화면을 보고 뒤로 가기를 완료할지 취소할지 판단할 수 있습니다. 앱 첫 화면에서는 홈 화면으로 나가게 된다는 것을 미리 알 수 있으니, 실수로 앱을 이탈하는 상황을 줄이는 데 유용할 것 같네요. How to add predictive back support코드랩에서는 먼저 홈 화면으로 돌아가는 predictive back..
Google I/O 2025 'Improve the user experience of an Android app' 코드랩을 기반으로 작성되었습니다. Make your app edge-to-edge on Android 15targetSdk를 35 이상으로 올리면 Android 15 이상 기기에서 edge-to-edge가 기본으로 적용됩니다. edge-to-edge는 앱 콘텐츠를 상태바와 시스템 내비게이션 바 뒤까지 확장해, 디스플레이 공간을 더 넓게 활용하는 방식입니다.Android 15에서는 테마의 windowOptOutEdgeToEdgeEnforcement로 적용을 일시적으로 해제할 수 있습니다. 다만 targetSdk 36 이상인 앱을 Android 16 이상 기기에서 실행하면 이 설정은 더 이상 적..
텍스트 하이퍼링크 기능을 Compose의 ClickableText로 구현하셨나요?2024년 9월 4일 출시된 Compose Foundation 1.7.0부터 텍스트 하이퍼링크를 쉽게 구현할 수 있는 LinkAnnotation을 안정적으로 사용할 수 있습니다. 같은 버전에서 ClickableText는 deprecated 되었고, Text 또는 BasicText에 LinkAnnotation이 담긴 AnnotatedString을 전달하는 방식이 권장됩니다. ClickableText는 이제 그만 LinkAnnotation을 알아보기 전에 ClickableText를 잠시 살펴보면 LinkAnnotation의 장점을 쉽게 알 수 있습니다. 하나의 문자열에 하이퍼링크가 두 개 이상 있다면, 클릭한 위치가 어느 링크에..
MessagingStyle 이번 글에서는 Android 알림 스타일 중 MessagingStyle에 이미지를 표시하는 방법을 알아보려고 합니다. MessagingStyle은 채팅처럼 대화형 데이터를 표시할 때 사용하는 알림 스타일입니다. 최근 회사에서 앱의 알림 스타일을 MessagingStyle로 변경하는 작업을 진행했는데요. 이미지를 표시하는 부분에서 어려움을 겪어서 이번 글에서 정리해 보려고 합니다. 기본 사용법 val person = Person.Builder() // (1) .setName("자비스") .setIcon(IconCompat.createWithBitmap(bitmap)) ... .build() ..
- Total
- Today
- Yesterday
- github
- WebView
- Kotlin
- Test
- TEXT
- android
- Unit Test
- View
- Repository
- Coroutine
- AOS
- CI/CD
- ViewModel
- exception
- Dependency
- build
- git
- singleton
- Gradle
- AI
- deep link
- 기술질문
- flow
- Java
- recyclerview
- 안드로이드
- 백준
- google io 2025
- compose
- MVP
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |