본문 바로가기

반응형

분류 전체보기

(53)
[안드로이드] Proguard / R8 완전 정리(안드로이드 코드 최적화와 난독화) 1. 난독화가 필요한 이유앱을 개발하다 보면, 코드 보호가 중요한 이슈로 떠오릅니다. 특히, 오픈소스나 보안이 중요한 앱에서 코드 분석을 방지하기 위해서 **난독화(obfuscation)**는 필수적이다. 그 이유를 몇 가지가 있다.디컴파일 방지APK 파일은 .dex 파일로 변환되어 기기에 설치됩니다. 이 파일을 역으로 디컴파일하면 원본 소스를 복원할 수 있다. 코드 난독화는 이를 어렵게 만들어 소스 코드의 유출을 방지한다.저작권 보호애플리케이션이 다른 앱의 코드를 그대로 가져와서 사용하는 것을 방지하는 데 유효하다. 난독화된 코드는 타인이 쉽게 이해하거나 재사용하기 어렵다.보안 강화민감한 알고리즘이나 사용자 인증 방식 등을 난독화하여 해커들이 해당 로직을 분석하고 악용하는 것을 방지할 수 있다. 예를 ..
[안드로이드] Play Store 심사 탈락 사례 모음 & 대응 방법 Play Store에 앱을 올릴 때 가장 긴장되는 순간은 바로 심사 대기 시간이다.안드로이드의 초기 시절에는 심사 없이 바로 배포가 가능했지만, 이제는 심사 과정이 필수적입니다. 그만큼 잘 만든 앱이라 생각했는데도 예상치 못한 이유로 심사에서 탈락하는 경우가 많다.이번 글에서는 실제 사례를 바탕으로 자주 발생하는 심사 탈락 사유와 그 해결 방법을 정리해보겠다. 주요 심사 탈락 사례 TOP 51. 접근 권한 오용 (Sensitive Permissions)설명: 백그라운드에서 위치, 카메라, 전화 기록 등을 수집해결:foregroundServiceType 선언 필요사용자에게 명확한 권한 요청 UI 제공Play Console에 "이 권한을 왜 쓰는지 설명하는 문서" 첨부2. 광고 정책 위반설명: 광고를 클릭 ..
[안드로이드] NetworkOnMainThreadException 발생 원인과 해결 방법 android.os.NetworkOnMainThreadException안드로이드 개발 중 아래와 같은 익숙한 에러 메시지를 종종 본적이 있을 것이다.안드로이드에 익숙한 개발자이더라도 볼수 있는 에러고, 이 예외가 왜 발생하는지, 그리고 어떻게 해결하는지를 구체적으로 정리하도록 하겠다.1. NetworkOnMainThreadException은 언제 발생할까?NetworkOnMainThreadException은 네트워크 작업을 메인(UI) 스레드에서 실행할 때 발생한다.예를 들어 아래와 같이 HttpURLConnection을 onCreate() 안에서 직접 호출하면 바로 이 예외발생한다.URL url = new URL("https://example.com");HttpURLConnection conn = (H..
[Jetpack Compose] State와 State Hoisting 이해하기 Jetpack Compose를 사용하면서 가장 기본적이면서도 중요한 개념 중 하나가 State이다. 또한 이를 컴포저블 간에 깔끔하게 관리하기 위한 패턴으로 State Hoisting이 널리 사용되고 있다. 이 글에서는 Compose의 State가 무엇이고, 왜 State Hoisting이 필요한지, 그리고 실제로 어떻게 사용하는지 정리해보려고 한다.1. Compose에서 State란?Compose는 선언형 UI 프레임워크이다. "상태(State)가 바뀌면 UI를 다시 그린다"는 철학에 따라 작동한다.State는 UI를 그리는 데 필요한 데이터를 의미한다. 즉, 화면에 표시되는 값이나, 사용자의 입력, 버튼 클릭 여부 등이 모두 상태로 표현될 수 있다.Compose에서는 @Composable 함수 안에서..
[안드로이드] 앱 성능 최적화 : 렌더링 성능 렌더링 성능에 대해 글을 쓰기 전에 간단히 렌더링이 무엇인지 정리해본다. 렌더링(Rendering)은 간단히 말하면, 데이터를 화면에 보이는 형태로 그려주는 과정을 말한다.조금 풀어서 설명하면:안드로이드 앱에서는 코드나 데이터(예: 텍스트, 이미지, 버튼 등)가 실제로 눈에 보이는 화면(UI)으로 변환되는 과정을 "렌더링"이라고 부른다.예를 들면, 버튼을 만들었다면 → 이걸 "그리는 작업" → 유저가 터치할 수 있게 화면에 보여주기까지 이 전체 과정이 렌더링이다.예를 들면:개발자가: TextView에 "Hello World"를 설정함 → (데이터)앱이: 이 텍스트를 화면에 맞는 글꼴, 색상, 위치로 "그려서" 보여줌 → (렌더링)렌더링 왜 중요할까?렌더링이 느리면 화면이 버벅이거나, 스크롤할 때 끊김이 ..
[안드로이드] 앱 성능 최적화 : 네트워크 최적화 네트워크는 사용자 경험에 직접적으로 영향을 주는 중요한 요소이다. 서버로부터의 느린 응답, 잦은 타임아웃, 불필요한 데이터 낭비는 결국 앱 이탈률 증가로 이어질 수밖에 없다. 나 또한 다른 안드로이드 앱을 사용할 때 이런 부분들을 체감하면서, 네트워크 통신 최적화의 중요성을 더욱 느끼게 되었다. 그래서 이번 글에서는 네트워크 최적화에 대해 정리해보려 한다. 1. 불필요한 API 호출 줄이기사용자가 보지 않는 화면에서 지속적으로 데이터를 요청하지 않도록 주의!ViewModel에서 UI 상태 변화에 따라 필요한 데이터만 요청하도록 설계2. 응답 캐싱 활용Retrofit + OkHttp 조합에서는 캐시 설정을 통해 동일한 요청을 반복하지 않도록 할 수 있다.val cacheSize = 10 * 1024 * 1..
[안드로이드] 앱 성능 최적화 : 메모리 최적화 요즘은 안드로이드 폰의 하드웨어 성능이 많이 좋아져서 예전처럼 OOM(Out Of Memory) 오류를 자주 보긴 어렵지만,초창기 안드로이드 시절에는 메모리 부족으로 인한 앱 종료가 흔한 문제였다. 지금도 앱을 개발하다 보면 "앱이 느려요", "종료돼요", "메모리 부족 경고가 떠요" 같은 피드백을 종종 받게 되는데, 이럴 땐 가장 먼저 앱의 메모리 사용량을 점검해보는 것이 좋다. 이 글에서는 메모리 누수를 방지하고, 효율적인 메모리 사용을 통해 성능을 개선하는 방법을 정리해보려고한다. 1. 불필요한 Context 참조 피하기Context는 앱의 거의 모든 리소스에 접근 가능한 강력한 객체지만, 잘못 사용하면 메모리 누수의 주범이 된다. ❌ 잘못된 예:class MyUtil(context: Context..
[Jetpack Compose] Activity Lifecycle에 맞게 기능 구현 Jetpack Compose를 스터디하면서 state에 따라 화면이 자동으로 갱신된다는 점을 정리했다. 이제는 기존 Activity의 생명주기에 따라 동작하는 기능을 Jetpack Compose에서 어떻게 구현할 수 있는지에 대해 정리해보려 한다. 기존의 onCreate, onStart, onResume 등의 메서드를 직접 override 하는 방식과는 조금 다른 Compose만의 접근 방식이 있어서 익혀두면 유용하다.1. Lifecycle의 중요성.앱을 만들다 보면 화면에 진입할 때 데이터를 로딩하거나, 백그라운드로 나가면 특정 리소스 해제가 필요하다. 이런 동작은 Activity의 생명주기에 맞춰 처리해야 앱이 안정적이고 성능도 좋아지기 때문에 Activity Lifecycle을 중요하다.2. Jet..

반응형