1. Android 기본 Build 방법
- STEP1 - Android Build 준비를 위해 기본설정
lunch/m/mm/mmm/cgrep/jgrep 등 기본명령어들 사용가능
$ source build/envsetup.sh // 설정시 vendor와 관련된 shell script 확장 및 build의 기본명령어 실행가능
including device/fsl/imx6dq/vendorsetup.sh
including device/fsl/imx6sl/vendorsetup.sh
including device/fsl/imx6sx/vendorsetup.sh
......
상위 Shell Script를 보면, 지원되는 기능을 쉽게 알수 있으며, 분석도 쉽다.
- STEP2 - Android Board 관련설정
lunch를 이용하여, boardname 과 Build Type를 선택 (ProductName-BuildMode)
$ lunch
or
$ lunch board-user/userdebug/eng //3개 중 선택하여 설정
- STEP3 - Android Build
상위에서 설정한 Build Type과 Board 설정으로 Android를 전체 Build 진행
$ make 2>&1 | tee build-log.txt //전체 Build 하며, 에러가 발생시 이를 멈추지 말고 진행하고 로그를 남김
Android Build 구조
Android Build 방법
Android Source 구조
$ hmm // 상위 source build/envsetup.sh 이후 가능하며, envsetup.sh shellscript
...
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- lunch: lunch <product_name>-<build_variant>
Selects <product_name> as the product to build, and <build_variant> as the variant to
build, and stores those selections in the environment to be read by subsequent
invocations of 'm' etc.
- tapas: tapas [<App1> <App2> ...] [arm|x86|mips|arm64|x86_64|mips64] [eng|userdebug|user]
- croot: Changes directory to the top of the tree, or a subdirectory thereof.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory, but not their dependencies.
- mmm: Builds all of the modules in the supplied directories, but not their dependencies.
To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma: Builds all of the modules in the current directory, and their dependencies.
- mmma: Builds all of the modules in the supplied directories, and their dependencies.
- provision: Flash device with all required partitions. Options will be passed on to fastboot.
- cgrep: Greps on all local C/C++ files.
- ggrep: Greps on all local Gradle files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- mangrep: Greps on all local AndroidManifest.xml files.
- mgrep: Greps on all local Makefiles files.
- sepgrep: Greps on all local sepolicy files.
- sgrep: Greps on all local source files.
- godir: Go to the directory containing a file.
- allmod: List all modules.
- gomod: Go to the directory containing a module.
- pathmod: Get the directory containing a module.
- refreshmod: Refresh list of modules for allmod/gomod.
Environment options:
- SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that
ASAN_OPTIONS=detect_leaks=0 will be set by default until the
build is leak-check clean.
- ANDROID_QUIET_BUILD: set to 'true' to display only the essential messages.
1.2 Vendor Shell Script
각 Vendor Shell Script에서 board name 과 Build Type를 쉽게 추가되는 것을 확인되며, 아래의 이름으로 lunch로 실행
$ cat device/fsl/imx6sx/vendorsetup.sh //boardname 과 user/userdebug 확인 (lunch에서 설정가능)
add_lunch_combo sabresd_6sx-user
add_lunch_combo sabresd_6sx-userdebug
add_lunch_combo sabreauto_6sx-user
add_lunch_combo sabreauto_6sx-userdebug
상위 STEP2에서 여기서 등록된 lunch로 설정 i.MX6 의 경우 아래와 같다.
$ lunch sabresd_6sx-userdebug ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=9 TARGET_PRODUCT=sabresd_6sx TARGET_BUILD_VARIANT=userdebug TARGET_BUILD_TYPE=release TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=cortex-a9 HOST_ARCH=x86_64 HOST_2ND_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-4.15.0-128-generic-x86_64-Ubuntu-16.04.3-LTS HOST_CROSS_OS=windows HOST_CROSS_ARCH=x86 HOST_CROSS_2ND_ARCH=x86_64 HOST_BUILD_TYPE=release BUILD_ID=2.2.0-ga-rc3 OUT_DIR=out ============================================
i.MX6의 경우 별도의 DSP가 존재하지 않으며, ARM의 neon mode를 이용하여 DSP역할을 해주는 것으로 보인다.
$ lunch sabresd_6sx-eng ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=9 TARGET_PRODUCT=sabresd_6sx TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=cortex-a9 HOST_ARCH=x86_64 HOST_2ND_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-4.15.0-128-generic-x86_64-Ubuntu-16.04.3-LTS HOST_CROSS_OS=windows HOST_CROSS_ARCH=x86 HOST_CROSS_2ND_ARCH=x86_64 HOST_BUILD_TYPE=release BUILD_ID=2.2.0-ga-rc3 OUT_DIR=out ============================================
1.2 Android PRODUCT 와 BUILD_VARIANT
lunch에서 boardname 과 build type를 설정
- TARGET_PRODUCT : 상위 Board Name
- TARGET_BUILD_VARIANT : Build Type 이며, eng/user/userdebug
PRODUCT_PACKAGES
LOCAL_MODULE_TAGS
$ find . -name default.prop $ cat ./development/vndk/tools/definition-tool/tests/testdata/test_vndk_lib_dir/vndk_versioned_multiple/vendor/default.prop ro.vndk.version=29
각 LOCAL_MODULE_TAGS 의 설정으로 기본은 optional default.prop (default.property 의 약어로 상위와 같이 설정확인) 개발자 버전으로 enginerring build로 개발자들이 가장 많이 사용 • eng: development configuration with additional debugging tools — Installs modules tagged with: eng and/or debug. — Installs modules according to the product definition files, in addition to tagged modules. — ro.secure=0 — ro.debuggable=1 — ro.kernel.android.checkjni=1 — adb is enabled by default. //adb 사용가능 • user: limited access; suited for production — Installs modules tagged with user. — Installs modules according to the product definition files, in addition to tagged modules. — ro.secure=1 — ro.debuggable=0 — adb is disabled by default.//adb 사용불가능 • userdebug: like user but with root access and debuggability; preferred for debugging — Installs modules tagged with debug. — ro.debuggable=1 — adb is enabled by default. // adb 사용가능
Build-variants
2. build/core/main.mk
상위 전체 make를 하면, 상위 main.mk가 호출되면서 Build가 진행된다.
Android Makefile과 환경설정설명
http://elinux.org/Android_Device
http://elinux.org/Android_Device
Android Kernel 구성
2.1 Boardconfig.mk 분석
Android의 Build할 경우 Board의 전체 Config이며, 가장중요한 파일이며, 이파일 기반으로 분석을 시작해야한다.
복잡한 경우에는 추가되는 부수적인 BoardCommonConfig.mk 이던지 추가하여 공통사항들을 설정한다.
$ find . -name BoardConfig.mk // 기본위치파악
device/Vendor/ARCH/BoardName/BoardConfig.mk
....
상위와 같이 device/Vendor/ARCH/BoardName/BoardConfig.mk에 존재하며 이곳에 manifest.xml를 비롯하여 각종중요파일들이 같이 존재한다.
- init.rc/init%hardware$.rc: init 후 script 기능
- ueventd.%hardware%.rc: udev 기능 설정
- 이외 파일 아래 설명
BoardConfig.mk 가 있는 곳에 모든 관련설정이 포함하고 있으며, 이곳에 없다면, 같은 디렉토리의 다른 Makefile를 참조하자
- BoardConfig.mk 분석 (i.MX6)
가장먼저 분석해야할 각 Board의 세부 Config 내용이며, Device Tree를 비롯하여 세부 설정사항들을 알수 있음
$ vi ./device/fsl/imx6sx/sabresd_6sx/BoardConfig.mk # # 주석 # IMX_DEVICE_PATH := device/fsl/imx6sx/sabresd_6sx # # include로 확장 # include $(IMX_DEVICE_PATH)/build_id.mk include device/fsl/imx6sx/BoardConfigCommon.mk ifeq ($(PREBUILT_FSL_IMX_CODEC),true) -include $(FSL_CODEC_PATH)/fsl-codec/fsl-codec.mk endif ..... BOARD_PREBUILT_DTBOIMAGE := out/target/product/sabresd_6sx/dtbo-imx6sx.img TARGET_BOOTLOADER_CONFIG := imx6sx:imx6sxsabresdandroid_defconfig # imx6sx default dts TARGET_BOARD_DTS_CONFIG := imx6sx:imx6sx-sdb.dtb TARGET_KERNEL_DEFCONFIG := imx_v7_android_defconfig
- AndroidBoard.mk
BoardConfig.mk 와 같은위치에 존재하는 AndroidBoard.mk 있으며, Build되는 전체구조와 순서를 쉽게 파악 알수 있다
$ vi ./device/fsl/imx6sx/sabresd_6sx/AndroidBoard.mk include device/fsl/common/build/dtbo.mk include device/fsl/common/build/imx-recovery.mk include device/fsl/common/build/gpt.mk include $(FSL_PROPRIETARY_PATH)/fsl-proprietary/media-profile/media-profile.mk ifneq ($(PRODUCT_IMX_CAR),true) include $(FSL_PROPRIETARY_PATH)/fsl-proprietary/sensor/fsl-sensor.mk endif ifneq ($(BOARD_OTA_BOOTLOADERIMAGE),) INSTALLED_RADIOIMAGE_TARGET += $(PRODUCT_OUT)/bootloader.img BOARD_PACK_RADIOIMAGES += bootloader.img endif
- AndroidProducts.mk
상위와 같은 위치에 존재하며, 상위 LUNCH 설정하며, PRODUCT_MAKEFILES을 분석을 하면 쉽게 제품의 구조를 파악가능
build/target/product/AndroidProducts.mk 와 같이 보자.
$ vi ./device/fsl/imx6sx/sabredsd_6sx/AndroidProducts.mk # Copied from build/target/product/AndroidProducts.mk PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/evk_6sl/evk_6sl.mk COMMON_LUNCH_CHOICES := \ evk_6sl-user \ evk_6sl-userdebug
2.2 Device.mk 와 device_xxx.mk
Android에서 사용되어지는 Device의 빌드할 경우 관련 설정 및 Build 파일로 만약 새로운 Device를 추가한다면, 이 Makefile도 추가해야한다.
Device.mk를 분석을 해보면, 아래와 같이
PRODUCT라는 FLAG들이 많다는 것을 알며, 이것의 종류가 좀 있다고 느껴진다.
PRODUCT라는 FLAG들이 많다는 것을 알며, 이것의 종류가 좀 있다고 느껴진다.
2.3 AndroidProduct.mk 의 PRODUCT_MAKEFILES
상위에서 설명한 AndroidProduct.mk에 PRODUCT_MAKEFILES들을 분석하면 다음과 같이 구조가 나온다.
- PRODUCT_PACKAGES
- PRODUCT_COPY_FILES
- PRODUCT_PROPERTY_OVERRIDES
- PRODUCT_DEFAULT_PROPERTY_OVERRIDES
- PRODUCT_CHARACTERISTICS
- PRODUCT_AAPT_CONFIG
- PRODUCT_AAPT_PREF_CONFIG
- PRODUCT_TAGS
2.4 NDK의 Android.mk 와 Application.mk
상위 Android.mk에 LOCAL_MODULE_TAGS에
여러 *.mk에 있다고 하니, 여러군데를 일단 분석을 해보았고, 기본이 되는
device/hardkernel/odroidx2/device.mk 이 부분 기반을 보니,
device/hardkernel/odroidx2/device.mk 이 부분 기반을 보니,
device.mk의 설명
http://codewalkerster.blogspot.kr/2012/05/localmoduletags.html
http://blog.daum.net/baramjin/16011118
http://codewalkerster.blogspot.kr/2012/05/localmoduletags.html
http://blog.daum.net/baramjin/16011118
NDK와 Android.mk와 Application.mk
- Build 구조이해
구글문서로 new Device를 추가하는 법인데, 쉽게 빌드구조를 이해가능
Android Song 빌드구조
Android USB
Android Build 순서
http://samse.tistory.com/121
http://www.kandroid.org/online-pdk/guide/build_new_device.html
Android.mk 각각의 대한 설명
http://egloos.zum.com/furmuwon/v/10709863
http://mobileandlife.tistory.com/entry/%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%97%90-%ED%8F%AC%ED%95%A8-%ED%95%A0-product-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0
http://samse.tistory.com/121
http://www.kandroid.org/online-pdk/guide/build_new_device.html
Android.mk 각각의 대한 설명
http://egloos.zum.com/furmuwon/v/10709863
http://mobileandlife.tistory.com/entry/%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%97%90-%ED%8F%AC%ED%95%A8-%ED%95%A0-product-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0