Android Build System Rev-0.1 고도리 of AESOP 2012/04/12
INDEX Android build environment setup envsetup.sh Android source tree Android.mk
Android build environment 3
Initializing the Build Environment Android source download http://source.android.com/source/initializing.html Build releated documents & source download site Setting up a Linux build environment Android 를컴파일하기위해서는여러가지 tool 이필요함 일반적으로필요한환경 Ubuntu 10.04+ or MAC OS Python 2.5 ~ 2.7 GNU Make 3.81 JDK 6 위의사이트에는 3.82 도상관없다라고되어있지만, ICS 버전컴파일시에러남 Gingerbread or newer version JDK 5 for Froyoor older version Git1.7 or newer Ubuntu 를사용할경우 version 에따라환경문제가많이발생 Ubuntu 11.10 의경우 gcc compiler version issue 발생 4
Downloading the Source Tree Download site http://source.android.com/source/downloading.html Android source 는 6Gbytes 이상임. Install repo Repo is a tool that makes it easier to work with Git in the context of Android Repo is installed in the following order cd /usr/local/bin curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > /usr/local/bin chmod 755 /usr/local/bin/repo Initializing a Android working directory Android source is downloaded in the following order mkdir YOUR_ANDROID_DIRECTORY cd YOUR_ANDROID_DIRECTORY repo init -u https://android.googlesource.com/platform/manifest -b android- 4.0.4_r1.1 In case of android ICS 4.0.4 version at 04/12/2012 repo sync 5
Build environment setup Building the System In the Android source s top directory Use the envsetup.sh source build/envsetup.sh or. build/envsetup.sh Choose a Target You can use lunch command lunch You can show prepared lunch menu with target devices Android emulator 를위한 lunch 명령어 lunch full-eng 6
lunch 명령 Building the System 컴파일하려고하는타겟디바이스를설정하는명령 build target을지정하는형식은 BUILD-BUILDTYPE 형태 BUILD 는다음과같은조합을말함 Build name Device Notes full emulator fully configured with all languages, apps, input methods full_maguro maguro full build running on Galaxy Nexus GSM/HSPA+ ("maguro") full_panda panda full build running on PandaBoard ("panda") BUILDTYPE 은다음중하나이다 Buildtype user userdebug eng Use limited access; suited for production like "user" but with root access and debuggability; preferred for debugging development configuration with additional debugging tools 7
Building the System lunch menu 에새로운 target device 등록하기 build/envsetup.sh 실행시 choosecombo 다음과같은파일을검색해서 lunch menu 에등록 vendor/*/vendorsetup.sh vendor/*/*/vendorsetup.sh device/*/*/vendorsetup.sh vendorsetup.sh 의내용은다음과같이작성 (eg.> Nexus-S 의경우 ) device/samsung/crespo/vendorsetup.sh add_lunch_combo full_crespo-userdebug lunch 명령과같은역할. 차이점은 lunch 의경우 envsetup.sh 시 lunch menu 에해당 target 이등록되어있어야하지만 choosecombo 의경우는 build target 지정을직접 command line 에서할수있도록되어있음 8
Building the System Target 설정이끝나면 build 를시작 make 혹은 make j4 와같은명령이용, 여기서 4 는 JOB 개수 CPU core 가 6 개일경우는 j6 옵션을주면됨 showcommands 옵션 make showcommands 위와같은옵션을주고 make 를하게되면어떻게 compile 이되고 link 되는지전체진행과정을보여준다. 9
build/envsetup.sh help envsetup.sh Android build system 에서제공하는 shell script 명령어들 부분컴파일을위한 toolchain 경로지정등의역할 다음과같이실행 In Android source top directory $ANDROID_HOME #>. build/envsetup.sh 혹은 $ANDROID_HOME #> source build/envsetup.sh envsetup.sh 의실행이끝난후 host 의 shell 상에서 help 를실행 10
croot envsetup.sh Changes directory to the top of the tree Android source directory의하위디렉토리에서만실행 11
m, mm, mmm m envsetup.sh Android source build help commands Android sub tree에서 source top directory로이동후 Android 전체make make 완료후명령어를실행한 sub directory로다시돌아옴 12
mm envsetup.sh 현재 directory 밑의모든 Android.mk 파일을찾아서컴파일을해준다 mm 명령은오직컴파일과 root filesystem에관련 file들을 update만함 컴파일후 system.img를자동으로생성하기위해서는 snod 명령같이사용 13
mm command with snod option envsetup.sh Build all sources in the current directory and sub-directories. And builds new system image from current binaries 14
mmm envsetup.sh Build specified directory or list of directories. You can use with snod option like mm command. 15
cgrep, jgrep, resgrep envsetup.sh 각각 C/C++ source, JAVA source, resource file 서부터특정 string 을찾아준다. godir 지정된디렉토리로이동할수있음 16
bionic bionic libc build envsetup.sh Android source tree build shell script 들이있음, 툴체인경로설정등환경설정 generic board 에대한 configuration build/target/board/generic/device.mk root filesystem 의구성을어떻게해야하는가에대한방향을지정하는파일 android 최종결과물구성시자동으로포함하고싶은 binary 들에대한 install 을결정 build/target/board/generic/boardconfig.mk Android 의 makefile 인 Android.mk 에기본적으로포함되는최상위 Makefile 주로 HAL 혹은기능들에대한 enable/disable 과관련이깊음 Android.mk 파일에영향을주고 Android.mk 파일에서 define 을제어할수있도록설정하는경우가많음 ex> BoardConfig.mk 의 BOARD_USES_GENERIC_AUDIO := true 의경우 frameworks/base/services/audioflinger/android.mk frameworks/base/services/audioflinger/audiohardwareinterface.cpp 파일의해당부분을참조 CTS Compatibility Test Suite 관련소스디렉토리 17
development 개발용 app 등 external Android source tree Android 고유의 library 가아닌 linux 혹은기존에작성된 library/binary 소스 작성된 library 중 shared library(*.so) 파일은 root filesystem 의 system/lib 로 install 작성된 library 중 binary 파일은 root filesystem 의 system/bin 으로 install framework test app와 library등은이디렉토리에서작업하는게좋음 frameworks base/policy PhoneWindowManager 소스 Android 전체시스템을 background 에서제어하는최상위 application 인 PhoneWindowManager 는다음과같은기능을갖는다 KeyGuard 관련 LockScreen 화면전체동작제어 (ex> Rotation) event 관리 Key event 등 18
frameworks Android source tree base android framework source libs/ui Android framework 에서 JNI 를통해서호출되는 android client part HAL Input device(key, touch) 의경우 libs/utils Wrapping class, 압축관련유틸리티등 libs/binder cmds media Android binder & Anonymous shared memory 제어클래스 binder 관련 binary 인 servicemanager 소스와여러가지 command 들 media 관련 JAVA, JNI, Client, Service, Media engine(libstagefright) 등의소스 media 관련은너무크고, 독립적이기때문에따로디렉토리를만들어관련소스를하나의디렉토리에넣음 19
device Android source tree 각 vendor 에서만드는 vendor 별 device 들에대한설정파일 자체 device 와 product 를만들기위해서는이디렉토리에서관련파일들을작성하는것이좋음 작성되는주요파일리스트 vendor AndroidProducts.mk Product, device 관련이름들을지정 BoardConfig.mk, device.mk generic board 에서와마찬가지역할을한다. device 디렉토리와같은역할 Android 2.1/2.2 버전에서는이디렉토리를기본 device 들에대한디렉토리로사용 현재 (Ice Cream Sandwich) 도이디렉토리를사용하는경우있음 20
out android compile 결과물디렉토리 packages android 기본 application source Android source tree 주의해야할점은모든 app 가컴파일되지않는다. 컴파일되는패키지들은각 device 별 device.mk 에지정이되는 PRODUCT_PACKAGES 변수에포함되어야함 ex> build/target/product/generic-no-telephony.mk prebuilt toolchain & 필요한 binary system android 의 root filesystem 에포함되는기본 binary 소스 (ex> init) /core/init android init source /vold vold2, android 2.3 버전서부터사용됨 21
Android source tree hardware HAL source & header file HAL Class 의 prototype 일반적으로 android 에서사용되는 hardware 관련소스들을포함, 반드시이디렉토리에만위치하는것은아님 device, vendor 디렉토리에존재하는경우가많음 libhardware board hardware dependency 가높은하드웨어모듈들의 example 및 header 일반적으로안드로이드폰에기본적으로탑재되지않고, cpu 혹은제조사의모듈에의존성이높은부분들에관련된 class prototype 코드가있음 안드로이드소스전체를컴파일하지않는경우도있고, 모듈단위로직접컴파일해서안드로이드 root filesystem 에 install 하는경우도있음 Android framework 에서동적으로 module(*.so 파일형태 ) 을 loading 하는 hw_get_module() 함수에대한소스가있음 hw_get_module() 함수는다음과같은순서로동적 module 을 loading 한다. $(MODULE_NAME).%ro.hardware%.so ex> sensors.origen.so $(MODULE_NAME).%ro.product.board%.so ex> sensors.origenboard.so $(MODULE_NAME).%ro.board.platform%.so ex> sensors.insignal_origen.so $(MODULE_NAME).%ro.arch%.so ex> sensors.exynos4.so hw_get_module() 함수는 rootfs 의 system/lib/hw, vendor/lib/hw 디렉토리를검색 22
hardware ndk libhardware_legacy Android source tree 일반적으로 android phone 에존재해야하는 hardware 에대한제어코드들이들어있음 Android compile 시같이컴파일된다 ex> wifi/wifi.c include/* Android built-in HAL 의일부 prototype 이선언되어있음 ex> Audio Native Development Kit 관련파일들이있음 docs/android-mk.html Android 에서사용되는 makefile 인 Android.mk 파일을어떻게작성해야하는지에대해서설명되어있음 PDK(Platform Development Kit Android 소스 ) 에적용되는부분에대한설명보다는 NDK 용 Android.mk 파일에대한설명임 하지만, PDK 용문서로참고하기좋음 23
Android.mk Android.mk Android 시스템에서사용되는 makefile Build system 이어떻게소스들을다뤄야하는지에대한설명 최종결과물은다음중하나 Executable binary Shared library Static library Host executable binary Application package etc. build/core/config.mk 에많은부분이더 define 되어있으나사용빈도가낮다 Android source top directory 에서 make 명령사용시 Sub directory 의모든 Android.mk 파일을검색 Source file 들의 update 상황검사 결과물이 static library 가아닐경우컴파일후 library/binary 등을 root filesystem 에 update 24
Executable binary example LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := eng LOCAL_SRC_FILES:= server.cpp Android.mk LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder libgadd01 base := $(LOCAL_PATH)/../../.. LOCAL_C_INCLUDES := \ $(base)/binder01 LOCAL_MODULE:= server01 include $(BUILD_EXECUTABLE) 25
Android.mk Android.mk 를구성하는문법 & definition LOCAL_PATH := $(call my-dir) Android.mk 파일은반드시이정의로시작되어야한다. Android 소스트리에서소스파일들의위치를지정하는데사용 my-dir macro를이용해서현재디렉토리로지정 include $(CLEAR_VARS) Android.mk 파일내에서사용되는 LOCAL_XXX 형태의변수들을 clear함 e.g. LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, etc... LOCAL_PATH 는제외됨 build/core/clear_vars.mk 어떤 definition들이 clear되는지기록되어있음 build/core/config.mk 파일에서 include됨 26
Android.mk Android.mk 를구성하는문법 & definition LOCAL_MODULE 최종출력결과물의이름, 반드시 unique 한이름이어야함 최종결과물의종류지정에따라생성파일이름이달라짐 Build output type definition include $(BUILD_EXECUTABLE) 최종결과물은 LOCAL_MODULE 에서지정된이름그대로생성됨 out/target/product/$(target_product)/obj/executables/$(local_module)_inter mediates/linked/$(local_module) Root filesystem 의 system/bin 디렉토리로복사 install 됨 out/target/product/$(target_product)/system/bin/$(local_module) include $(BUILD_SHARED_LIBRARY) 최종결과물은 LOCAL_MODULE.so 의형태를갖는 shared object 를생성 out/target/product/$(target_product)/obj/shared_libraries/$(local_module) _intermediates/linked/$(local_module).so Root filesystem 의 system/lib 디렉토리로복사 install 됨 out/target/product/$(target_product)/system/lib/$(local_module).so 27
Android.mk Android.mk 를구성하는문법 & definition Build output type definition include $(BUILD_STATIC_LIBRARY) 최종결과물은 LOCAL_MODULE.a 의형태를갖는 static library 생성 out/target/product/$(target_product)/obj/static_libraries/$(local_module)_i ntermediates/$(local_module).a Root filesystem 으로는포함되지않는다 LOCAL_MODULE_TAGS build/core/base_rules.mk 에사용 tag option 지정 Android build system 의 BUILDTYPE(e.g. eng) 에따라지정된 tag 와매칭이될경우만해당모듈을컴파일하도록하는지시자 ICS 버전에서는 optional, debug, eng, test, samples 태그를지원함 optional 태그는 GingerBread 서부터생겨남 각 PRODUCT 혹은 device 의 PRODUCT_PACKAGES 에해당 module 이지정되어있지않으면전체 make 시 root filesystem 에 install 하지않음 28
Android.mk Android.mk 를구성하는문법 & definition LOCAL_MODULE_TAGS( 계속 ) ex> LOCAL_MODULE_TAGS := eng optional eng 빌드타입에서는 build 가됨 하지만, eng 이외의 buildtype 에서는 PRODUCT_PACKAGES 변수에해당모듈이름이포함되어있지않은경우는전체 build 시 root filesystem 에 install 되지않는다 만일 user 빌드타입으로전체 build 를하면 PRODUCT_PACKAGES 변수에지정되어있지않으면 root filesystem 에포함되지않음 PRODUCT_PACKAGES 변수로의지정 build/target/product/*.mk 파일에서지정을하거나 device/*.mk 파일등에서지정한다 일반적으로 device 디렉토리의 $(PRODUCT)/device.mk 등에서많이지정된다. 29