Android는 오픈 소스(AOSP)이며 Linux 커널에서 실행되는 Google의 모바일 운영 체제입니다. Android 개발은 Kotlin을 사용하여 Android Studio 환경에서 수행됩니다. 이 기사에서는 OS 아키텍처, 애플리케이션 구성 요소, Jetpack Compose 및 Google Play 게시에 대해 설명합니다.
주요 내용
Android는 Linux 커널 기반의 모바일 운영 체제로, 2007년부터 Google에서 개발하고 있습니다. 소스 코드는 Android Open Source Project(AOSP)의 일부로 Apache 2.0 라이선스에 따라 공개되어 있습니다. 각 제조업체는 시스템을 수정하여 자사 기기에 설치할 수 있습니다.
StatCounter(2026년)에 따르면 Android는 전 세계 모바일 OS 시장의 약 72%를 점유하고 있습니다. 주요 제조업체는 Samsung, Xiaomi, Oppo, Vivo, Google Pixel입니다. 플랫폼의 주요 문제는 파편화입니다. 서로 다른 OS 버전을 가진 수천 개의 모델이 동시에 사용되고 있습니다.
Android 아키텍처는 권한(Permissions) 원칙을 기반으로 구축되었습니다. 각 애플리케이션은 별도의 Linux UID로 실행되며 자체 데이터에만 액세스할 수 있습니다. 시스템 리소스(카메라, 마이크, 연락처)에 대한 액세스는 Android 6(API 23)부터 런타임에 Android Permissions를 통해 요청됩니다.
Android 1.0은 2008년 HTC Dream에서 출시되었습니다. 주요 이정표: Android 4.0 Ice Cream Sandwich(휴대폰과 태블릿의 통합 UI), Android 5.0 Lollipop(Material Design), Android 6.0(런타임 권한), Android 10(다크 테마, 제스처), Android 12(Material You). 2023년부터 Google은 디저트 이름 없이 연간 주요 릴리스로 전환했습니다.
| Android 버전 | 연도 | 주요 혁신 |
|---|---|---|
| Android 1.0 | 2008 | HTC Dream 최초 출시 |
| Android 4.0(ICS) | 2011 | 휴대폰 및 태블릿 통합 디자인 |
| Android 5.0(L) | 2014 | Material Design, Dalvik 대신 ART |
| Android 6.0(M) | 2015 | 런타임 권한, Doze 모드 |
| Android 8.0(O) | 2017 | Kotlin 공식 언어 채택 |
| Android 10(Q) | 2019 | Scoped Storage, 다크 테마 |
| Android 12(S) | 2021 | Material You, Privacy Dashboard |
| Android 15 | 2024 | Private Space, 위성 연결 |
Android 아키텍처는 하드웨어를 사용자 애플리케이션으로부터 분리하는 4개의 주요 계층으로 구성됩니다. 각 계층은 엄격하게 정의된 인터페이스를 통해 하위 계층의 서비스를 사용합니다.
최하위 계층은 수정된 Linux 커널(LTS, Android 15에서 버전 6.x)입니다. 메모리 관리, 프로세스, 네트워크 스택 및 드라이버를 처리합니다. HAL(Hardware Abstraction Layer)은 카메라, Bluetooth, Wi-Fi, 센서 등 하드웨어와 상호 작용하기 위한 통합 API를 제공합니다. 제조업체는 상위 계층에 영향을 주지 않고 HAL 모듈을 구현합니다.
ART는 애플리케이션의 DEX 바이트코드를 실행합니다. Android 5.0부터 ART는 Dalvik을 대체하고 성능 향상을 위해 AOT(Ahead-of-Time) 컴파일을 사용합니다. 각 애플리케이션은 별도의 ART 인스턴스와 함께 자체 프로세스를 가집니다. 가비지 컬렉션(GC)은 최소한의 일시 중지로 작동하며 일반적인 GC 일시 중지는 2~4ms입니다.
Framework는 개발자가 직접 작업하는 계층입니다. Activity Manager(화면 스택), Content Providers(데이터 액세스), Resource Manager(지역화, 리소스), Notification Manager, Location Manager가 포함됩니다. 모든 시스템 서비스는 Android의 프로세스 간 통신 메커니즘인 Binder IPC를 통해 호출됩니다.
// AIDL 인터페이스를 통한 Binder 작업 예제
interface IDataService : android.os.IInterface {
fun getData(): List<DataItem>
fun saveData(item: DataItem): Boolean
}
// 서비스 구현
class DataService : Service() {
private val binder = object : IDataService.Stub() {
override fun getData(): List<DataItem> = repository.getAll()
override fun saveData(item: DataItem): Boolean = repository.save(item)
}
override fun onBind(intent: Intent?): IBinder = binder
}최상위 계층은 표준 시스템 애플리케이션으로 구성됩니다: 전화, 연락처, 카메라, 설정, 브라우저. 사용자 애플리케이션보다 높은 권한을 가지지 않지만 타사 애플리케이션으로 대체될 수 있습니다. Android 15에서는 시스템 애플리케이션이 제조업체 OTA 업데이트와 별도로 Google Play System Updates를 통해 업데이트됩니다.
Kotlin은 JetBrains에서 개발한 정적 타입 프로그래밍 언어로 JVM에서 실행됩니다. Google은 2017년 Google I/O에서 Kotlin을 공식 Android 언어로 발표했습니다. Kotlin은 Java와 완전히 호환되지만 널 안전성, 데이터 클래스, 확장 함수 및 코루틴을 통해 Java의 단점을 제거합니다.
Kotlin의 주요 기능은 NullPointerException에 대한 내장 보호 기능입니다. 타입은 nullable(String?)과 non-null(String)로 구분됩니다. 컴파일러는 빌드 시 nullable 액세스를 확인합니다. Safe call(?.) 및 Elvis 연산자(?:)는 중첩된 검사 없이 선택적 값 작업을 단순화합니다.
// 코루틴 및 Flow를 사용한 Kotlin 코드 예제
data class User(
val id: Long,
val name: String,
val email: String
)
class UserRepository(
private val api: UserApi,
private val dao: UserDao
) {
suspend fun getUser(id: Long): Result<User> {
return try {
val cached = dao.getUser(id)
if (cached != null) {
return Result.success(cached)
}
val remote = api.fetchUser(id)
dao.insertUser(remote)
Result.success(remote)
} catch (e: Exception) {
Result.failure(e)
}
}
fun observeUsers(): Flow<List<User>> {
return dao.observeAll()
.map { list -> list.sortedBy { it.name } }
.flowOn(Dispatchers.Default)
}
}예제는 비동기 네트워크 및 데이터베이스 액세스를 위한 코루틴(suspend 함수), 데이터 변경 사항의 반응형 관찰을 위한 Flow, 안전한 오류 처리를 위한 Result를 보여줍니다. 코루틴은 스레드 오버헤드 없이 콜백과 RxJava를 대체합니다.
Kotlin 코루틴은 공유 스레드 풀에서 실행되는 경량 스레드입니다. 네트워크 및 디스크에는 Dispatchers.IO, UI에는 Dispatchers.Main, CPU 집약적 작업에는 Dispatchers.Default를 사용합니다. viewModelScope와 lifecycleScope는 구성 요소가 소멸될 때 코루틴을 자동으로 취소합니다.
// 코루틴 및 StateFlow를 사용한 ViewModel
class UserViewModel(
private val repository: UserRepository
) : ViewModel() {
private val _users = MutableStateFlow<List<User>>(emptyList())
val users: StateFlow<List<User>> = _users.asStateFlow()
private val _loading = MutableStateFlow(false)
val loading: StateFlow<Boolean> = _loading.asStateFlow()
init {
viewModelScope.launch {
repository.observeUsers().collect { userList ->
_users.value = userList
}
}
}
fun refresh() {
viewModelScope.launch {
_loading.value = true
repository.getUser(42).onSuccess { user ->
_users.value = listOf(user)
}
_loading.value = false
}
}
}Android Studio는 IntelliJ IDEA 기반의 공식 IDE로 Google에서 개발했습니다. 코드 편집기, Layout Inspector, 기기 에뮬레이터, APK Analyzer, Profiler(CPU, 메모리, 네트워크, 에너지) 및 Firebase 통합이 포함됩니다. Android Studio 2024(Ladybug)는 멀티플랫폼 KMP 모드로 Kotlin 2.0을 지원합니다.
Android 에뮬레이터는 하드웨어 가속을 위해 KVM(Linux) 또는 Hyper-V(Windows)를 사용합니다. GPS, 센서, 카메라, 통화 및 SMS 시뮬레이션을 지원합니다. Google Pixel 9 Pro는 API 35 및 8GB 에뮬레이터 RAM을 사용한 테스트에 권장되는 구성입니다.
Profiler는 CPU 로드, 메모리 할당, 네트워크 요청 및 에너지 소비를 실시간으로 표시합니다. Memory Profiler는 힙 덤프 및 참조 트리를 통한 누수 분석을 가능하게 합니다. Network Inspector는 본문과 헤더를 포함한 모든 HTTP/HTTPS 요청을 기록합니다. 심층 분석에는 Android Studio Canary가 사용됩니다.
Android 애플리케이션은 4가지 유형의 구성 요소로 구성되며, 각 구성 요소는 자체 진입점과 생명 주기를 가집니다. 구성 요소는 AndroidManifest.xml 파일에 등록됩니다.
| 구성 요소 | 목적 | 진입점 |
|---|---|---|
| Activity | 사용자와 상호 작용하기 위한 UI 화면 | Action.MAIN 및 LAUNCHER 범주의 Intent |
| Service | UI 없는 백그라운드 작업 실행 | startService() 또는 bindService() |
| BroadcastReceiver | 시스템 또는 사용자 정의 이벤트 수신 | 매니페스트 또는 코드에서 등록 |
| ContentProvider | 구조화된 데이터에 대한 액세스 관리 | ContentResolver를 통한 URI |
Activity는 사용자 인터페이스의 기본 구성 요소입니다. 각 화면은 별도의 Activity 또는 Activity 내의 Fragment입니다. 화면 간 탐색은 Intent(액션(ACTION_VIEW, ACTION_SEND)과 데이터(URI)를 포함하는 객체)를 통해 수행됩니다. Jetpack Navigation Graph에서는 탐색이 XML로 설명됩니다.
Service는 백그라운드 작업을 수행하지만 Android 8부터 백그라운드 서비스가 제한되었습니다. WorkManager는 체인, 제약 조건(예: 충전 중에만) 및 충돌 후 재시작을 지원하는 지연 및 보장된 백그라운드 작업을 위한 권장 라이브러리입니다.
Jetpack Compose와 전통적인 XML 레이아웃 중 선택은 Android 프로젝트를 시작할 때 주요 아키텍처 결정입니다. XML Layouts(RecyclerView, ConstraintLayout, FrameLayout)은 2008년부터 표준이었습니다. Jetpack Compose는 2021년에 선언형 대안으로 도입되었습니다.
| 기준 | XML Layouts | Jetpack Compose |
|---|---|---|
| 패러다임 | 명령형(View 트리) | 선언형(@Composable 함수) |
| 최소 버전 | 모든 버전(API 1+) | API 21+(Android 5.0) |
| 레이아웃 | XML + data binding / ViewBinding | Modifier를 사용한 Kotlin 코드 |
| RecyclerView 유사 | RecyclerView + Adapter + ViewHolder | LazyColumn / LazyGrid |
| 미리보기 | Android Studio의 XML 미리보기 | 대화형 @Preview 어노테이션 |
| 재구성 | notifyDataSetChanged(전체) | 자동, 세분화(DiffUtil) |
| 상호 운용성 | 완전함(모든 라이브러리) | XML의 ComposeView / Compose의 AndroidView |
Google은 모든 새 프로젝트에 Jetpack Compose를 권장합니다. XML Layouts는 레거시 프로젝트 지원과 최대한의 View 사용자 지정(Canvas, SurfaceView)이 필요한 경우에 계속 사용됩니다. Compose 코드는 동등한 XML + ViewBinding보다 평균 40% 짧습니다.
// Jetpack Compose — 사용자 프로필 화면
@Composable
fun ProfileScreen(
user: User,
onEditClick: () -> Unit,
modifier: Modifier = Modifier
) {
Column(
modifier = modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
AsyncImage(
model = user.avatarUrl,
contentDescription = "사용자 아바타",
modifier = Modifier
.size(120.dp)
.clip(CircleShape)
)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = user.name,
style = MaterialTheme.typography.headlineMedium
)
Text(
text = user.email,
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(modifier = Modifier.height(24.dp))
Button(onClick = onEditClick) {
Icon(Icons.Default.Edit, contentDescription = null)
Spacer(modifier = Modifier.width(8.dp))
Text("프로필 편집")
}
}
}
@Preview(showBackground = true, showSystemUi = true)
@Composable
fun ProfileScreenPreview() {
MaterialTheme {
ProfileScreen(
user = User(1, "안나 페트로바", "anna@example.com"),
onEditClick = {}
)
}
}ProfileScreen 함수는 @Composable로 선언됩니다. View 인스턴스를 생성하지 않고 선언적으로 UI를 설명합니다. Compose는 user가 변경되면 자동으로 화면을 업데이트합니다. @Preview는 빌드 및 에뮬레이터 실행 없이 IDE에 직접 결과를 표시합니다.
Android의 각 Activity는 onCreate, onStart, onResume, onPause, onStop, onDestroy의 6가지 생명 주기 상태를 거칩니다. Fragment는 onAttach, onCreateView, onViewCreated를 추가합니다. 생명 주기를 이해하는 것은 메모리 관리와 누수 방지에 중요합니다.
onCreate — Activity가 생성될 때 한 번 호출됩니다. 여기서 초기화(setContentView, 어댑터 설정, LiveData 구독)가 수행됩니다. onResume — Activity가 포그라운드에 있으며 사용자와 상호 작용합니다. onPause — Activity가 포커스를 잃습니다(대화 상자, 다른 Activity). onStop — Activity가 표시되지 않습니다. onDestroy — Activity가 소멸됩니다.
// LifecycleScope를 통한 생명 주기 관리가 포함된 Activity
class MainActivity : ComponentActivity() {
private val viewModel: UserViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.users.collect { users ->
updateUi(users)
}
}
}
}
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("last_search", searchQuery)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
searchQuery = savedInstanceState.getString("last_search", "")
}
}repeatOnLifecycle을 사용하면 Activity가 백그라운드로 전환될 때 데이터 수집이 일시 중지되고 포그라운드로 돌아올 때 재개됩니다. 이는 누수와 불필요한 네트워크 요청을 방지합니다. onSaveInstanceState는 화면 회전 시 임시 상태를 저장합니다.
Google Play는 공식 Android 앱 스토어입니다. 개발자 계정 등록 비용은 $25(일회성)입니다. 각 애플리케이션은 악성 코드, 정책 위반 및 잘못된 권한 사용에 대한 자동 Google Play Integrity 검사를 거칩니다.
Google은 Android App Bundle(AAB) 또는 APK를 통한 앱 서명을 요구합니다. AAB는 각 기기 구성에 최적화된 APK 생성을 가능하게 하는 권장 형식입니다. 애플리케이션은 유효한 인증서가 있는 키(keystore)로 서명해야 합니다. Google Play App Signing은 Google 측의 선택적 키 암호화입니다.
개인 데이터에 대한 액세스를 요청하는 모든 애플리케이션은 개인정보처리방침을 제공해야 합니다. 2024년부터 Google은 수집되는 데이터 유형과 처리 목적을 명시하는 Data Safety 선언을 요구합니다. Android 14+를 대상으로 하는 애플리케이션은 권한을 선언하기 위해 Declarations API를 사용해야 합니다.
| 요구 사항 | 설명 |
|---|---|
| Android App Bundle | 최적화된 전송을 위한 AAB 형식 |
| Data Safety | 개인 데이터 수집 및 처리에 관한 양식 |
| Target SDK | 앱은 최신 Android API 수준을 대상으로 해야 함 |
| 콘텐츠 등급 | 연령 등급 설문지 |
| 스토어 등록 정보 | 이름, 아이콘, 스크린샷, 설명 |
자주 묻는 질문
Kotlin — Google이 공식적으로 권장하는 Android 언어입니다. Java도 레거시 프로젝트에서 지원됩니다. Kotlin은 널 안전성, 코루틴 및 확장 함수를 제공하여 Java 대비 코드 양을 30~40% 줄입니다.
Jetpack Compose는 선언형 구문과 자동 재구성 최적화 덕분에 모든 새 프로젝트에 권장됩니다. XML Layouts는 레거시 프로젝트와 Canvas 또는 SurfaceView의 세부 사용자 지정이 필요한 경우에 사용됩니다.
Google Play 개발자 등록 비용은 $25(일회성)입니다. 스토어 수수료는 처음 100만 달러 수익까지 15%, 이후 30%입니다. 구독의 경우 첫날부터 수수료가 15%입니다. Apple Developer Program과 달리 연회비는 없습니다.
Android Jetpack은 공식 SDK에 포함된 Google 라이브러리 모음입니다: Navigation, Room(컴파일 타임 쿼리 검사를 지원하는 SQLite ORM), WorkManager(보장된 백그라운드 작업), ViewModel(상태 관리), LiveData 및 StateFlow(반응형).
새 프로젝트의 최소 지원 버전은 API 24(Android 7.0)입니다. AndroidManifest.xml은 앱 구성 요소와 권한을 설명합니다. APK/AAB는 keystore로 서명됩니다. Target SDK는 게시 시점의 최신 API 수준과 일치해야 합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.