Android 99

MVI 를 찍먹해보자.

mvi 이야기는 한참전부터 나왔던거 같은데대충 아~ 이런게 있다더라 너 써봤니?하고 말았던 mvi 이제는 현업에서도 꽤 많이 사용하고 있다는 소식이 들린다.mvi 는 쉽게 개발해주는 라이브러리도 많이 쓰는거 같은데역시 튜닝의 끝은 순정이라고나는 기본 개념을 익히는 느낌으로 만들어볼까한다.이렇게 익히고나서 라이브러리를 쓰는게 편해지는거 같고 기분이 좋으니까 그래서 mvi 가 뭘까 짠.View ( Model ( Intent( ) ) ) 첨에 이거 봤을때는 그래서 이게 뭔데 라고 생각했지만알고나니까 아! 역시는 역시다 라고 생각한다.하지만 나는 친절한 개발자니까 좀 더 풀어서 적어보자. 대충 요렇게 돌아가는건데 view : 우리가 맨날 만드는 화면이다. view 나 compose 모두가 될 수 있다.inten..

Android 2025.01.19

안드로이드 컴포즈 네비게이션 startDestination 에 argument 전달하기

이 글은 컴포즈 네비게이션 2.7 버전을 기준으로 작성됐다. 네비게이션을 쓰다가 startDestination 로 시작하는 화면에서 바로 argument 를 전달하고 싶을수도 있다.처음 시작하는 화면에서 쓰이고 있는 hiltViewModel 에서 SavedStateHandle  에 argument 로 던진 데이터를viewModel 이 시작될때부터 가지고 있어야하는 상황이라던가 그럴때 말이다. 그런데 argument 를  startDestination 경로에 넣으면 SavedStateHandle 에서 값을 가져오질 못한다.정확하게 찾진 못했는데 startDestination 는 정적인 경로만 등록이 가능하다는거 같다. 이때 arguments 를 등록하는 곳에 defaultValue 를 전달하고자 하는 값을..

컴포즈 네비게이션 2.8 이후

안드로이드 네비게이션은 2.8 버전 이후로 Kotlin-Serializable 기반 타입 안정성 시스템이 도입됐다.이전에는 뭔가 나사 하나 빠진듯한 라이브러리였는데 이제야 좀 그럴듯해졌다.이거말고도 네비게이션은 버그가 참 많았던거 같은데 그런거도 많이 잡힌거 같다. 암튼 2.8 버전으로 달라진게 뭐냐면 아래처럼 화면을 이동할 수 있다. @Serializableobject Adata@Serializabledata class Bdata(val id: String)NavHost(navController, startDestination = Home) { composable { AScreen(onNaivateTo = { id → navController.navigate(Bdata(id)) }..

Android 2024.12.17

Compose + AGSL 셰이더를 이용해서 간지나는 카드 애니메이션 만들기

어디선가 카드를 휘리릭 돌리면 카드가 돌아가면서 번쩍거리는 멋진 인터렉션을 본 적이 있는거 같다.셰이더나 애니메이션에 관심이 많아진 요즘 뭐라도 해보고 싶어서 뚝딱 해봤다. 일단 최종결과물부터 봐보자.꽤 멋져.  자자 액티비티부터 만들어준다.class MainActivity : ComponentActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        enableEdgeToEdge()        setContent {            MetalCardFilpTheme {                Scaffold(modifier = Modifier...

안드로이드의 암호화

안드로이드 개발을 하다보면 암호화에 대한 이야기가 종종 나온다. 민감한 정보를 사용하지 않는 앱이라면 굳이 할 필요가 없을 수 있지만 개인정보나 중요한 key 를 다뤄야할 일이 생기는데이것들이 악의를 가진 사람들에 의해 외부로 노출되면 심각한 문제가 될 수 있다. 하지만 개발자들은 바보가 아니지.시도할 수 있는 방법들이 이미 여럿 만들어져 있는데 대표적인 것들을 알아보고 필요할때 적용해보도록 하자. 암호화의 기본적인 개념암호화에 대해서 설명하기전 아래 개념을 알면 좀 더 이해가 편하다. 평문(Plaintext) : 해독 가능한 형태의 메시지(암호화전 메시지)암호문(Cipertext) : 해독 불가능한 형태의 메시지(암호화된 메시지)암호화(Encryption) : 평문을 암호문으로 변환하는 과정복호화(De..

Android 2024.10.12

안드로이드 compose 비트맵으로 캡쳐하기

를 만들려고 하루종일 삽질을 했다...결국 만드는건 포기했는데관련해서 괜찮은 라이브러리를 찾아서 소개한다.https://github.com/PatilShreyas/Capturable GitHub - PatilShreyas/Capturable: 🚀Jetpack Compose utility library for capturing Composable content and transforming it into🚀Jetpack Compose utility library for capturing Composable content and transforming it into Bitmap Image🖼️ - PatilShreyas/Capturablegithub.com어떻게 만들었다 들여다봐야지 ㅠㅠ..

사실 내 로망중엔 OpenGL 도 있었어

카메라 관련 기술에 꾸준히 흥미가 있었는데필터쪽으로 찾아보게 되면 항상 나오는 단어중 openGl 이라는게 있다.openCV는 예전에 졸업 작품 만들때 써봤던 기억은 있는데 openGL 은 대충 그래픽 처리를 하는뭐시기구나 하고만 있었다. 행렬도 나오고 좌표 , 카메라 이것저것 관련 지식들이 많이 필요하다보니딥하게 알아보려고 하지 않았던거 같다. 마침 카메라 기능을 가진 클린아키텍쳐 샘플앱도 만들고 있겠다. 이번에 그냥 openGL 도여기다가 써볼까한다. 직접 만들면서 개념도 정리해보자. OpenGL의 기본 개념OpenGL은 정점(Vertex)과 프래그먼트(Fragment)라는 기본 단위로 그래픽 데이터를 처리한다.정점(Vertex): 화면에 그려질 점의 위치 데이터를 의미한다. OpenGL은 2D 또는..

Android 2024.08.31

라이브러리를 배포해보자.

스스로 만든 라이브러리를 배포해보는건 안드로이드 개발자를 시작할때부터 버킷리스트 중하나였다. 이번에 샘플프로젝트를 업데이트 하면서 이미지 crop 하는 커스텀 뷰를 개발했는데아직 완성도가 높진 않지만 라이브러리로 따로 빼서 관리해보고 싶다는 생각을 했다. 그래서 시간도 많겠다 뚝딱 해봤다. 아 참 jitPack 을 이용해서 배포한다! 1. 라이브러리를 만들기 위해 모듈을 생성해보자프로젝트를 새로판다.그럼 기본적으로 app 모듈이 있을텐데 이건 일단 냅두고모듈을 하나 새로 만들어보자. new Module 을 누르고 Android Library 로 만든다. 이렇게 해서 생긴 모듈이 실제 사용되는 라이브러리가 될 예정이다. 2. 라이브러리가 될 모듈에 라이브러리화 시키고 싶은 기능들을 넣는다.나의 경우는 샘플..

Android 2024.08.24

Android Compose 의 @Immutable 와 @Stable

Jetpack Compose에서 @Immutable와 @Stable 어노테이션은 컴포저블 함수의 리컴포지션을 최적화하는 데 중요한 역할을 합니다. 각각의 어노테이션은 특정한 상황에서 사용되며, 사용하는 것과 사용하지 않는 것에 따라 성능에 미치는 영향이 달라집니다.1. @Immutable@Immutable 어노테이션은 클래스가 불변(immutable)임을 명시합니다. 불변 객체는 상태가 변경되지 않기 때문에, Jetpack Compose는 해당 객체가 변경되지 않는다고 가정하고 리컴포지션을 피할 수 있습니다.언제 사용할까?@Immutable은 객체가 불변이며, 내부의 모든 필드도 불변 객체일 때 사용합니다. 이는 데이터 클래스와 같은 경우에 자주 사용됩니다.예시:@Immutable data class U..

코루틴의 Dispatcher 를 Hilt Singleton으로 주입해보자

구글의 Codelab의 예제나 안드로이드 공식 문서, 블로그의 코루틴 예시들을 보면 아래의 코드처럼 새로운 코루틴을 생성하거나 withContext를 호출할 때 Dispatchers를 하드코딩하는 경우를 많이 찾아볼 수 있습니다. 하지만 Android의 코루틴 권장사항 문서를 보면 Don't hardcode Dispatchers when creating new coroutines 라는 내용이 제일 먼저 등장합니다.// DO inject Dispatchersclass NewsRepository( private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default) { suspend fun loadNews() = withContext(..

Android 2024.08.17