Development/Android

- 리드미에 프로젝트 구조를 정리해서 보여줄 때 용이하게 사용되는 트리 구조 - 프로젝트 수준의 build.gradle에 아래 함수를 구성함으로써 안드로이드 스튜디오 터미널에서 간편하게 생성할 수 있다.import java.nio.file.Filesimport java.nio.file.Pathimport java.io.Fileimport java.util.stream.Collectors//import 영역은 반드시 다른 어떤 코드들보다 최상단에 위치할 것tasks.register("printPackageTree") { group = "report" description = "Prints tree under app/src/main/java/com/windrr/jibrro" val ignor..
- 이번에 마켓에 또 앱을 하나 제출하면서, Location 권한에 대한 요청 사유를 제출하라는 경고를 받았다. - 여태 Location 권한을 사용하는 앱을 혼자 제출해 본 적은 없었는데, 경험 삼아 짧게 내용을 정리해 본다.- 앱에서 위치 접근 권한이 사용되는 중요한 기능 몇 가지를 상세하게 설명했다. 영어로 쓰는 게 심사에 좀 더 유연할 것 같아서 영어로 표기했다. - 그리고 유튜브 동영상을 넣으라는데, 내가 기존에 가끔씩 운영하던 유튜브에 '일부 공개'로 업로드하여 직접 기능을 사용하는 영상을 녹화해둔 링크를 제공했다. - 유튜브에서 일부 공개로 지정 시에는 링크를 직접 공유받은 사용자만 영상을 확인 가능한 것으로 알고 있다.
- 갑자기 아래와 같은 경고 안내를 플레이 콘솔로 전달받았다.- 어떤 디바이스나 OS(특히 Android, iOS, 임베디드 환경)에서는 기본 페이지 크기가 16KB일 수 있다. 그래서 범용성을 위해 해당 앱이 여러 환경에서도 문제없이 동작할 수 있도록 접근 방식을 조정해야 한다는 것이다. - 첫 번째로 확인해 볼 만한 요소는 AGP 업그레이드다. 8.5.2 버전 이상으로 업데이트해 주어야 대응이 된다고 한다. - Tools의 AGP Upgrade Assistant를 사용하면 최신화 가능하다. - 두 번째로는 사용되는 라이브러리 조사다. 보통 Room, Coroutine, Compose 같은 자체 라이브러리에는 네이티브(. so) 코드가 포함되지 않아서 괜찮은데, 써드파티 라이브러리들은 사용하고 있을 가..
- 한동안 OOM 방지를 위한 작업들을 진행했는데, 여전히 OOM Crashlytics 보고가 끊이지 않았다. - 사용자 로그 및 계정 접속 테스트를 통해 알아낸 결과, 서버로부터 대량의 데이터를 수신받고 로컬 DB에 업데이트하는 시점에 OOM이 가장 빈번하게 발생하는 것으로 파악되었다. - 현재 서버와 클라이언트는 페이징 방식으로 List 구조의 데이터를 수신받고 로컬 DB에 저장하는데, 최근에 내가 동기화 로직을 리팩터링 하면서 Retrofit Call Response Type을 페이징과 관련된 데이터들 및 중간 매핑 리스트 타입을 포함한 data class로 등록한 시점부터가 문제였다.): Calldata class GetDataWithPageResult( val datas: List, ..
- Compose에서는 이미 렌더링 된 UI를 갱신하기 위해 상태 변경이 일어날 때마다 필요한 부분들을 다시 그리는 Recomposition이라는 메커니즘을 사용한다. - 리컴포지션은 상세하게 Composition -> Layout -> Drawing 세 가지 단계를 거친다. - 리컴포지션이 발생하면 Compose는 Composition 단계부터 새롭게 시작하며, 여기서 컴포저블 노드는 UI 변경 사항을 Compose Runtime에 알리고, 업데이트된 UI가 최신 상태를 반영하도록 보장한다. - 리컴포지션이 발생하는 조건은 다음과 같다.1. 매개변수에 변경이 발생했을 때2. 상태 변경이 관찰되었을 때 - Composition의 주요 작업• @Composable 함수 실행• UI 트리 생성 및 업데이트..
- Jetpack Compose는 개발자가 상태 변경 시 UI를 어떻게 업데이트할지를 나타내는 것이 아닌, 특정 상태에서 UI가 어떻게 보여야 하는지를 설명하는 선언적 UI 프레임워크의 특성을 가지고 있다. - 이는 개발자가 뷰를 데이터의 변화에 따라 수동으로 업데이트해야 하는 명령형 접근 방식과는 차이가 있는 것이다. - 예를 들어 서버로부터 어떤 데이터가 내려왔고, 그 데이터를 UI에 반영해 주려면 UI 레벨에서는 API 호출이 완료된 시점을 체크하여 refresh() 함수를 구현해서 재호출 해야 할 수 있다. - 하지만 Compose의 경우에는 데이터 자체를 State로 관찰하여 즉시 시스템이 UI에 반영할 수 있도록 한다. 선언형 UI 특징- 상태 주도 UI : 시스템은 각 컴포넌트의 상태를 추적..
- SQLite는 SQLiteOpenHelper라는 DB 초기화 및 생성 담당자를 갖고 있다. - onCreate(), onOpen(), onUpgrade() 등의 메서드가 있는데, 여기서 onUpgrade()를 통해 마이그레이션 작업 수행이 가능하다. - 마이그레이션 단계 구분을 위해서 DB 버전을 생성해주어야 한다. 마이그레이션 시, 해당 버전 값을 +1 하는 것을 잊지 말자private static final int DATABASE_VERSION = 11;public static synchronized DBHelper getHelper(Context context) { if (instance == null) instance = new DBHelper(context); return inst..
- 자사 앱 플레이스토어 이동 링크를 웹뷰에서 클릭했는데 다음과 같은 화면이 나왔다.- 웹뷰가 intent:// 스킴을 이해하지 못해서 발생하는 문제다.- 안드로이드 WebView는 http://, https://는 기본 지원하지만, intent:// 같은 커스텀 스킴은 직접 처리해줘야 한다. - 웹뷰 클라이언트를 다음과 같이 수정해 주면 된다. URI_INTENT_SCHEME를 사용해서 대응해 주던지 아니면 외부로 플레이스토어를 열어주던지의 결정이 필요하다.webView.webViewClient = object : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Bo..
- 앱 링크로 인증이 완료된 후, 다시 크롬 커스텀 탭을 실행한 화면으로부터 웹 서버에서 반환한 데이터를 가져오고 싶다면 - 먼저 Manifest에서 해당 activity 태그에 아래 코드를 추가해 준다.android:launchMode="singleTop"- Activity launch mode가 기본값(standard)이거나, 이미 앱이 백그라운드에 있어서 새로운 인텐트가 기존 액티비티로 전달되기 때문에 이전 화면이 보이는 문제가 있었다. - 그리고 크롬 커스텀 탭을 열어줬던 Activity에서는 onNewIntent()로 필요한 처리를 진행한다.override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleRedire..
- 앱 링크는 Android에서 특정 URL을 클릭했을 때 웹 브라우저가 아니라 앱으로 바로 연결되도록 하는 기술이다. - 앱에서 Manifest에 Intent Filter 설정뿐만 아니라 웹 서버에서도 인증을 위해 앱의 패키지명과 서명을 포함한 json 파일 등록이 요구된다. - 먼저 앱에서는 아래와 같이 구성해볼 수 있다. - autoVerify=ture 속성을 Intent filter에 넣어주게 되면 생성된 App Link URL 도메인으로 이동하여 데이터 에셋 파일을 검색한다. - 카테고리 태그 및 스키마와 host, path를 지정하는 것에 주의하자. path는 포함 개념으로 pathPrefix를 사용했다. - 웹 서버에서 파..
SeungYong.Lee
'Development/Android' 카테고리의 글 목록