본문 바로가기

Android/기타26

Bitrise를 도입해 보자! 🛠 ■ Bitrise CI/CD 도입을 통한 배포 과정 자동화 및 효율성을 향상 시킨 경험 Background 리딩앤 서비스는 하나의 프로젝트와 사내 디자인 시스템, Utils, Viewer 등 5개 이상의 공통 모듈이 결합하여 형성되어 있음. 배포를 위해서는 프로젝트와 공통 모듈의 버전을 세팅한 후 APK를 추출하고, 이를 다운로드 할 수 있는 웹 페이지를 생성하여 QA 팀에 전달. Problem Situation 개발자의 실수로 잘못된 버전의 모듈로 APK 파일을 추출하여 전달해 잘못된 파일을 QA 검증하는 경우가 있었음. 웹페이지 생성 및 전달, Slack 알림 등 복잡하고 많은 리소스가 필요함. Troubleshooting & Result 사내 모바일 개발자들과 함께 Bitrise를 도입하여 CI.. 2024. 3. 23.
하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자!(1) - BuildType, productFlavors 이 글을 앞서 먼저 예시의 상황을 만들어 보자. 먼저 당신은 서비스를 개발하기 전 다양한 형태의 서비스를 제공하기 위해 설계를 해야한다. 여기서 다양한 형태란 무엇일까? 개발용 debug, 구글 플레이스토어에 올라갈 실제 유저가 사용될 release 두 가지의 빌드 타입 무료버젼과 유료버젼 등 다양한 버젼 딥링크를 활용한 서비스 지원 라이브러리화하여 외부 업체 지원 하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자! 시리즈는 위의 다양한 형태에 대해서 작성해보려 한다. 2편 : 하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자!(2) - DeepLink 3편 : 하나의 프로젝트에서 여러 다른 버젼의 앱을 만들어 보자!(3) - Link 이번 글은 빌드 타입과 버젼을 지정할 수 있는 방법에 대해.. 2024. 1. 28.
안드로이드에서의 직렬화에 대해 알아보자 (Serializable, Parcelable) Info 나는 사이드 프로젝트 중 Clean Architecture로 레이어를 나눠 개발 중이였다. 현 상황은 UI레이어에서는 Domain의 Book이란 객체를 사용하고 있었다. JetPack Navigation을 이용해 이전화면에서 데이터를 넘김과 동시에 화면을 이동하려 하는데 Serializable 이나 Parcelabe이 아니면 객체를 넘기지 못했다. 이런 상황에서 Domain은 순수한 객체여야 하기에 Parcelabe 는 Android SDK 인터페이스이기에 사용하지 못한다. 그렇기에 이 상황을 넘김과 동시에 직렬화에 대해 좀더 이해하기 위해 이 글을 작성한다. 직렬화란? 직렬화는 메모리 내에 존재하는 정보를 보다 쉽게 전송 및 전달하기 위해 byte 코드 형태로 나열하는 것이다. 여기서 메모리 .. 2023. 12. 2.
Image Loader info 이번 목차에서는 Image Loader에 대해서 정리하는 글을 적으려 한다. 나는 다양한 SNS앱들의 빠른 이미지 로딩을 보며 어떻게 구현했길래 이미지를 로딩하는 화면을 안정적으로 동작시키는지가 궁금해졌다. 사실 나는 안드로이드 개발을 하면서 Glide, Piccaso, Coil 등등 Third Party 라이브러리만 사용만 해봤지 어떤 프로세스를 가지고 있는지, 이들의 차이점들에 대해서는 깊게 공부하지 않았기에 이번 글에서 정리해볼 예정이다. 이미지 로딩 라이브러리는 무엇인가? https://d2.naver.com/helloworld/429368 위의 블로그를 읽으면 이해가 된다. 그니까 이렇게 엄청나고 귀찮은 단계를 거쳐야하는 것을 처리해준다는 것이다. 위의 블로그에 작성된 엄청나고 귀찮은 .. 2023. 10. 22.
하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자!(2) - 딥링크, 앱링크 이번 글은 DeepLink에 대해서 알아보도록 하자. DeepLink란 딥링크를 사용하면 유저가 앱과 앱을 오가는게 쉬워진다. 웹과 마찬가지로 앱에서도 링크를 통해 특정 콘텐츠로 이동할 수 있는 기능이다. 채팅, 광고, 푸시 알림 등에서 사용자를 특정 앱 화면으로 바로 연결할 수 있습니다. 예를 들어 우리가 모바일 게임을 사전 등록 했다가 출시 당일이 되면 링크가 날라온다. 해당 링크를 클릭하면 스토어로 이동하게 되는데 만약 앱이 설치한 후 다시 링크를 누르게 되면 바로 해당 게임이 열린다. 그럼 그 링크를 만드는 법과 종류에 대해서 알아보자. URI 스킴(URI Scheme) URI 스킴은 앱을 실행하거나 특정 기능을 실행하기 위해 사용되는 고유한 식별자이다. 우리는 티스토리의 특정 페이지로 이동할때 .. 2023. 7. 19.
딥링크와 앱링크 딥링크란 딥링크를 사용하면 유저가 앱과 앱을 오가는게 쉬워진다. 웹을 보다가, 특정 화면만 유저가 앱으로 봤으면 하는 경우 딥링크가 작동하는데, 이때 유저가 앱을 깔아두었으면 바로 해당화면으로 이동한다. 웹을 서핑하다가 앱으로 보내려고할 때 ... 해당 서비스의 앱이 있다면 - 해당 앱으로 이동한다. 해당 서버스의 앱이 없다면 - 해당하는 store로 이동한다. 이 기능을 가능하게 해주는데 딥 링크이다. 링크의 형태는 앱 스킴(URL 스킴) 혹은 일반적인 https:// 링크 두 가지 형태를 둘다 지원한다. 즉 https://www.example.com 혹은 app://open.my.app 두 형태를 모두 지원한다는 말이다. 또한, 아래 그림처럼 눌렀을 때 필요한 앱을 직접 선택할 수 있도록 한다는 특징.. 2023. 7. 19.
하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자!(1) - product flavors, build variants 1. 딥링크 앱링크 2. 'product flavors' 또는 'build variants'를 활용하는 것 안드로이드 스튜디오를 사용하여 하나의 프로젝트에서 여러 다른 버전의 앱을 만드는 방법은 주로 'product flavors' 또는 'build variants'를 활용하는 것입니다. 이를 통해 동일한 코드 베이스를 공유하면서도 약간 다른 버전의 앱을 만들 수 있습니다. 1. Product Flavors': 'build.gradle(Module: app)' 파일에서 'productFlavors'를 설정하여 각각의 앱 버전에 대한 고유한 설정을 할 수 있습니다. 예를 들어, 다음과 같이 설정할 수 있습니다.여기서 'free'와 'paid'는 각각의 앱 버전을 나타냅니다. 'applicationId'는 .. 2023. 7. 17.
4 issues were found when checking AAR metadata: 이 오류에 대해 구글링을 해보면 그렇게 안된다.... 하는법을 작성하자. 2023. 4. 1.
app:cardCornerRadius 오류 개발 도중 옛날폰(구글 폰인데 진짜 옛날폰이였음..)에서 갑자기 머더리얼 디자인이 나오지 않았다.... 이유는 app:cardCornerRadius 는 height의 1/2 로 써줘야 (height가 21dp 니깐 11dp or 10dp) 원하시는 원형이 나온다. 1/2이 넘어갈경우 옛날 폰에서 이상현상이 생기는 오류가 있었다!!! 2023. 1. 2.
StateFlow<MutableList<Object>> 에 추가, 삭제 하는 법 stateflow의 value를 바꿔본 적은 있지만 한개씩 추가해본적은 없었는데 아래와 같은 방법을 사용하자!! 예시로 private val _editerChattingList = MutableStateFlow(mutableListOf()) val editerChattingList: StateFlow get() = _editerChattingList 위와 같이 있을 경우 fun onEditerChattingList(item: CHAT_LIST_ITEM) { _editerChattingList.value = _editerChattingList.value.toMutableList().also { list -> if (list.contains(item)) list.remove(item) else list.ad.. 2022. 12. 16.
안드로이드 리플렉션 이슈 안드로이드 개념을 공부하던 중 직렬화라는 개념에 대해서 공부를 했다. 직렬화란 메모리에 올라가 있는 정보를 byte 단위의 코드로 나열하는 것이다. 이를 통해서 객체와 같은 정보를 전달할 수 있게 하는 것이다. 직렬화를 가능하게 하는 방법 중에는 Serializable과 Parcelable을 구현하는 2가지 방법이 존재한다. 그 중 Serializable은 구현은 상당히 쉬우나 속도가 느리다는 단점이 있다. 속도가 느린 이유는 내부적으로 Reflection을 사용하기 때문에 필요없는 쓰레기 객체들을 만들어내고 이를 제거하기 위해 GC가 동작해서 비용이 발생하게 된다. 그렇다면 여기서 말하는 Reflection은 무엇일까?? Reflection 객체를 통해 클래스의 정보를 분석해 내는 프로그래밍 기법을 말.. 2022. 12. 10.
리사이클러뷰 android:clipToPadding="false" 리사이클러뷰에 패딩을 줄 경우 위아래에 패딩공간이 있을 것이다. 그런데 사람마다 다르겠지만 스크롤을 한 경우 패딩공간을 활용하면 좀더 뷰를 활용할수있고 자연스러운(?) 뷰를 보여줄 수 있을 것이다. 그러할 경우 android:clipToPadding="false" 넣어주면 위와 같은 자연스러운 리사이클러뷰를 얻을 수 있다. 기본적으로 리사이클러뷰에 android:clipToPadding="false" 속성을 주는게 좋다고 한다. 2022. 11. 23.
채팅방의 스크롤시 버벅임 현상 배포 이후 채팅방의 버벅임 현상이 발생했다. 이유가 무엇인지 찾아보니 전 배포까지는 발생하지 않았다. 그래서 라이브러리쪽을 유심히 봤는데 constraintlayout 을 Flow을 사용하기 위해 ConstraintLayout 1.1.3 -> ConstraintLayout 2.0.0 으로 올렸던 commit을 발견할 수 있었다.... ConstraintLayout 2.0.0 을 찾아보니 빠르게 그려내지 못하는 리사이클러뷰 이슈가 있었던 것이였다... 대박...이래서 현장을 해보면 이러한 이슈를 겪어볼 수 있다니... 그래서 그보다 높은 버젼을 올려주니 해결이 되었다. 2022. 11. 23.
layout Inspector 개발을 하다 보면, 코드만으로는 어디에서 문제가 발생했는지 확인하기 난해할 때가 있다. 이를테면 그려진 화면을 보니 ImageView를 그리는 과정에서 뭔가 오류가 난 것 같은데, 그게 단순히 width 값의 문제인지, 아니면 다른 속성값의 문제인지 확인이 필요하다거나 할 때. 이럴 때면 개발자 입장에서는 지금 눈으로 보고 있는 특정 View가 가지고 있는 값을 실시간으로 확인하고 싶을 수 있다. 안드로이드 스튜디오의 Layout Inspector는 바로 이런 기능을 제공한다. 사용법은 아주 간단하다. 아래처럼 Tools > Layout Inspector 로 레이아웃 인스펙터를 활성화 시켜주기만 하면 된다. 그러면 이렇게 스튜디오의 오른쪽 아래 부분에 레이아웃 인스펙터가 활성화된다. 상단 부분의 Live.. 2022. 11. 7.
FragmentMannager 나는 회사에 가기 전 FragmentMannager을 막 썼었다... 그런데 회사에 가서 바텀 프레그먼트간의 취소 버튼등으로 사용자가 원하는 방향으로 움직이는 것에 대해 개발을 하다보니 막쓰면 안된다는 것을 알았고 잘 정리 해보려고 한다. 예시1 (activity 내에서) supportFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) supportFragmentManager.beginTransaction() .replace(R.id.main_fl, fragment, tag) .addToBackStack(tag) .commitAllowingStateLoss() 예시2 (activity 내에서) suppo.. 2022. 11. 3.