Thursday, August 24, 2023

쉽게 배우는 Android AOSP 시스템 앱 설정: .mk 파일 작성법 및 추가 설정

  1. 1장. AOSP 및 시스템 앱 개요
  2. 2장. .mk 파일 작성법
  3. 3장. 추가 설정 방법
  4. 4장. 시스템 앱 빌드 및 테스트
  5. 5장. 마무리 및 요약

1장. 시스템 앱 개발 개요

이 장에서는 Android 시스템 앱 개발의 개요에 대해 맛보기로 설명하겠습니다. 시스템 앱은 일반 앱과는 약간 차이가 있는데, 그 차이점들을 살펴보고 왜 시스템 앱을 개발할 필요가 있는지 알아보겠습니다.

1.1. 시스템 앱이란?

시스템 앱은 안드로이드 기기 내에서 실행되는 애플리케이션 중, 여타 애플리케이션과 구분하여 시스템 영역(/system/app, /system/priv-app)에 설치되며, 특별한 권한과 기능을 사용할 수 있는 앱입니다. 일반 사용자 애플리케이션과 달리 기기의 핵심 기능을 수행하기 때문에 기기의 안정성과 보안에 중요한 역할을 합니다.

1.2. 시스템 앱의 필요성

시스템 앱을 개발하는 이유는 다음과 같습니다:

  • 필수 시스템 서비스를 제공하려고 할 때: 예를 들어, 연락처 관리, 전화, 문자 메시지, 시스템 설정 관리 등 핵심 기능을 수행하는 앱입니다.
  • 하드웨어 제어 및 인터페이스 활용: 하드웨어 기능에 직접 액세스하기 위한 앱으로, 카메라, GPS, 센서 등 기기의 고유한 기능을 제어하는 응용 프로그램입니다.
  • 이용자 개인 정보 보호와 보안 제공: 시스템 앱은 기기의 기능이나 개인 정보에 대한 보안을 제공하기 위해 사용하는 경우가 많습니다.

1.3. 개발 환경 설정

시스템 앱 개발을 위해 Android 운영 체제 소스 코드인 AOSP(Android Open Source Project)를 사용합니다. AOSP에서 시스템 앱을 개발하려면 다음과 같은 절차를 거치게 됩니다:

  1. AOSP 코드를 다운로드하고, 개발 환경을 설정합니다.
  2. 시스템 애플리케이션을 위한 프로젝트를 생성하고, 필요한 빌드 설정 파일을 구성합니다.
  3. AOSP 내에 프로젝트를 추가하고, 프로젝트를 함께 빌드합니다.
  4. 빌드된 시스템 이미지를 기기(또는 에뮬레이터)에 설치하고, 시스템 앱의 작동 여부를 확인합니다.

이상으로 시스템 앱 개발의 개요를 간략하게 살펴보았습니다. 다음 장에서는 시스템 앱의 빌드 설정 파일인 .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. 시스템 앱 테스트

개발한 시스템 앱을 실제 기기나 에뮬레이터에서 테스트하려면 다음과 같은 절차를 따르세요.

  1. AOSP 빌드에서 생성된 시스템 이미지를 기기에 설치합니다.
  2. 기기를 부팅한 후 기기에서 개발한 앱을 실행하고 정상 동작하는지 확인합니다.
  3. 앱의 전반적인 기능과 성능, 사용성을 점검합니다.
  4. 문제가 발생할 경우 로그를 확인하여 디버깅하고 수정합니다.
  5. 기기와 에뮬레이터에서 다양한 환경과 기기에서 진행하여 호환성을 점검합니다.
  6. 모든 테스트가 완료되면 배포를 준비합니다.

시스템 앱 테스트는 앱의 올바른 동작 뿐만 아니라 시스템과의 상호 작용 및 리소스 사용량 등의 다양한 요소를 검토하며 이루어집니다.

이상으로 시스템 앱 빌드 및 테스트 방법에 대해 알아보았습니다. 다음 장에서는 전체 내용을 마무리하고 요약을 담겠습니다.

5장. 전반적인 리뷰 요약

본 문서에서는 AOSP를 통한 시스템 앱 개발에 관련된 주요 개념 및 과정을 다루었습니다. 이 장에서는 이전 장들에서 다룬 내용을 간략하게 요약해보겠습니다.

5.1. 요약

  1. 시스템 앱 개발 개요: 시스템 앱은 일반 앱과 다르게 시스템 영역에 설치되며, 특별한 권한 및 기능을 사용할 수 있는 앱입니다.
  2. .mk 파일 작성법: 시스템 앱의 빌드 설정을 정의하는 .mk 파일을 작성하여 빌드 과정을 제어합니다. 이 파일은 변수와 명령어를 포함하며, 필요에 따라 다양한 설정을 적용할 수 있습니다.
  3. 기타 추가 설정: 시스템 앱 빌드에 필요한 추가적인 설정 요소들을 적용할 수 있습니다. 이러한 설정들은 AIDL 인터페이스, 추가 리소스 디렉토리, 네이티브 코드 빌드, ProGuard 설정 등이 포함됩니다.
  4. 시스템 앱 빌드 및 테스트: AOSP에서 시스템 앱을 빌드하고, 기기 또는 에뮬레이터에서 테스트를 진행하여 올바른 동작을 확인합니다. 테스트는 기능, 성능, 호환성 등의 다양한 요소를 검토하며 진행됩니다.

5.2. 마치며

Android 시스템 앱 개발은 어려운 주제이며, 많은 경험과 기술이 필요합니다. 이 가이드에서는 AOSP 시스템 앱 개발의 기초적인 내용을 다루었습니다. 이를 바탕으로 더 깊이 있는 공부와 실무 경험을 쌓으실 수 있기를 바랍니다. 시스템 앱 개발을 통해 사용자들에게 안전하고 풍부한 사용자 경험을 제공할 수 있는 앱을 만드실 수 있기를 기대합니다.


0 개의 댓글:

Post a Comment