Конфигурация устройства для сборки Андроида
Описание конфигурации устройства для сборки системы Андроид
Для примера будет использована наша конфигурация для AC100.
Общая концепция
Специфические настройки для сборки системы Андроид под конкретное устройство задаются переменными окружения, но т.к. для многих устройств требуется очень большое кол-во переменных, доп. программ и настроек в дереве сборки системы есть папка device где располагается папка с названием вендора, а в ней папка с названием устройства.
После скачивания всего дерева для сборки системы, процесс сборки инициализируется коммандой
$ source ./build/envsetup.sh
этот скрипт выполняет все файлы с названием vendorsetup.sh в определенных путях, в том числе в дереве папки device, а также прописывает нужные для сборки переменные окружения заданые в нем, а также считанные из файлов vendorsetup.sh
В нашем случае в дереве папок device используется две папки toshiba/paz00-common и toshiba/ac100. Файл vendorsetup.sh содержится только в папке ac100 и задает название конфигурации нашего устройства и имеет следущее содержимое:
add_lunch_combo full_ac100-userdebug add_lunch_combo cm_ac100-userdebug
Эти значения нужно использовать для определенной сборки системы под наше устройство. Откуда формируются эти названия? Это будет описано дальше.
Чтобы выбрать для системы сборки определенную конфигурацию которую будем собирать выполняем следующую комманду:
$ lunch cm_ac100-userdebug
В нашей конфигурации папка paz00-common служит для общих настроек и приложений, обычно статичных и редко менямых, а папка ac100 для настроек под определенную модель устройства.
Внутренняя организация папки с конфигурацией устройства
Android.mk
Сборка системы Андроид начинается с инициализации файлов с конигурацией процесса самой сборки, аналог Makefile в нашем случае файл Android.mk. Этот файл обычно является исполняется первым в процессе компиляции Андроида, а также является исполняется самым первым при сборке конфигурации под определенное устройство. В нем задаются правила для сборки текущей папки и нужные для компиляции переменные.
Рассмотрим подробнее файл Android.mk из папки paz00-common
ifeq ($(TARGET_BOOTLOADER_BOARD_NAME), paz00) include $(all-subdir-makefiles) endif
смысл следующий что если конфигурация под конкретное устройство содержит переменную TARGET_BOOTLOADER_BOARD_NAME со значением paz00 используются все подкаталоги внутри нее.
Файл Android.mk из папки ac100 имеет следующее содержимое:
LOCAL_PATH := $(call my-dir) include $(call all-makefiles-under,$(LOCAL_PATH))
Задает значение переменной LOCAL_PATH на свой путь и указывает компилятору, что нужно использовать все файлы конфигурации сборки с расширением .mk внутри свого каталога.
BoardConfig.mk
Основной файл конфигурации устройства. В нем задаются основные переменные конфигурации, определяющие ключевые моменты компиляции, настройки подсистем для оборудования и тп.
Переменные которые можно использовать в нем можно найти в файлах Android.mk внутри разных частей системы Андроид.
Ниже рассмотрим некторые примеры:
Настройки определяющие архитектуру, процессор и тп
TARGET_BOARD_PLATFORM := tegra # Product set overrides result image name #TARGET_PRODUCT := tegra TARGET_BOARD_INFO_FILE := device/toshiba/paz00-common/board-info.txt TARGET_CPU_ABI := armeabi-v7a TARGET_CPU_ABI2 := armeabi TARGET_ARCH_VARIANT := armv7-a TARGET_ARCH_VARIANT_CPU := cortex-a9 TARGET_ARCH_VARIANT_FPU := vfpv3-d16 TARGET_CPU_SMP := true TARGET_NO_BOOTLOADER := true TARGET_BOOTLOADER_BOARD_NAME := paz00 ARCH_ARM_HAVE_TLS_REGISTER := true
Настройки используемого Linux kernel
# Kernel TARGET_KERNEL_SOURCE := kernel/toshiba/paz00 TARGET_KERNEL_CONFIG := paz00_android_defconfig
тут задается папка в которой располагаются исходники ядра и конфиг который надо использовать
Настройки связанные с файловой системой, партициями и образами:
# Partitions BOARD_HAS_LARGE_FILESYSTEM := true TARGET_USERIMAGES_USE_EXT4 := true BOARD_BOOTIMAGE_PARTITION_SIZE := 8388608 BOARD_RECOVERYIMAGE_PARTITION_SIZE := 5242880 BOARD_SYSTEMIMAGE_PARTITION_SIZE := 314572800 BOARD_USERDATAIMAGE_PARTITION_SIZE := 1294991360 BOARD_FLASH_BLOCK_SIZE := 131072 # Disable spase in image creation, otherwise image not mountble TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true # Setting this to avoid boot locks on the system from using the "misc" partition. BOARD_HAS_NO_MISC_PARTITION := true # dont build recovery #TARGET_NO_RECOVERY := true # Indicate that the board has an Internal SD Card #BOARD_HAS_SDCARD_INTERNAL := true BOARD_DATA_DEVICE := /dev/block/mmcblk0p6 BOARD_DATA_FILESYSTEM := ext4 BOARD_CACHE_DEVICE := /dev/block/mmcblk0p4 BOARD_CACHE_FILESYSTEM := ext4 BOARD_SYSTEM_DEVICE := /dev/block/mmcblk0p3 BOARD_SYSTEM_FILESYSTEM := ext4
Настройки вайфай и блютус подсистем:
# Wifi related defines BOARD_WPA_SUPPLICANT_DRIVER := NL80211 WPA_SUPPLICANT_VERSION := VER_0_8_X BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_wl12xx #BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd BOARD_HOSTAPD_DRIVER := NL80211 BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_wl12xx #BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd BOARD_WLAN_DEVICE := wlan0 WIFI_DRIVER_MODULE_NAME := rt2800usb WIFI_DRIVER_MODULE_PATH := /system/lib/modules/rt2800usb.ko # Bluetooth BOARD_HAVE_BLUETOOTH := true #BOARD_HAVE_BLUETOOTH_BCM := true #BOARD_HAVE_BLUETOOTH_CSR := true
Настройки специфические для CWM Recovery:
# CWM Recovery settings # custom recovery ui BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/toshiba/paz00-common/recovery/recovery_ui.c BOARD_HAS_NO_SELECT_BUTTON := true
И различные дополнительные настройки:
Исключение документации из сборки, для ускорения процесса компиляции нового образа
# skip doc from building BOARD_SKIP_ANDROID_DOC_BUILD := true
и тп
# Vold settings BOARD_VOLD_MAX_PARTITIONS := 11 BOARD_NO_ALLOW_DEQUEUE_CURRENT_BUFFER := true # Use nicer font rendering BOARD_USE_SKIA_LCDTEXT := true # kbd libsensor from android-x86 BOARD_USES_KBDSENSOR := true BOARD_USES_KBDSENSOR_ROTKEY2 := true # Add screencap tool for making screenshots from console BOARD_USE_SCREENCAP := true BOARD_USES_SECURE_SERVICES := true
cm.mk, device.mk, ac100.mk, full_ac100.mk
Файлы специфической конфигурации устройства, элементов которые будут включены в сборку, значений проперти, прав и тп.
Тут располагаются значения определяющие название имиджа, информацию об утсройстве и тп:
PRODUCT_NAME := cm_ac100 PRODUCT_RELEASE_NAME := ac100 PRODUCT_DEVICE := ac100 PRODUCT_BRAND := toshiba PRODUCT_MODEL := ac100 PRODUCT_MANUFACTURER := toshiba
Наборы программ и настроек которые будут включены в сборку:
$(call inherit-product, device/toshiba/ac100/full_ac100.mk) # Inherit some common CM stuff. $(call inherit-product, vendor/cm/config/common_full_phone.mk) # Inherit some common CM stuff. $(call inherit-product, vendor/cm/config/gsm.mk) $(call inherit-product-if-exists, vendor/toshiba/paz00/device-vendor.mk) $(call inherit-product, frameworks/base/build/phone-hdpi-512-dalvik-heap.mk) # Inherit from those products. Most specific first. $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk) $(call inherit-product, device/toshiba/ac100/ac100.mk) $(call inherit-product-if-exists, vendor/toshiba/paz00/paz00-vendor.mk)
у нас выбор компонентов разнесен на 3 файла: cm.mk, full_ac100.mk и ac100.mk так можно варьировать компоненты собираемые в конечном образе
Системные файлы заливаемые в образ:
PRODUCT_COPY_FILES += \ device/toshiba/paz00-common/prebuild/init.paz00.rc:root/init.paz00.rc \ device/toshiba/paz00-common/prebuild/init.nv_dev_board.usb.rc:root/init.nv_dev_board.usb.rc \ device/toshiba/paz00-common/prebuild/init.local.rc:system/etc/init.local.rc \ device/toshiba/paz00-common/prebuild/ueventd.paz00.rc:root/ueventd.paz00.rc \ device/toshiba/paz00-common/prebuild/tiny_hw.xml:system/etc/sound/ac100.xml \ device/toshiba/paz00-common/prebuild/media_profiles.xml:system/etc/media_profiles.xml \ device/toshiba/paz00-common/prebuild/excluded-input-devices.xml:system/etc/excluded-input-devices.xml \ device/toshiba/paz00-common/prebuild/egalax_i2c.idc:system/usr/idc/egalax_i2c.idc \ device/toshiba/paz00-common/prebuild/egalax_ts.idc:system/usr/idc/egalax_ts.idc \ device/toshiba/paz00-common/prebuild/01NVOptimalization:system/etc/init.d/01NVOptimalization \ device/toshiba/paz00-common/prebuild/02PmDebug:system/etc/init.d/02PmDebug \ device/toshiba/paz00-common/prebuild/03LedBehaviour:system/etc/init.d/03LedBehaviour
синтаксис следующий <файл в системе сборки>:<файл в конечном образе>
Компоненты системы Андроид которые надо включить в образ:
PRODUCT_PACKAGES += \ librs_jni \ liba2dp \ lights.tegra \ com.android.future.usb.accessory \ camera.tegra \ libpkip \ libaudioutils \ tinyplay \ tinycap \ tinymix \ audio.primary.tegra \ audio.a2dp.default \ FolioParts \ wmiconfig
нужные названия компонентов или программ можно найти в их файлах сборкеи Android.mk в переменной LOCAL_MODULE Тут включаются апкашки которые не входят в базовые наборы и либы которые нам нужны, также компоненты из external и тп.
Создаваемые новые значения проперти:
PRODUCT_PROPERTY_OVERRIDES := \ ro.opengles.version=131072 \ wifi.interface=wlan0 \ keyguard.no_require_sim=true \ ro.sf.lcd_density=120
Изменяемые существующие значения проперти:
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ ro.secure=0 \ persist.sys.strictmode.visual=0
Файлы с правами:
PRODUCT_COPY_FILES += \ frameworks/base/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \ frameworks/base/data/etc/android.hardware.camera.front.xml:system/etc/permissions/android.hardware.camera.front.xml \ frameworks/base/data/etc/android.hardware.camera.xml:system/etc/permissions/android.hardware.camera.xml \ frameworks/base/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.xml \ frameworks/base/data/etc/android.hardware.sensor.accelerometer.xml:system/etc/permissions/android.hardware.sensor.accelerometer.xml \ frameworks/base/data/etc/android.hardware.sensor.light.xml:system/etc/permissions/android.hardware.sensor.light.xml \ frameworks/base/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \ frameworks/base/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \ frameworks/base/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml \ frameworks/base/data/etc/android.hardware.usb.host.xml:system/etc/permissions/android.hardware.usb.host.xml \ frameworks/base/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml \ frameworks/base/data/etc/android.software.sip.voip.xml:system/etc/permissions/android.software.sip.voip.xml \ frameworks/base/data/etc/tablet_core_hardware.xml:system/etc/permissions/tablet_core_hardware.xml
Настройки определяющие разрешение экрана устройства:
# Resolution settings PRODUCT_CHARACTERISTICS := tablet PRODUCT_AAPT_CONFIG := xlarge mdpi PRODUCT_AAPT_PREF_CONFIG := mdpi PRODUCT_LOCALES += mdpi
в нашем случае выбирается размер xlarge как специфический для таблетов и тп и разрешение mdpi как соотвествующее нашему разрешению 1024x600
Папка в которой хранятся значение оверлеев, файлов конфигурации разных компонентов системы:
DEVICE_PACKAGE_OVERLAYS := \ device/toshiba/paz00-common/overlay
подробности по файлам конфигураций расписаны в отдельной статье Overlays
system.prop
Это файл в котором можно просто добавить проперти которые будут добавлены в систему