전체 글 217

코드 & 리소스 최적화로 앱 용량 줄이기

앱을 잘 만들어서 신나게 플레이스토어에 올렸다고 생각해보자. 그런데 다운로드 받는데 한참 걸린다.그럼 사용자는 최악의 경우 다운로드를 취소할 수 도 있다.(다소 과장)  다양한 설정을 통해 용량을 줄이고 이러한 상황을 막아보자.  isMinifyEnabled기능사용하지 않는 코드 축소앱 및 라이브러리 종속 항목에서 미사용 클래스, 필드, 메서드, 속성을 감지하여 안전하게 삭제라이브러리 종속 항목에서 몇 개의 API만 사용한다면 축소는 앱이 사용하지 않는 라이브러리 코드를 식별하고 앱에서 그 코드만 삭제앱 클래스 및 멤버의 이름을 줄이는 난독화이름을 줄이는 과정을 통해 앱의 크기를 줄임R8을 사용한 난독화개선된 코드 최적화 전략을 적용하여 앱 크기 줄이고 성능 개선하는 최적화  하지만 단점으로 내가 작성한..

Android 2024.11.20

한 휴대폰에 Release앱과 Debug앱 두개를 다운받는 방법

얼마전 한끼족보라는 앱을 릴리즈 했다.그래서 스토어에서 앱을 다운받아두었고, 이후 개발을 다시 하려고 했다.Existing package com.hankki.hankkijogbo signatures do not match newer version; ignoring! 이러한 오류가 발생했다. 그리고 다른 방법을 통해서 디버그 버전을 실행시키려 하니 "이미 앱이 존재합니다. 지우고 다시 다운받으시겠어요?" 와 같은 오류가 발생했다.  내가 원하는 것은 Debug앱은 따로 있고, Release앱도 따로 있어서 둘다 다운받아둘 수 있는. 그런 상황을 원한다.  그래서 원인을 찾아보았고, 해결법까지 찾아 적용한 기록을 남긴다.참고로 지금부터 작성할 모든 gradle파일은 build.gradle.kts(Module..

Android 2024.10.21

잘못한 Commit이 Github까지 올라갔을때?! - reset, force push... revert?

내가 스토어에 올려둔 프로덕트를 사용하던 친구에게 제보가 들어왔다.우측 gif처럼 필터를 클릭하면 리스트값이 변경되고 마커가 사라져야 하는데 좌측 gif에서는 해당 기능이 동작하고 있지 않다. 놀랍게도.. 좌측 gif가 1.0.2로 스토어에 올라간 버전이다.  문제는 1.0.1에서 1.0.2로 올라가며 내 실수로 코드가 누락된 것.hotfix로 진행했다보니 PR이 없이 진행되었고, 그로인해 내 실수가 그대로 출시되었다.  물론 해결자체는 간단했기에 빠르게 수정 후 1.0.3으로 업데이트 진행하였고 심사도 무사히 통과해 릴리즈 되었다.   이제 여기서 문제가 발생한다. hotfix브랜치 위로 main브랜치를 리베이스 하는 것은 문제가 없었다.하지만 main위로 develop을 리베이스 하는 과정에서 잦은 ..

Git 2024.10.20

SOPT 35th 안드로이드파트 미미나 - Navigation과 Stack 관리

1. 왜 Navigation을 쓸까? with SAAXML의 Activity기반 뷰에서는 위와 같이 Intent로 화면을 이동했어요.  하지만, 2018 Google I/O에서 Single Activity라는 개념을 언급했어요Single activity: Why, when, and how (Android Dev Summit '18) Single Activity라는 개념은 기존의 액티비티 기반의 화면 구성이 아닌, 소수의 액티비티와 다수의 프래그먼트를 이용해 화면을 구성하는 구조로 jetpack navigation과 함께 소개되었어요.  근데 지금까지 Activity와 Fragment 기반으로 잘 사용해왔는데 왜 굳이 바꾸는걸까요? 제일 큰 이유는 Activity보다 Fragment가 더 가벼워요. 공식문..

대외활동/SOPT 2024.10.12

분명히 텍스트 높이 지정했다니까요??? - Android Compose LineHeight Error

최근 프로젝트를 진행하며 100% Compose로 Android를 구현하였다.XML에서 하는 것 처럼 작업을 했지만, Compose에서는 다르다는 것을 깨달았던 LineHeight에 대해서 글을 써보려고 한다.   기존에 XML에서 코드를 작성했던 방식은 아래와 같다.ttf혹은 otf를 추가하고, 폰트 패밀리를 만들어준다.    그 후 value/appearance에서 아래와 같이 Text들의 설정을 해준다.색상, 폰트 패밀리, 텍스트 사이즈 등을 설정하고, paddingVertical을 활용하여 LineHeight를 지정해준다.   이렇게 XML에서 설정해봤었고, 비슷한 방법으로 Compose에서도 이번에 설정해보고자 했다.Compose로 구현하고자 레퍼런스로 DroidknightsApp과 sopt-a..

BounceClick을 Compose에서 수식과 함께 구현해보자 with Animation

최근 프로젝트를 하나 하며 디자이너의 요구사항을 하나 받았다.Button을 클릭했을 때 Bunce Click을 구현해달라 하더라.  사용자가 클릭을 했을 때 scale이 작아지고, 위에 검은색 filter가 생겨야 한다. 그리고 손을 뗀다면 다시 원래대로 돌아와야 한다.  이 기능을 구현하기 위해 제일 첫 단계로 Modifier의 확장함수를 만들기 시작했다.@Composablefun Modifier.bounceClick(): Modifier = composed {} 특정 버튼에 해당 기능을 넣어둔다면 다른 버튼에 넣어달라 할 때 마다 버튼부터 새로 만들어야 할 것이다. 그렇게 된다면 자연스럽게 너무 많은 시간이 들게되고, 비효율적이게 된다고 생각한다.  그래서 Modifier의 확장함수를 만들고 이를 적..

Android 2024.07.19

[Android] Type Safety Navigation With Compose

Compose에서 화면을 전환하기 위해서는 Navaigation 사용이 필수적이다.하지만 예전 버전의 경우 Route를 String으로 지정해줘야 하는 불편함이 있었다. 그런 불편함을 개선하고 새로 나온 Type Safety Navigation의 사용법과 주의점을 소개하고자 한다.    Dependencies"androidx.navigation:navigation-compose:2.8.0-beta04" // 2.8.0-alpha01 부터 가능"org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.0" // kotlin 2.0"org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3" // kotlin 1.9.22이렇게 두개..

[Android] Dagger Hilt, 제대로 알고 쓰자

Hilt가 뭘까??Hilt는 안드로이드 프로젝트에서 수동 의존성 주입 시 발생하는 보일러 플레이트를 줄이는 의존성 주입 라이브러리이다.Hilt는 Dagger가 제공하는 컴파일 시간 정확성, 런타임 성능, 확장성 및 Android Studio의 이점을 누리기 위해 인기 있는 DI 라이브러리인 Dagger를 기반으로 빌드되었다.  왜 쓰는 걸까??의존성 주입을 위해서는 많은 보일러플레이트가 존재한다. 이러한 보일러플레이트들을 줄이기 위해서 나온 것이 Hilt이다. 여러분들이 가장 많이 겪었을 상황을 아래 예시와 함께 보자.이렇게 ViewModel에 Repository를 Inject해주고 있다.이러한 코드를 사용하기 위해서는 ViewModel은 내부 파라미터를 지원하지 않기 때문에 반드시 DI를 해줘야한다. ..

DroidKnights 2024 Lightning Talk 후기

2023년 내가 첫 안드로이드를 공부했을 때 DroidKnight라는 행사를 들어봤지만, 그 때 당시에는 오전, 오후수업이 전부 있어서 참석하지 않았었다. 하지만 이후 많은 안드로이드 사람들을 만나고 그사람들과 이야기 할 때면 항상 DroidKnight가 토픽으로 나왔었다. 과감하게 수업을 빼고 행사에 가지 못했던 나를 자책하고 24년에는 반드시 가리라 다짐하며 23년을 마무리 했었다. 굿즈 뱃지 이쁘더라...  그러다 2024년 DroidKnight가 열린다는 소식을 들었고 시간이 되자마자 바로 티켓을 구매했다. 49000원이라는 가격이 조금 부담되긴 했지만, 가서 많은 것을 배우고 싶다는 욕심이 더 컸다. 그렇게 티켓을 구매한 후 페스타 페이지를 구경하다 신기한 것을 발견했다. 요즘들어 취업에 대한 ..

대외활동 2024.06.16

SOPT 34th 안드로이드파트 미미나 - State와 SideEffect로 Compose를 관리해보자

안녕하세요. SOPT 34기 안드로이드 파트 OB 박동민입니다. 벌써 3번째 미미나네요. 오늘은 Compose를 이용해서 Android를 개발할 때 중요한 상태관리를 알아보고자 합니다.  목차Flow에 대해서 알아보자StateFlowSharedFlowMVI란?MVVM과 뭐가 다를까?MVI는 어떤걸까?예시로 알아보자   Flow에 대해서 알아보자Flow는 Kotlin 코루틴을 사용한 새로운 비동기 데이터 스트림 처리 방법이다.어려운걸 다 때고 말하면 내부 값이 변화했을 때 이 변화를 collect할 수 있다. 즉, 변화가 발생한다면 이를 감지하고 내가 원하는 동작을 할 수 있게 해주는 트리거 역할을 해준다고 생각하면 쉽다. 물론 Flow를 사용하는 큰 이유는 코루틴의 활용일 것이다. 하지만 지금 글에서는..

대외활동/SOPT 2024.06.10