전체 글(354)
-
Google, Android 오픈소스 전략 수정… 실시간 AOSP 개발 종료
2025년 3월, AndroidAuthority 보도에 따르면Google은 Android 운영체제의 오픈소스 개발 방식을 전면적으로 변경한다고 발표했다.이제 Android는 더 이상 AOSP에서 실시간 개발되지 않으며, 오로지 내부 브랜치에서만 개발된다.1. 기존 방식: Dual Track 구조Google은 그동안 Android를 다음과 같은 두 개의 트랙으로 병행 개발해왔다: 구성 설명 내부 브랜치Google 사내 비공개 브랜치. 실제 Android 개발이 이루어짐AOSP 브랜치오픈소스 레포 (android.googlesource.com). 일부 코드가 실시간으로 반영되어 커뮤니티가 추적 가능이 구조는 투명성과 오픈소스 정신을 살렸지만, 다음과 같은 단점도 있었다:내부 ↔ 외부 브랜치 병합 시 충돌 다..
2025.04.01 -
[Android] Java에서 UTC와 TimeZone 완전 정복하기
1. UTC 기준으로 저장된 문자열 → Date 객체로 파싱String utcString = "2025-03-31 01:10:30";// 1. SimpleDateFormat 설정 (UTC 기준)SimpleDateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));// 2. 문자열 → Date 객체Date parsedDate = null;try { parsedDate = utcFormat.parse(utcString);} catch (ParseException e) { e.printStackTrace();} ..
2025.03.31 -
Single Activity Architecture(SAA) 전환 시 Navigation 구조 설계 방법
안드로이드 앱을 Single Activity Architecture(SAA)로 전환할 때, 가장 많이 고민하게 되는 포인트는 바로 Navigation 구조다.기존에는 Activity 단위로 화면을 나눴다면, 이제는 하나의 Activity와 하나의 NavHost 안에서 모든 화면 전환이 이루어져야 한다.핵심 원칙NavHost는 하나만!AppNavGraph에서 전체 라우팅 담당Activity마다 NavHost를 여러 개 두는 구조는 Compose + SAA에서 지양하위 기능은 NavGraphBuilder 확장 함수로 분리ChatNavGraph, OpenChatNavGraph처럼 묶고 싶다면 NavGraphBuilder 확장 함수로 정의실제 NavHost는 AppNavGraph에만 존재해야 함실전 TIPCha..
2025.03.28 -
[Android] 특정 국가 차단하기 (SIM 정보 이용)
오늘은 Android 앱에서 특정 국가를 차단하는 기능이 필요해졌다.VPN이나 GPS보다 우회가 어렵고, 간단하게 구현할 수 있는 방법은 없을까?그 첫 번째 시도로 SIM 카드의 국가 코드를 활용해보기로 했다. 사용한 API: getSimCountryIso()안드로이드의 TelephonyManager는 SIM에 저장된 ISO 국가 코드를 반환하는 메서드를 제공한다.이 코드를 통해 사용자의 유심이 어느 국가에서 발급된 것인지 확인할 수 있다. 코드 (Kotlin)fun getSimCountryIso(context: Context): String { val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as Telephon..
2025.03.27 -
[Android] 왜 Log.d() 대신 Timber를 써야 할까?
자꾸 Android Studio에서 Log.d를 Timber로 변환하라는 메세지가 뜬다.대체 Timber가 뭐길래.1. Log.d()의 단점1️⃣ 태그를 직접 써야 함Log.d("MyActivity", "Something happened")MyActivity 와 같은 TAG를 계속 명시해줘야 한다.2️⃣ 릴리즈 빌드에서도 로그가 찍힐 수 있음디버깅용 로그가 사용자 환경에서도 노출될 위험이 있음3️⃣ 로그 필터링, 커스터마이징 어려움로그 포맷, 조건부 출력 등 확장성이 떨어짐2. Timber의 장점1️⃣ 자동 태그 처리Timber.d("Hello")로그에 자동으로 클래스 이름 + 라인 번호가 붙는다.D/MainActivity: Hello (MainActivity.kt:42)2️⃣ 릴리즈 빌드에서 로그 자동..
2025.03.26 -
[생존 매뉴얼] 작동하는 코드보다 더 무서운 건, 작동하는 줄 알고 넘어간 코드다.
오래된 앱을 유지보수 하는 입장에서는 고쳐야 할 곳이 너무 많다.그 때 그 때 고치고 덧대는 이런 느낌. 서드파티 라이브러리는 지원을 하지 않고, View는 아주 오래전에 쓰던 방식이고.그렇다고 한번에 바꾸는 건 회사에서 허락해주지 않는다. (시간적 비용 등…) 결국 조금씩 리팩토링을 해나가는 방법 뿐이지만, 그렇게 되면 사이드 이펙트를 무시할 수 없다.사소한 로직을 하나 고치고 “에이, 이건 괜찮겠지~” 넘어갔다가 앱을 배포하면다음 날 엄청난 Crash 지옥을 맛볼 수 있다. 코드는 “에러 없이 돌아간다”고 해서 끝난 게 아니다.“내가 의도한 대로, 모든 케이스에서 정확히 동작한다”는 확신 없이는결국 폭탄 돌리기일 뿐이다.오류를 줄이는 디테일한 실천 가이드 (생존 매뉴얼)(1) 작은 수정도 반드시 직접..
2025.03.25