Android OS

Android.mk

Jay.P Morgan 2024. 10. 31. 23:53

 

  1.  Intro

 

Android.mk 파일은 프로젝트의 jni/ 디렉터리에 속한 하위 디렉터리에 있으며, 빌드 시스템에 대한 소스 및 공유 라이브러리를 설명한다. 이 파일은 실제로는 빌드 시스템이 한 번 또는 그 이상 파싱하는 작은 GNU Makefile 프레그먼트이다. Android.mk파일은 Application.mk, 빌드 시스템, 환경 변수가 정의 되어있지 않은 상태로 남겨두는 프로젝트의 전반의 설정을 정의하는데 유용하다.

  1.1  Android.mk의 구문을 사용해 소스를 모듈로 그룹화할 수 있다.

  모듈은 정적 라이브러리, 공유 라이브러리, 독립형 실행 파일이다. 각각의 Android.mk 파일에서 하나 이상의 모듈을 정의할 수 있고 여러 모듈에서 같은 소스 파일을 사용할 수 있다. 빌드 시스템은 공유 라이브러리를 애플리케이션 패키지에 넣을 뿐이다. 또한 정적라이브러리는 공유 라이브러리를 생성할 수 있다.

  1.2  라이브러리 패키징과 더불어, 빌드 시스템은 개발자를 위해 다양한 기타 세부 사랑을 처리해준다.

  예를 들어, 헤더 파일을 나열하거나 Android.mk파일에 생성된 파일 간의 종속성을 명시할 필요가 없다.

NDK 빌드 시스템이 이러한 관계들을 자동으로 계산해 주기 때문이다. 따라서 Android.mk파일을 손댈 필요 없이 향후 NDK릴리스의 새로운 툴체인/플랫폼 지원을 이용할 수 있을 것이다.

  1.3  이 파일의 구문은 전체 Android 오픈 소스와 함께 배포되는 Android.mk 파일에 사용되는 구문과 매우 흡사하다.

  이들을 사용하는 빌드 시스템 구현은 서로 다르지만. 의도적으로 디자인 단계에서 이처럼 유사하게 만든 이유는 애플리케이션 개발자들이 외부 라이브러리용 소스코드를 더 쉽게 재사용 할 수 있기 위함이다.

 

 

  2.  기본사항

 

 

  1.   Android.mk 파일은 다음과 같이 LOCAL_PATH 변수에 대한 정의를 시작해야한다.

LOCAL_PATH := $(call-my-dir)

LOCAL_PATH 란 -> 개발 트리에 있는 소스파일의 위치를 나타낸다.

여기서 빌드시스템이 제공하는 매크로 함수 my-dir는 현재 디렉터리(Android.mk)의 경로를 반환한다.

  2.   다음으로 CLEAR_VARS 변수를 선언한다.

include $(CLEAR_VARS)

LOCAL_MODULE. LOCAL_SRC_FILE. LOCAL_STATIC_LIBR ... 와 같은 수많은 LOCAL_XXX 변수를 자동으로 지우는 GNU makefile을 가리킨다.

  3.   LOCAL_MODULE 변수가 빌드하려는 모듈의 이름을 저장한다. 이 변수는 애플리케이션 내 모듈당 한 번씩 사용한다.

LOCAL_MODULE := hello=jni

각 모듈의 이름은 고유해야하고, 공백을 하나라도 포함하면 안된다. 빌드 시스템은 최종 공유 라이브러리 파일을 생성할 때 LOCAL_MODULE에 할당하는 이름에 알맞은 접두사와 접미사를 자동으로 추가한다. 예를 들어, 위에 나와있는 예시대로 실행하면 libhello-jni.so라는 라이브러리가 생성된다.

** 참고 : 모듈 이름이 이미 'lib'로 시작하는 경우 빌드 시스템은 추가적인 lib를 접두사에 추가하지 않고, 모듈 이름을 그대로 받아들인 후 '.so' 확장자를 추가한다. 예를 들어, 원래 이름이 'libfoo.c'인 소스 파일은 계속 'libfoo.so'라는 공유 객체 파일을 생성한다. 이 동작은 Android 플랫폼 소스가 'Android.mk' 파일에서 생성하는 라이브러리를 지원하기 위한 것으로, 이러한 모든 라이브러리의 이름은 'lib'으로 시작된다.

 

 

  4.  다음 줄에는 소스파일이 열거되며, 공백으로 여러 파일을 구분한다.

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES 변수는 모듈에 빌드할 C 및 C++ 소스 파일의 목록을 포함해야한다.

마지막 명령줄은 시스템이 모든 것을 하나로 연결하는데 도움이 된다.

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY변수는 가장 최근의 include이후로 LOCAL_XXX 변수에 정의한 모든 정보를 수집하는 GNU Makefile 스크립트를 가리킨다.

​※ 빌드 시스템은 Android.mk 파일에서 사용할 수 있는 변수를 최대한 많이 제공한다. 이들 변수에는 대부분 미리 할당된 값이 포함되어있다. 다른 변수들은 개발자가 직접 값을 할당한다.

1) LOCAL_ 로 시작되는 이름 (예 : LOCAL_MODULE)

2) PRIVATE_ , NDK_ , APP으로 시작되는 이름, 빌드 시스템은 이러한 이름을 내부적으로 사용한다.

3) 소문자로 된 이름 (예 : my-dir ). 이 빌드 시스템은 이러한 이름 역시 내부적으로 사용한다.

* Android.mk 파일에 편의상 자체 변수를 정의할 필요가 있을 경우에는 MY_를 추가하는 것이 좋다.

https://developer.android.com/ndk/guides/android_mk.html?hl=ko

 

 

'Android OS' 카테고리의 다른 글

Android Boot & Init  (3) 2024.11.01
Android Binder  (1) 2024.11.01
Android Platform 구조  (0) 2024.10.31
ADB : 안드로이드에 APK파일 설치하기  (0) 2024.10.31
HAL (Hardware Abstraction Layer : 하드웨어 추상화 계층)  (1) 2023.11.08