안드로이드에 새로운 모델을 추가시에 몇가지 바뀐 부분들이 있는 것 같아 번역 겸 정리를 하게 되었다.
저는 Ubuntu 9.04에서 빌드를 진행하였습니다.
우선 소스를 다운 받으면 다음과 같이 폴더 구조를 볼 수 있습니다.
1. Company Directory를 vendor 아래에 생성합니다.
저는 marisstella라고 회사이름을 만들어서 디렉토리를 생성하였습니다.
| mkdir vendor/<Company name> |
2. <Company name> 디렉토리 아래에 products 디레토리를 하나 더 생성합니다.
| mkdir vendor/<Company name>/products |
3. products 폴더에 product-specific make file인 <product_name>.mk 파일을 생성하고
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic.mk)
#
# Overrides
PRODUCT_NAME := <product_name>
PRODUCT_DEVICE := <board_name> |
저는 A1234.mk 파일을 생성하였습니다.
4. 역시 같은 디렉토리인 products 폴더에 AndroidProduct.mk 파일을 생성 후 다음 내용을 추가합니다.
이 파일은 각각의 product make 파일들을 찾거나 가르키게 됩니다.
# The directory containing this file
#
# This file may not rely on the value of nay variable other than
# LOCAL_DIR; do not use any conditionals, and do not look up the
# value of any variable that isn't set in this file or in a file that
# it includes.
#
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/first_product_name.mk \ |
5. 이제 board-specific 디렉토리를 <Company_name> 디렉토리 아래에 만들어줍니다.
이 때 board specific 디렉토리의 이름은 /vendor/<Company_name>/products/<product_name>.mk 파일 안의 PRODUCT_DEVICE 변수의 board_name 과 같아야 합니다.
| mkdir vendor/<Company_name>/<board_name> |
즉, 저의 경우에는 /veondor/marisstella/products/A1234.mk 에
PRODUCT_DEVICE := A1234 로 설정해두었으므로 폴더이름은 A1234 가 되면 됩니다.
6. <board_name>으로 만들어진 폴더 안에 BoardConfig.mk 파일을 생성하고 다음과 같은 내용을 입력합니다.
# These definitions override the defaults in config/config.make for <board_name>
#
# TARGET_NO_BOOTLOADER := false
#
TARGET_USE_GENERIC_AUDIO := true |
7. 만약 System 속성을 변경하고 싶다면 <board_name>으로 생성된 폴더에 system.prop 파일을 생성하면 됩니다.
# system.prop for
# This overrides settings in the products/generic/system.prop file
#
# rild.libpath=/system/lib/libreference-ril.so
# rild.libargs=-d /dev/ttyS0 |
8. 마지막으로 <board_name> 폴더에 Android.mk 파일을 생성합니다. Android.mk 파일에는 최소한 아래의 코드가 꼭 포함이 되어 있어야 합니다.
| # make file for new hardware from
#
LOCAL_PATH := $(call my-dir)
#
# this is here to use the pre-built kernel
ifeq ($(TARGET_PREBUILT_KERNEL),)
TARGET_PREBUILT_KERNEL := $(LOCAL_PATH)/kernel
endif
#
file := $(INSTALLED_KERNEL_TARGET)
ALL_PREBUILT += $(file)
$(file): $(TARGET_PREBUILT_KERNEL) | $(ACP)
$(transform-prebuilt-to-target)
#
# no boot loader, so we don't need any of that stuff..
#
LOCAL_PATH := vendor/<company_name>/<board_name>
#
include $(CLEAR_VARS)
#
# include more board specific stuff here? Such as Audio parameters. |
10. 이제 빌드를 하시면 됩니다. 빌드 방법은 다음과 같습니다.
. build/envsetup.sh
make PRODUCT-product_name-eng |
make PRODUCT-product_name-eng 에서 eng를 user로 변경하시면 user mode 빌드를 할 수 있습니다.
. build/envsetup.sh
make PRODUCT-product_name-user
|
11. 빌드를 실행하면 다음과 같은 에러가 발생합니다.
이런 저런 빌드에러가 생각보다 많이 나서 몇 가지 제가 수정한 부분들만 정리하였습니다.
* No TARGET_CPU_ABI defined by board config
이것은 TARGET_CPU_ABI 변수가 정의되지 않아서 에러가 난 것이므로
vendor/<Comapny_name>/<product_name>/BoardConfig.mk 파일에
TARGET_CPU_ABI := armeabi 을 추가합니다.
* Please rename "vendor/marisstella/A1234/Android.mk" to
"vendor/marisstella/A1234/AndroidBoard.mk"
vendor/<Company_name>/<product_name>/Android.mk 파일을 AndroidBoard.mk 파일로 이름을 변경합니다.
* 'out/target/product/<product_name>/kernel'에서 필요로 하는 타겟 'vendor/marisstella/<product_name/kernel'를 만들 규칙이 없습니다. 멈춤.
make: *** `out/target/product/A1234/kernel'에서 필요로 하는 타겟 `vendor/marisstella/A1234/kernel'를 만들 규칙이 없습니다. 멈춤.
make: *** 끝나지 않은 작업을 기다리고 있습니다.... |
vendor/<Comapny_name>/<product_name>/BoardConfig.mk 파일에
TARGET_NO_BOOTLOADER := true
TARGET_NO_KERNEL := true 을 추가합니다.
*'out/target/product/<product_name>/obj/SHARED_LIBRARIES/libaudioflinger_intermediates/
LINKED/libaudioflinger.so'에서 필요로 하는 타겟 `out/target/product/<product_name>/obj/lib
/libaudio.so'를 만들 규칙이 없습니다. 멈춤.
make: *** `out/target/product/A1234/obj/SHARED_LIBRARIES/libaudioflinger_intermediates/LINKED/libaudioflinger.so'에서 필요로 하는 타겟 `out/target/product/A1234/obj/lib/libaudio.so'를 만들 규칙이 없습니다. 멈춤.
make: *** 끝나지 않은 작업을 기다리고 있습니다.... |
vendor/<Comapny_name>/<product_name>/BoardConfig.mk 파일에
BOARD_USES_GENERIC_AUDIO := true 을 추가합니다.
*make: *** `out/target/product/<product_name>/obj/SHARED_LIBRARIES/libcameraservice_intermediates/
LINKED/libcameraservice.so'에서 필요로 하는 타겟 `out/target/product/<product_name>/obj/lib/
libcamera.so'를 만들 규칙이 없습니다. .
make: ***
make: *** `out/target/product/A1234/obj/SHARED_LIBRARIES/libaudioflinger_intermediates/LINKED/libaudioflinger.so'에서 필요로 하는 타겟 `out/target/product/A1234/obj/lib/libaudio.so'를 만들 규칙이 없습니다. 멈춤.
make: *** 끝나지 않은 작업을 기다리고 있습니다.... |
vendor/<Comapny_name>/<product_name>/BoardConfig.mk 파일에
USE_CAMERA_STUB := true 을 추가합니다.