??님 Preview가 흐릿한데 왜그래요?
·
Android/Compose
안녕하세요 아키입니다. 오늘은 우테코 미션을 진행하다가 마주쳤던 Compose Preview 렌더링 이슈를 공유해보려 합니다.@Preview(device = Devices.DESKTOP)을 사용하면 텍스트와 경계선이 심하게 흐릿하게 렌더링되는 반면 device = Devices.TABLET으로 바꾸면 훨씬 선명하게 보이는 현상을 겪어본 적 있으신가요? 저는 아래와 같은 경우를 경험했어요.처음에는 또 프리뷰가 말썽이구나 했지만 원인은 코드가 아니라 Android Studio 렌더링 엔진의 스케일링 방식과 기기 프로파일별 DPI 설정의 차이에 있었습니다.원인 분석1. Devices.DESKTOP의 낮은 DPIAndroid Studio의 Compose Tooling에서 정의한 Devices.DESKTOP의 기..
ProcessPhoenix 제거, 자기전에 생각날거야
·
Android/Compose
저는 안드로이드 개발을 하면서 에뮬레이터, 실제 디바이스를 오가면서 앱을 테스트하고 있어요. 디바이스의 경우에는 패드와 저/고사양 기기로 총 3가지를 사용하는데요. 그중에서 저사양 기기에서 앱이 재시작 되는 로직에 프레임드랍이 생기거나 재시작이 무시되는 경우가 종종 발견됐습니다. 처음엔 단순히 기기 성능 문제라고 생각했습니다. 그러나 충분히 최적화 가능하지 않을까? 라는 생각으로 코드를 뜯어보니 사용하던 ProcessPhoenix 라이브러리가 생각보다 무거운 작업을 하고 있었습니다.좀 무거운듯하이링구얼 프로젝트에서는 토큰 만료, 로그아웃, 회원탈퇴의 경우 앱을 재시작하고 있습니다. 그래서 ProcessPhoenix라는 라이브러리를 사용했습니다. 많은 안드로이드 프로젝트에서 사용하는 검증된 라이브러리였으니..
DisposableEffect대신 LifecycleEffect
·
Android/Compose
프로젝트를 진행하면서 Compose의 생명주기를 다루는 방식에 대해 고민하게 되는 건 당연한 것 같습니다. 특히 안드로이드의 생명주기와 컴포저블의 생명주기가 만나는 지점에서 어떤 선택을 해야 하는지는 항상 고민이 되는데요.최근 presentation:home 모듈을 리팩터링하면서 이 문제를 깊이 있게 들여다볼 기회가 있었습니다. 그 과정에서 배운 것들을 공유하고자 합니다.문제 상황앱이 백그라운드에서 다시 활성화될 때마다 알림 권한 상태를 확인해야 하는 요구사항이 있었어요. 자연스럽게 DisposableEffect를 사용했습니다.@Composablefun HomeRoute(viewModel: HomeViewModel) { val lifecycleOwner = LocalLifecycleOwner.cur..
Compose에서 골치덩어리 EdgeToEdge를 잘 써보자.
·
Android/Compose
시작은 불편함에서..Android 15부터 Edge-to-Edge가 기본으로 적용되면서, 이제 앱의 콘텐츠가 시스템 바 아래까지 확장되는 것이 표준이 되었어요. 덕분에 개발자들은 더 넓은 화면을 자유롭게 사용할 수 있게 되었습니다. 하지만 동시에 디자인에 맞춰 상태 바(Status Bar)의 색상을 화면과 자연스럽게 연결해야 하는 과제가 생겼어요😅저도 이 작업을 진행하면서 고민이 많았어요. 이전에는 systemuicontroller 같은 라이브러리를 사용하면 간단히 해결됐지만 Android 16(Tiramisu)부터 Deprecated 되었고, 더 근본적인 문제가 있었어요.LaunchedEffect나 DisposableEffect 안에서 시스템 바 색상을 변경하는 코드를 호출해야 했는데, 이 방식은 스..
오픈소스 생태계에서 오픈소스 명시하기
·
Android/Compose
앱을 출시하기 전 꼭 포함해야 하는 화면 중 하나가 바로 오픈소스 라이선스 명시입니다. 일반적으로 가장 먼저 떠올리는 방법은 Google에서 제공하는 play-services-oss-licenses-plugin을 사용하는 방식이고 저도 공식 지원인 플러그인을 적용했습니다.공식 플러그인이 제대로 작동하지 않음막상 구현하고 보니 화면이 제대로 표시되지 않았어요. 세팅하는 과정에서 뭔가 잘못했나 싶어서 여러번 확인했지만 특별히 잘못된 부분은 없었습니다.// app/build.gradle.ktsplugins { id("com.google.android.gms.oss-licenses-plugin")}// ... dependencies// Activity 코드startActivity(Intent(this, O..
StateFlow를 활용한 네비게이션 상태 관리와 UI 로직 분리
·
Android/Compose
안녕하세요, 최근 Hilingual 프로젝트의 네비게이션 로직을 리팩토링했봤는데요. 이번 글에서는 @Composable에 의존하던 내비게이션 상태 로직을 UI와 분리된 상태 홀더 패턴과 StateFlow를 통해 개선한 과정을 공유하려 합니다. [REF/#182] Refactor navigation with AppState and simplify dialog handling by angryPodo · Pull Request #183 · Hi-lingual/HilingRelated issue closed [REF] MainNavigator Refactor #182 Work Description ✏️ MainNavigator를 MainAppState로 통합 및 리팩토링 기존 MainNavigator의 탐색 ..