모바일18 안드로이드 스튜디오 프로젝트 복구하는 법 (프로젝트 영구 삭제) 깃 커밋을 하기 전에 실수로 프로젝트를 삭제하는 일이 발생했다. (진심으로 틈틈히 커밋을 했어햐 했는데 당시에 내가 미쳤는지 커밋을 안 했다) 이럴 경우 안드로이드 스튜디오에서는 비록 파일이 삭제됐을지라도 같은 이름의 프로젝트를 만들면 같은 프로젝트라고 인식하여 Local History를 보여준다!!!(이때 명령창을 통해 폴더를 생성해야 함)선택한 뒤 revert를 하면 파일이 다시 돌아온다....!!! 모바일/Android 2024. 11. 10. [kotlin] 함수 참조 :: 더블 콜론 reflection은 실행 중(런타임)인 프로그램이 자신의 클래스를, 구조를 분석하고 수정하기 위해서 사용되는 기술이다. 다시 말해 컴파일 이후 알 수 없는 동작들(e.g. 프레임 워크 개발, 테스트 프레임 워크, 설정 등등)은 컴파일 후 바이트 코드로 변환되기에 Reflection을 사용해 바이트 코드를 분석해 다시 클래스 정보를 얻어야 한다. [코틀린/자바 소스코드] → [컴파일러] → [바이트코드] → [JVM이 실행] 여기서 더블콜론 연산자는 리플랙션을 위해 사용한다. 하지만 코틀린에서 더블 콜론으로 클래스를 가져오면 자바 클래스가 아닌 코틀린 특화 클래스인 KClass가 반환 되기에, Java 라이브러리의 호환성을 위해 .java를 자주 사용한다.User::class // KClassUser::.. 모바일 2024. 10. 22. [kotlin] 공변성과 반공변성 공변성(Covariance)?타입 A`가 타입 A의 하위 타입이라면, 제네릭 타입 T가 T의 하위 타입이 되는 것을 발한다. out keyword를 사용하여 공변성을 표현한다.class Box(val value: T) { // code}val dogBox: Box = Box(Dog())val animal: Box = dogBox dog는 Animal의 하위 타입이다. 공변성을 나타내는 out키워드를 통해 Box 역시 Box에 타입캐스팅할 수 있다. 반공변성(Contravariance)타입 A`가 타입 A의 하위 타입이라면 제네릭 타입 T이 T의 하위 타입이 되는 관계를 의미한다. 그리고 이 규칙이 매개변수로 전달된다면 이 동작이 반대로 작용한다.interface Comparable { fun compar.. 모바일 2024. 8. 29. [오류 해결] Topic sync or token retrieval failed on hard failure exceptions fcm 서비스와 연결이 되지 않아 생기는 에러 메시지다. 검색해봐도 네트워크를 확인해보라거나 google-service.json을 살펴봐야며 이 오류를 비롯해 나는 Phenotype API error 까지 발생했다. 이 오류가 발생해 firebase 토큰을 가져오지 못 했는데, 여러가지로 설정에 문제가 많았어서 간단한 오류임에도 시간이 오래 걸렸다. (1) build.gradle.kts (project) 설정 오류의존성과 플로그인에 적어놓은 google-services 버전이 달랐다. (2) build.gradle.kts (modules)플로그인에 google-services를 우선 적지 않았다. 해당 플러그인은 Firebase와 Google 서비스 설정을 설정하며 우선 적어야 올바르게 작동된다. 이전.. 모바일/Android 2024. 8. 19. Android에서의 의존성 주입(DI)이란? Overview객체지향 프로그래밍의 설계 패턴 중 하나로 한 클래스가 다른 클래스를 참조할 때 참조된(필요한) 클래스를 종속 항목이라고 하며, 이때 내부에서 직접 생성하는 것이 아니라 외부에서 주입을 함으로써 의존성을 제공하는 기술이다. 여기서 필요한 클래스를 매개변수로 제공받으며 클래스 인스턴스가 자체적으로 종속 항목을 얻는 대신 매개변수로 종속 항목을 받는다. 다음은 클래스 내부에서 자체적으로 종속 항목을 받는 코드 예시다.class Car { private val engine = Engine() fun start() { engine.start() }}fun main(args: Array 이 코드는 두 가지 문제가 있을 수 있다. Car와 Engine은 밀접하게 연결이 .. 모바일/Android 2024. 8. 6. [공식 문서] compose 단계 frame의 세 단계compose에는 세 단계를 가지고 있다.1) CompositionUI를 보여준다. compose가 composable 함수를 실행하고 UI를 생성한다. 2) LayoutUI가 위치한 곳이다. 레이아웃 요소가 확인되면 요소와 자식 요소를 각 레이아웃 트리의 노드의 2D 좌표에 배치한다. 3) Drawing 어떻게 렌더링되는지를 보여준다. UI 요소는 캔버스에 그려진다. 일반적으로 디바이스 화면에 그려진다. 이 단계의 순서는 일반적으로 동일하지만 composition에서 layout, drawing으로 데이터가 한 방향으로 흘러갈 수 있게 하여 frame을 생성한다. BoxWithConstraints와 LazyColumn, LazyRow는 부모 레이아웃 단계에 종속되기에 예외.물론 co.. 모바일/Android 2024. 8. 6. [공식문서] Side-effects in Compose Previewside-effect는 composable 함수의 범위 밖에서 일어나는 앱의 상태변화를 일컫는다. composable의 lifecycle과 속성은 예측불가능한 recomposition이 일어나기 때문에 다양한 순서로, recomposition가 실행되거나 폐기될 수 있기 때문에 composable은 side-effect와 독립적이어야 한다. 그러나 side-effect는 스낵바를 보여주거나 특정한 조건이 만족됐을 경우 다른 화면으로 navigate되는 둥 트리거가 발생했을 시 필요하다. 이런 액션은 composable의 lifecycle 같은 통제된 환경에서 호출되어야 한다. 상태와 효과 사용 사례composable은 side-effect에게 자유롭다. 어플의 상태변화를 만들 때 반드시 E.. 모바일/Android 2024. 8. 4. [공식 문서] Lifecycle of composables OverviewComposition은 내 앱의 UI를 보여주며, composables의 실행에 의해 생성된다. 다시 말해 Composition은 UI를 그리는 composables의 트리 구조다. 제트팩 compose는 composition이 1) 처음 실행될 때, composables 함수를 실행시키는데 이후 Composition에 있는 UI를 그리기 위해 composables를 계속 감시한다. 2) 변화를 감지하면 제트팩 compose는 recompostion를 스케줄링한다. recomposition은 상태 변화에 대한 반응으로 composables을 바꿀 때 일어난다. 다시 말해 내 composable를 수정할 수 있는 경우는 recomposition이 일어날 때뿐이다. 그림은 Composable.. 모바일/Android 2024. 8. 4. 테일러 스위프트 상점 페이지 크롤링하는 어플리케이션 만들기 - (1) Sad Story한국인 스위프티로 사는 건 고난하다... 가사 해석도 해야 하고, 떡밥도 주워먹어야 하고, 인터뷰도 해석해야 하고, 바이럴 탄 게시물을 해석하려면 미국 밈도 알아야 함.. 하지만 뭣보다 힘든 건.....사인 씨디를 놓치는 것이다..사인 시디는 당연한 소리지만 진짜 순식간에 품절된다. 이번엔 뜨는 경우도 많았지만 너무 불시에 반짝 떴다 사라진다....그때 난 잔다고....물론 시디 앨범에 대한 재고 알림을 주는 봇이 있다. 하지만 말그대로 봇이다.. 디스코드나 트위터로 알려주긴하지만 다른 알림에 묻히거나 알람처럼 요란스럽게 짖어대지도 않는다 잠든 나를 깨울 만큼 강력한 알람이 필요햇다.... 사인 시디를 향하여!!!특정 사이트의 정보를 뽑아내고 싶으면 우선 그 웹이 open api를 제공.. 모바일 2024. 7. 25. 깃헙 액션으로 디스코드에 apk파일 보내기(feat. git tag) preview외주를 하면서 느낀 건 링크보다 apk로 주고 받는 게 더 편하신 분들이 있다는 것이다.... 매번 빌드하고 apk를 넘겨주기 번거로워서 디스코드 직통으로 명령어 한 줄로 apk를 보내드리려고 한다. 해당 코드는 김태성 님의 DroidKnight의 강연을 많이 많이 참고했다. 정말 감사합니다.. 강연에서는 debug.apk, release.apk 둘 다 보냈는데 나는 둘 다 보낼 필요가 없어서 release 버전만 사용한 점. 파일이 작아서 zip으로 압축하진 않았다. yaml 코드 name: "Build and Deploy APKs"on: push: tags: - preview/* workflow_dispatch:jobs: build: runs-on: ubuntu-.. 모바일 2024. 7. 21. 깃헙액션으로 플레이 스토어에 어플 자동 빌드 및 배포하는 법 preview현재 어플 출시를 위한 비공개 테스트인데 어플이 업데이트될 때마다 매번 aab 파일을 올리기 번거로워 자동 배포가 필요했다. 젠킨슨 같은 CICD 툴은 출시 예정인 어플에 비해 너무 무겁고 러닝커브가 높을 것 같아 일단 깃헙 액션으로 진행해 보려고 한다. 일단 현재 내 상황은이미 내부 테스트 및 비공개 테스트 진행 중파이어 베이스와 연결된 데이터베이스를 사용 중(사실 이건 중요하지 않음)가벼운 어플, 소규모 제작yaml파일은 다른 분들의 코드를 많이 참고 했다. action secrets에 서명키 등록하기우선 빌드를 위해 로컬에서 빌드할 때 사용했던 서명 키가 필요하다(참고로 나는 디버그 키와 릴리즈 키가 동일하다..). 이때 keystore가 사용되며 이 키는 내 레포지토리의 secret.. 모바일 2024. 7. 21. Kotlin Coroutine preview코루틴은 스탠다드 라이브러리 버전 1.3에 추가된 코틀린의 새로운 기능이다. 코루틴은 중단될 수도 있고 실행될 수도 있어, 코루틴을 추후 이어가기 위해 함수의 내부 상태를 보호하는 데이터 구조다. 코루틴을 순차적 혹은 동시성으로 실행하기 위해 스레드와 코루틴의 관계를 이해하며, 스레드 실행의 제어와 코루틴 디버깅을 어떻게하는지 알아보자. 코루틴 동시 실행병렬 실행과 동시 실행의 차이점을 알고 멀티 코어 프로세서의 멀티 스레드와 코루틴을 비교해서 생각하는 것이 중요하다. 멀티 코어 프로세서의 멀티 스레드는 일반적으로 병렬적으로, 코루틴은 병렬보다는 동시 실행에 더 많이 사용하기 때문이다. 둘의 차이는 간단하다. 피자를 먹으면서 대화하는 A의 경우 세 가지 행동으로 나눌 수 있겠는데 듣는 행위,.. 모바일/Android 2024. 7. 2. 이전 1 2 다음