Development/Android

안드로이드 앱은 난독화 처리를 하지 않으면 디컴파일러로 소스 코드 내용이 그대로 유출될 수 있다. 예를 들어 특정 라이브러리들의 소스 코드를 보면 난독화 처리가 적용되어 있는 것을 확인할 수 있다. 안드로이드에서는 이런 난독화 처리를 위해 Proguard라는 기능을 제공하고 있다. 운영 중인 서비스에 아직 적용이 되지 않아 뒤늦게 적용을 진행했다.. (프로가드 적용이 필요하거나 필요하지 않은 부분에 대한 조사가 시간이 걸렸다. 앱 개발 시 초기부터 신경 쓰자..) Proguard의 주요 기능은 다음과 같다. 코드 축소 (Shrinking): 사용되지 않는 코드와 리소스를 제거하여 APK 크기를 줄입니다. 이는 애플리케이션을 더 가볍게 만들고 다운로드 및 설치 시간을 단축하는 데 도움이 됩니다. 코드 최적..
구글 플레이 스토어에 앱을 업데이트하는 중 다음과 같은 경고가 표시되기 시작했다. 해당 경고가 가리키는 코드를 확인해 보니 압축 파일 처리에 대한 함수였다. fun unZip(zipFile: File, destFolder: File): List { val result = ArrayList() ZipFile(zipFile).use { zip -> zip.entries().asSequence().forEach { entry -> if (entry.isDirectory) { File(destFolder, entry.name).mkdirs() } else { zip.getInputStream(entry).use { input -> val file = File(destFolder, entry.name) file...
안드로이드에서 뒤로 가기 기능 구현 시, 사용되던 onBackPressed 메서드가 deprecated 되었다. 대신, onBackPressedCallback으로 새롭게 탄생했다. https://developer.android.com/reference/androidx/activity/OnBackPressedCallback OnBackPressedCallback | Android Developers androidx.appsearch.builtintypes.properties developer.android.com 먼저 Callback을 선언한다. private val onBackPressedCallback = object : OnBackPressedCallback(true) { override fun ha..
안드로이드에서 Deivce의 설정을 통해 실제 시간과 다른 시간이 설정되었을 경우, 네트워크 통신에 실패하거나 각종 서비스 진입을 거부당하는 경우가 발생한다. 사용자 측면과 개발자의 측면에서 모두 이런 혼란을 방지하기 위해 실제 시간과 Device 시간이 동일한지 비교할 수 있는 방법이 필요했다. 그래서 'NTP 서버'를 활용한 비교 로직을 구성해본다. NTP : Network Time Protocol의 약자로 Network 상에 연결된 장비와 장비 간에 시간 정보를 동기화하기 위한 프로토콜을 말하며 NTP 서버와 클라이언트 세팅을 통해 시간을 동기화 먼저 아래 라이브러리를 import 한다. implementation 'commons-net:commons-net:3.6' commons-net은 Apac..
Api 통신 중, Error Status로 반환되는 경우에는 Result Body를 일반적인 response body로 가져올 수 없다. resonse의 errorBody()를 활용해야 Error Result Body를 가져올 수 있다. { "code": "INVALID_AUTH_TOKEN", "message": "invalid token" } 먼저 다음과 같은 data class를 준비한다. data class NormalErrorResponse( val code: String?, val message: String? ) 제네릭을 활용하여 Error Response를 data class로 변환해 주는 함수를 구현했다. inline을 통해 해당 성능 손실을 줄이고, 를 통해 런타임 시에도 타입 정보를 유..
(왜 맨날 까먹는지..;;) Retrofit에서 통상 @DELETE 시에는 @Body는 사용하지 않아, 일반적인 @DELETE 처리가 불가능하다... interface DeleteConnectionApi { @HTTP(method = "DELETE", path = "api/mem/externalConnection", hasBody = true) fun deleteConnection( @HeaderMap headers : HashMap, @Body connectionId : DeleteConnectionId ) : Call } 위처럼 @HTTP를 활용하여 hasBody = true 처리 후, 구성해 주면 문제없이 통신이 가능하다.
안드로이드에서 발생하는 Exception들은 기본적으로 Throwable을 상속받고 있다. public open class Throwable(open val message: String?, open val cause: Throwable?) { constructor(message: String?) : this(message, null) constructor(cause: Throwable?) : this(cause?.toString(), cause) constructor() : this(null, null) } 인자로 메시지와 cause Throwable을 받는다. 이를 활용해 Custom Exception을 활용할 수 있다. 보통 Exception이 발생하는 경우, FireBase Crashlytics 등..
api 통신에 대한 에러 발생 시, 해당 통신에 대한 Reqeust Body를 추출하여 사용자가 어떠한 값을 보냈는지 파악할 필요가 있다. @Body 또는 @Field 형식으로 보내는 경우에 대해 OkHttpClient에서 값을 추출하는 로직을 구성해 봤다. private fun extractBodyStringFromRequest(request: Request): String { return if (request.body is FormBody) { //Field type val field = mutableMapOf() val formBody = request.body as FormBody for (i in 0 until formBody.size) { field[formBody.name(i)] = form..
달력형 위젯을 구현 중, Background ImageView에 디자이너분이 제작해 주신 테마 이미지를 Bitmap으로 삽입하던 중 다음과 같은 오류가 발생했다. java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage (used: 7474416, max: 6432000) 무슨 오류인가.. 확인해 보니 Bitmap 메모리 사용량이 한도를 초과한 것이다. 이미지 크기와 해상도가 상이하기 때문에 충분히 발생할 수 있다고 생각했다. 위젯에 최적화된 이미지를 다시 제작하기 전까지는 임시로 크기를 줄여서라도 사용하기로 결정했다. fun getBitmapSize(file: File): Siz..
Moshi - API 통신 시, JSON과 객체 사이의 직렬화 및 역직렬화를 간단하고 신속하게 해주는 라이브러리 - 내부 동작에서 Reflection 사용 Reflection : 자바의 기능 중 하나로, 클래스나 인터페이스의 정보에 직접 접근 가능케 하는 API을 일컫는다. 직렬화 : 특정 데이터를 다른 CPU로 보내기 전 통신이 가능하면서도 나중에 재구성이 가능한 포맷으로 환해주는 행위 역직렬화 : 직렬화된 데이터를 다시 객체 형태로 변환하는 행위 JSON 처리 @JsonClass Annotation : JSON Object에 대응되는 역할을 한다. 해당 Annotation은 JSON Object에 대응되는 클래스 생성 시 상단에 붙인다. 파라미터로 들어가는 generateAdapter를 true로 S..
SeungYong.Lee
'Development/Android' 카테고리의 글 목록 (17 Page)