1장. 시스템 앱 개발 개요
이 장에서는 Android 시스템 앱 개발의 개요에 대해 맛보기로 설명하겠습니다. 시스템 앱은 일반 앱과는 약간 차이가 있는데, 그 차이점들을 살펴보고 왜 시스템 앱을 개발할 필요가 있는지 알아보겠습니다.
1.1. 시스템 앱이란?
시스템 앱은 안드로이드 기기 내에서 실행되는 애플리케이션 중, 여타 애플리케이션과 구분하여 시스템 영역(/system/app, /system/priv-app)에 설치되며, 특별한 권한과 기능을 사용할 수 있는 앱입니다. 일반 사용자 애플리케이션과 달리 기기의 핵심 기능을 수행하기 때문에 기기의 안정성과 보안에 중요한 역할을 합니다.
1.2. 시스템 앱의 필요성
시스템 앱을 개발하는 이유는 다음과 같습니다:
- 필수 시스템 서비스를 제공하려고 할 때: 예를 들어, 연락처 관리, 전화, 문자 메시지, 시스템 설정 관리 등 핵심 기능을 수행하는 앱입니다.
- 하드웨어 제어 및 인터페이스 활용: 하드웨어 기능에 직접 액세스하기 위한 앱으로, 카메라, GPS, 센서 등 기기의 고유한 기능을 제어하는 응용 프로그램입니다.
- 이용자 개인 정보 보호와 보안 제공: 시스템 앱은 기기의 기능이나 개인 정보에 대한 보안을 제공하기 위해 사용하는 경우가 많습니다.
1.3. 개발 환경 설정
시스템 앱 개발을 위해 Android 운영 체제 소스 코드인 AOSP(Android Open Source Project)를 사용합니다. AOSP에서 시스템 앱을 개발하려면 다음과 같은 절차를 거치게 됩니다:
- AOSP 코드를 다운로드하고, 개발 환경을 설정합니다.
- 시스템 애플리케이션을 위한 프로젝트를 생성하고, 필요한 빌드 설정 파일을 구성합니다.
- AOSP 내에 프로젝트를 추가하고, 프로젝트를 함께 빌드합니다.
- 빌드된 시스템 이미지를 기기(또는 에뮬레이터)에 설치하고, 시스템 앱의 작동 여부를 확인합니다.
이상으로 시스템 앱 개발의 개요를 간략하게 살펴보았습니다. 다음 장에서는 시스템 앱의 빌드 설정 파일인 .mk 파일의 작성 방법을 다루겠습니다.
2장. .mk 파일 작성법
본 장에서는 AOSP에서 사용되는 .mk 파일 작성법을 알아보겠습니다. .mk 파일은 시스템 앱의 빌드 설정을 정의하는데 사용되는 Makefile입니다.
2.1. 핵심 구성 요소 및 구조
일반적인 .mk 파일은 다음과 같은 핵심 구성 요소와 구조를 가집니다.
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := MySystemApp LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PRIVILEGED_MODULE := true LOCAL_JAVA_LIBRARIES := framework include $(BUILD_PACKAGE)
LOCAL_PATH
LOCAL_PATH는 현재 디렉토리의 경로를 지정합니다.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
CLEAR_VARS는 빌드 변수를 초기화하는 파일을 포함합니다. 이것이 제일 먼저 실행되어야 합니다.
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS
LOCAL_MODULE_TAGS는 해당 모듈이 어느 상황에서 빌드되어야 하는지 정의합니다. 'optional'이라는 값은 모듈이 기본적으로 빌드되지 않고 명시적으로 빌드될 때만 포함된다는 의미입니다.
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE
LOCAL_MODULE은 시스템 앱의 이름을 지정합니다. 패키지 이름과 일치하지 않아도 됩니다.
LOCAL_MODULE := MySystemApp
LOCAL_SRC_FILES
LOCAL_SRC_FILES는 빌드에 사용될 소스 파일을 나열합니다. 'call all-java-files-under' 함수를 사용하여 특정 폴더 내의 모든 자바 파일을 참조할 수 있습니다.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PRIVILEGED_MODULE
LOCAL_PRIVILEGED_MODULE은 시스템 앱이 권한이 있는(privileged) 모듈인지 여부를 설정합니다. true로 설정하면 권한 있는 시스템 앱으로 빌드됩니다.
LOCAL_PRIVILEGED_MODULE := true
LOCAL_JAVA_LIBRARIES
LOCAL_JAVA_LIBRARIES는 앱 빌드에 필요한 추가 Java 라이브러리를 지정합니다.
LOCAL_JAVA_LIBRARIES := framework
include $(BUILD_PACKAGE)
BUILD_PACKAGE는 시스템 앱 패키지를 빌드하는 데 필요한 명령을 포함하는 스크립트 파일을 참조합니다.
include $(BUILD_PACKAGE)
2.2. 추가 설정
필요한 경우 .mk 파일에 추가 설정을 적용할 수 있습니다. 예를 들어, AndroidManifest.xml에 정의된 앱 권한이 시스템 앱에서만 사용 가능하도록 제한하려면 다음 줄을 .mk 파일에 추가합니다.
LOCAL_REQUIRED_PERMISSIONS := android.permission.MY_SYSTEM_ONLY_PERMISSION
위의 예시에서 'android.permission.MY_SYSTEM_ONLY_PERMISSION'은 원하는 시스템 전용 권한으로 교체하십시오.
추가 설정을 통해 빌드에 사용되는 원시 코드, 리소스 파일, 종속성 등을 미세 조정할 수 있습니다.
이상으로 .mk 파일 작성법에 대해 알아보았습니다. 다음 장에서는 그외 추가 설정 방법에 대해 살펴보겠습니다.
3장. 그외 추가 설정
본 장에서는 AOSP 시스템 앱 설정 과정에서 고려할 수 있는 추가적인 설정 요소들에 대해 알아보겠습니다.
3.1. AIDL 인터페이스 빌드
시스템 앱이 AIDL 인터페이스를 사용하는 경우, 해당 인터페이스 파일을 .mk 파일에 추가해야 합니다.
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl LOCAL_SRC_FILES := $(call all-aidl-files-under, aidl)
위의 코드는 AIDL 인터페이스 파일을 포함하고 있는 'aidl' 디렉토리를 참조하게 설정합니다. 이렇게 하면 시스템 앱 빌드 중 해당 디렉토리의 AIDL 파일을 자동으로 컴파일합니다.
3.2. 추가 리소스 디렉토리 설정
앱이 여러 리소스 폴더를 사용하는 경우, 이러한 추가 폴더를 .mk 파일에 포함해야 합니다. 예를 들어, 'res_extra'라는 추가 리소스 디렉토리를 사용하면 다음과 같이 설정합니다.
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res_extra
3.3. C/C++ 네이티브 코드 빌드
앱이 C/C++ 네이티브 코드를 사용하는 경우, NDK를 사용하여 해당 코드를 빌드 및 포함시키도록 설정해야 합니다. 이를 위해 다음과 같이 .mk 파일에 추가 설정을 적용합니다.
LOCAL_C_INCLUDES := $(LOCAL_PATH)/native/include LOCAL_SRC_FILES := native/my_native_lib.c LOCAL_CFLAGS := -DUSE_MY_NATIVE_LIB
위의 코드는 네이티브 라이브러리 'my_native_lib.c' 파일과 관련 헤더 파일들이 있는 디렉토리를 참조하며, 해당 라이브러리를 사용한다는 기호정의를 지정합니다.
작성예시:LOCAL_C_INCLUDES := $(LOCAL_PATH)/jni/include LOCAL_SRC_FILES += $(call all-c-files-under, jni) LOCAL_JNI_SHARED_LIBRARIES := my-native-lib
3.4. ProGuard 설정
시스템 앱이 ProGuard를 사용해 코드 축소 및 난독화를 적용하려는 경우, .mk 파일에 ProGuard 설정 파일을 포함시키도록 설정해야 합니다. 다음과 같이 설정합니다.
LOCAL_PROGUARD_ENABLED := $(MY_PROGUARD_ENABLED) LOCAL_PROGUARD_FLAG_FILES := $(LOCAL_PATH)/proguard.flags
위의 코드는 ProGuard 설정을 활성화하고, 'proguard.flags' 파일을 사용합니다.
이상으로 AOSP 시스템 앱 설정을 위한 그외 추가 설정 방법들을 알아보았습니다. 이러한 설정들을 적절히 사용하여 시스템 앱의 빌드 속성을 미세 조정할 수 있습니다.
4장. 시스템 앱 빌드 및 테스트
본 장에서는 AOSP에서 개발한 시스템 앱을 빌드하고 테스트하는 방법에 대해 알아보겠습니다.
4.1. 시스템 앱 빌드
AOSP 내에서 시스템 앱을 빌드하려면 먼저 개발 환경이 AOSP 빌드를 지원하는지 확인해야 합니다. 운영 체제, Java Development Kit (JDK) 버전, 소스 코드 등 모든 요소가 호환되어야 합니다. 자세한 내용은 공식 Android Build Requirements 문서에서 확인해주세요.
개발 환경이 준비되면 AOSP 빌드에 시스템 앱을 추가해야 합니다. 앱 소스 코드가 위치한 디렉토리 및 .mk 파일이 포함된 경로를 AOSP의 빌드시스템에 신규로 포함 시키세요. 일반적으로 시스템 앱은 `packages/apps` 디렉토리에 위치합니다.
앱을 성공적으로 추가했다면 AOSP 전체를 빌드하는 과정에서 해당 시스템 앱도 빌드됩니다. 다음 명령어로 빌드를 시작하세요.
source build/envsetup.sh lunch make -j4
AOSP 빌드가 완료되면 `out/target/product/{device-name}/system/app` 경로에서 빌드된 시스템 앱을 확인할 수 있습니다.
4.2. 시스템 앱 테스트
개발한 시스템 앱을 실제 기기나 에뮬레이터에서 테스트하려면 다음과 같은 절차를 따르세요.
- AOSP 빌드에서 생성된 시스템 이미지를 기기에 설치합니다.
- 기기를 부팅한 후 기기에서 개발한 앱을 실행하고 정상 동작하는지 확인합니다.
- 앱의 전반적인 기능과 성능, 사용성을 점검합니다.
- 문제가 발생할 경우 로그를 확인하여 디버깅하고 수정합니다.
- 기기와 에뮬레이터에서 다양한 환경과 기기에서 진행하여 호환성을 점검합니다.
- 모든 테스트가 완료되면 배포를 준비합니다.
시스템 앱 테스트는 앱의 올바른 동작 뿐만 아니라 시스템과의 상호 작용 및 리소스 사용량 등의 다양한 요소를 검토하며 이루어집니다.
이상으로 시스템 앱 빌드 및 테스트 방법에 대해 알아보았습니다. 다음 장에서는 전체 내용을 마무리하고 요약을 담겠습니다.
5장. 전반적인 리뷰 요약
본 문서에서는 AOSP를 통한 시스템 앱 개발에 관련된 주요 개념 및 과정을 다루었습니다. 이 장에서는 이전 장들에서 다룬 내용을 간략하게 요약해보겠습니다.
5.1. 요약
- 시스템 앱 개발 개요: 시스템 앱은 일반 앱과 다르게 시스템 영역에 설치되며, 특별한 권한 및 기능을 사용할 수 있는 앱입니다.
- .mk 파일 작성법: 시스템 앱의 빌드 설정을 정의하는 .mk 파일을 작성하여 빌드 과정을 제어합니다. 이 파일은 변수와 명령어를 포함하며, 필요에 따라 다양한 설정을 적용할 수 있습니다.
- 기타 추가 설정: 시스템 앱 빌드에 필요한 추가적인 설정 요소들을 적용할 수 있습니다. 이러한 설정들은 AIDL 인터페이스, 추가 리소스 디렉토리, 네이티브 코드 빌드, ProGuard 설정 등이 포함됩니다.
- 시스템 앱 빌드 및 테스트: AOSP에서 시스템 앱을 빌드하고, 기기 또는 에뮬레이터에서 테스트를 진행하여 올바른 동작을 확인합니다. 테스트는 기능, 성능, 호환성 등의 다양한 요소를 검토하며 진행됩니다.
5.2. 마치며
Android 시스템 앱 개발은 어려운 주제이며, 많은 경험과 기술이 필요합니다. 이 가이드에서는 AOSP 시스템 앱 개발의 기초적인 내용을 다루었습니다. 이를 바탕으로 더 깊이 있는 공부와 실무 경험을 쌓으실 수 있기를 바랍니다. 시스템 앱 개발을 통해 사용자들에게 안전하고 풍부한 사용자 경험을 제공할 수 있는 앱을 만드실 수 있기를 기대합니다.
0 개의 댓글:
Post a Comment