Ну что же вот мы и подошли к самому интересному! Здесь я как раз и постараюсь ответить на многие вопросы начинающих.
5.1. Сбор информации об устройстве.
И так, первым делом мы должны узнать технические характеристики того устройства, для кторого будем делать прошивку.
Это можно сделать найдя описание в интернете, благо сейчас есть информация практически для любого устройства. Можно заглянуть в программы-тесты, например в тот же Antutu.
Вот например что написано о моем Newman N2:
Уменьшено на 69%
720 x 1280 (133.74 КБ)
|
Нет, я не наврал, это не SGS3, просто стоит маскировка под него
Собственно то что нам нужно - это модель процессора(ЦП, CPU), разрешение экрана и модель видеоускорителя(ГП, GPU).
Далее определяемся с архитектурой ядер процессора. Собственно, она нам уже известна - в данном случае это ARM v7. Но этого мало, надо определить какая именно: Cortex A7,8,9 или A15.
Для этого гуглим название архитектуры, зная чиповку. Чип(сокет) - это те самые
MTK6589, Exynos 4412, Snapdragon S4 Pro и пр. знаменитые представители своих популярных ныне семейств.
Могу порекомендовать
ЭТОТ источник, а также
ЭТОТ.
В результате узнаем, что мой чип
Exynos 4412 построен на архитектуре
ARM v7 Cortex A9. А ваш?)
Также о чипе и архитектуре процессора, написано в файле
/proc/cpuinfo (для его просмотра необходимы рут-права и Root Explorer)
Самое основное мы узнали. Далее пойдут спецификации.
Узнаем что у нас с разделами. Какого формата, размера и куда монтируются.
Подключаем устройство к компьютеру и в терминале вводим команду:
Код
adb shell mount
мы получим список точек монтирования разделов, а также их файловые системы. По сути дела, нам необходимы только разделы Data, System и Cache.
Далее узнаем размеры разделов:
Код
adb shell
df
В принципе это пока что все, нам этого хватит для начала. Дальнейшую спицифику: WiFi, Bluetooth и др. модули вы можете разобрать самомстоятельно, гугл в помощь как говорится)) Да и вообще все специфику знать необязательно, т.к. не на все есть исходники и вам вероятно просто можно будет взять необходимые части из стоковой прошивки.
5.2. Создание файлов конфигурации(.mk)
5.2.1. Создание папки девайса (device folder)
Сейчас будем создавать непосредственно конфигурацию для сборки. Если вы имеете готовые шаблоны или чьи то наработки - то вам повезло, но я в первую очередь расписываю это для тех, кто в первый раз сталкивается с этим и делает это с нуля не имея образца конфигов для такого же устройства. Что можно посоветовать - помоги сами себе поищите наработки на гитах, например зайдите в гугл и попробуйте повбивать запросы типа:
<название вашего устройста> git, <название вашего устройста> github, <название чипа процессора> github. Вообще советую пользоваться именно
Github.com, оттуда проще скачать исходники - просто заходите в нужный репозиторий и нажимате кнопку: "
Download ZIP".
Можно также клонировать понравившийся гит:
Код
git clone git://github.com/нужный_репозиторий.git -b <название_ветки>
Это касается примеров. Не ленитесь, поищите и посмотрите как можно больше примеров. Заметите общие особенности.
Старайтесь выбирать как можно более близкий по параметрам девайс и использовать его конфиг. Именно так я и поступил со своим Newman N2 - я взял за основу конфиг от Samsung Galaxy S3.
Итак, поехали создавать структуру.
Зайдите в папку с исходниками. В папке device создайте папку с именем производителя устройства (в моем случае samsung), далее в созданной папке создайте папку с именем модели устройства (в моем случае i9300).
У меня получилось так:
CM10/device/samsung/i9300
Далее создадим следующие файлы в последнем каталоге (в моем случае в CM10/device/samsung/i9300):
Android.mk, AndroidProducts.mk, BoardConfig.mk, Конфиг_файл_продукта.mk, system.prop. Это минимальный набор.
Сейчас на своем примере буду рассказывать что да как заполнять. По случаю можете глянуть мой гит с конфигом, он не претендует на звание образцового, но тем не менее пойдет для понимания общей картины:
https://github.com/Scorpio92/android_device_exynos4Brothers
Создаем
Android.mk, заполняем:
Код
LOCAL_PATH := $(call my-dir)
ifeq ($(TARGET_DEVICE),<название_модели_устройства>)
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
У меня так:
Код
LOCAL_PATH := $(call my-dir)
ifeq ($(TARGET_DEVICE),i9300)
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
Создаем
AndroidProducts.mk, заполняем:
Код
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/<Конфиг_файл_продукта>.mk
У меня так:
Код
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/newman.mk
Создаем
BoardConfig.mk, вот тут остановимся подробнее,
это самый важный файл!. Помните о той информации которую мы собрали в пункте 5.1? Сейчас она нам пригодится. Заполняем:
Код
TARGET_CPU_ABI :=
TARGET_CPU_ABI2 :=
TARGET_ARCH :=
TARGET_ARCH_VARIANT :=
TARGET_ARCH_VARIANT_CPU :=
TARGET_BOARD_PLATFORM :=
TARGET_SOC :=
Как минимум должно быть это. Опять же повторюсь, все давно сделано за вас не знаете как правильно написать - и не надо! загуглите по названию чипа конфиг на гите, там все есть, для любого чипа, любой платформы.
У меня так:
Код
TARGET_CPU_ABI := armeabi-v7a
TARGET_CPU_ABI2 := armeabi
TARGET_ARCH := arm
TARGET_ARCH_VARIANT := armv7-a-neon
TARGET_ARCH_VARIANT_CPU := cortex-a9
TARGET_BOARD_PLATFORM := exynos4
TARGET_SOC := exynos4x12
armeabi-v7a, arm, cortex-a9, exynos4 - вспоминаете эти строки?) Ищите конфиги по ним, все аналогично будет и у вас!
Обязательно не забываем про спецификации для каждого типа процессоров. Для них есть свои классы - их указывать
обязательно! Опять же ищите примеры конфигураций процессоров. Обратите внимание на специфичные инструкции для своего процессора, такие как например NEON. Вот у меня например такие спецификации:
Код
TARGET_CPU_SMP := true
ARCH_ARM_HAVE_NEON := true
ARCH_ARM_HAVE_TLS_REGISTER := true
TARGET_GLOBAL_CFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp
TARGET_GLOBAL_CPPFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp
EXYNOS4X12_ENHANCEMENTS := true
EXYNOS4_ENHANCEMENTS := true
ifdef EXYNOS4X12_ENHANCEMENTS
COMMON_GLOBAL_CFLAGS += -DEXYNOS4_ENHANCEMENTS
COMMON_GLOBAL_CFLAGS += -DEXYNOS4X12_ENHANCEMENTS
COMMON_GLOBAL_CFLAGS += -DDISABLE_HW_ID_MATCH_CHECK
endif
Собственно то, что мы сейчас разобрали это обязательные вещи, при правильно указании которых прошивка уже загрузится.
Едем дальше. Помните мы узнавали как у нас с памятью (в см. с памятью в устройстве)? Вот сейчас используем эти знания:
Код
BOARD_NAND_PAGE_SIZE := 4096
BOARD_NAND_SPARE_SIZE := 128
BOARD_FLASH_BLOCK_SIZE := 4096
BOARD_SYSTEMIMAGE_PARTITION_SIZE := размер_раздела_в_мб*1024*1024
BOARD_USERDATAIMAGE_PARTITION_SIZE := размер_раздела_в_мб*1024*1024
TARGET_USERIMAGES_USE_EXT4 := true
Первые три строчки практически везде одинаковые, последняя - смотря какая файловая система. Вот как у меня:
Код
BOARD_NAND_PAGE_SIZE := 4096
BOARD_NAND_SPARE_SIZE := 128
BOARD_FLASH_BLOCK_SIZE := 4096
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 515899392
BOARD_USERDATAIMAGE_PARTITION_SIZE := 1198522368
TARGET_USERIMAGES_USE_EXT4 := true
Можно еще указать размеры boot.img(бута) и recovery.img(рекавери), но нам это пока не надо, упрощаем себе задачу, возиться пока с ними не будем. Наша цель собрать правильный system.img - собственно сам андроид.
Дальше разберемся с флагами:
Код
TARGET_NO_BOOTLOADER := true
TARGET_NO_RADIOIMAGE := true
TARGET_NO_RECOVERY := true
Это думаю понятно, нам не нужны эти образы, в данном случае пока что не нужны.
Т.к. у нас нет никаких исходников(предположим), у меня вот так например, то соотвтественно будем портировать, а не собирать из исходников нужные модули. Поэтому делаем как минимум так:
Код
BOARD_USES_GENERIC_AUDIO := true
USE_CAMERA_STUB := true
Т.е. говорим что мы не имеем исходников аудио и камеры.
Далее добавим еще несколько флагов.
Код
DISABLE_DEXPREOPT := true
- Включает деодекс по-умолчанию
Код
BOARD_USE_LEGACY_TOUCHSCREEN := true
- пригодится для портирования драйвера тач-скрина
Тааакс....ну пока это все. Что бы просто запустить сборку этого хватит, но естественно кое-что работать не будет. В последствии я еще раз вернусь к BoardConfig, а сейчас едем дальше.
Создаем Конфиг_файл_продукта.mk.
Ну для начала придумайте ему имя. У меня он называется newman.mk. Придумали? Тогда поехали заполнять(заполнять желательно в такой же последовательности):
Код
LOCAL_PATH := device/ папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства
Это переменная для сокращения прописываемоего пути. Полезная вещь.
У меня такой путь:
Код
LOCAL_PATH := device/samsung/i9300
Далее прописываем разрешение экрана под которое будут собираться приложения и фреймворк:
Код
PRODUCT_AAPT_CONFIG :=ldpi mdpi hdpi xhdpi
- практически все возможные разрешения от мала до велика...
Код
PRODUCT_AAPT_PREF_CONFIG := <разрешение экрана вашего устройтсва>
Тут если сомниваетесь, то отталкивайтесь от показателя плотности точек(dpi). Помните циферку dpi из Antutu? Теперь гляньте в табл.1
ТУТ и вам станет понятно что писать.
Мое разрешение экрана: 1280х720, HD, плотность(dpi):320, следовательно:
Код
PRODUCT_AAPT_PREF_CONFIG := xhdpi
Далее указываем папочку для переопределения исходных конфигураций(overlay):
Код
DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay
Заодно и создайте ее сразу. Поговорим о ней сразу после обсуждения текущего конфига.
Далее укажем привязку, время и дату сборки:
Код
PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0
Далее необходимо взять со стока ядро(zImage), не путать с boot.img!!! Как разобрать boot.img на ядро и рамдиск, ищите на форуме, тем много, все написано. Указываем где лежит наше ядро:
Код
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/zImage:kernel
Т.е. положим его рядом с конфигами (device/ папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства/zImage).
Далее пропишем пакеты которые нужно будет собрать(мимнимальный набор, всякие там живые обои и пр. если захотите добавьте сами):
Код
PRODUCT_PACKAGES += \
com.android.future.usb.accessory \
libnetcmdiface \
Stk
static_busybox \
make_ext4fs \
setup_fs
Далее добавляем хардварные файлы, очень важно, список их можно уточнить, все зависит от того какое железо у вас в девайсе (датчики и пр.):
Код
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.audio.low_latency.xml:system/etc/permissions/android.hardware.audio.low_latency.xml \
frameworks/native/data/etc/android.hardware.camera.autofocus.xml:system/etc/permissions/android.hardware.camera.autofocus.xml \
frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
frameworks/native/data/etc/android.hardware.camera.front.xml:system/etc/permissions/android.hardware.camera.front.xml \
frameworks/native/data/etc/android.hardware.camera.xml:system/etc/permissions/android.hardware.camera.xml \
frameworks/native/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.xml \
frameworks/native/data/etc/android.hardware.location.xml:system/etc/permissions/android.hardware.location.xml \
frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:system/etc/permissions/android.hardware.sensor.accelerometer.xml \
frameworks/native/data/etc/android.hardware.sensor.compass.xml:system/etc/permissions/android.hardware.sensor.compass.xml \
frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:system/etc/permissions/android.hardware.sensor.gyroscope.xml \
frameworks/native/data/etc/android.hardware.sensor.light.xml:system/etc/permissions/android.hardware.sensor.light.xml \
frameworks/native/data/etc/android.hardware.sensor.proximity.xml:system/etc/permissions/android.hardware.sensor.proximity.xml \
frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \
frameworks/native/data/etc/android.hardware.touchscreen.multitouch.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.xml \
frameworks/native/data/etc/android.hardware.touchscreen.xml:system/etc/permissions/android.hardware.touchscreen.xml \
frameworks/native/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml \
frameworks/native/data/etc/android.hardware.usb.host.xml:system/etc/permissions/android.hardware.usb.host.xml \
frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml \
frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \
frameworks/native/data/etc/android.software.sip.voip.xml:system/etc/permissions/android.software.sip.voip.xml \
frameworks/native/data/etc/android.software.sip.xml:system/etc/permissions/android.software.sip.xml \
frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \
frameworks/native/data/etc/android.hardware.telephony.gsm.xml:system/etc/permissions/android.hardware.telephony.gsm.xml
Далее вызываем проприетарный конфиг(копирование файлов со стока, на которых нет исходников):
Код
$(call inherit-product-if-exists, vendor/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства/название_конфига_какое_душе_угодно.mk)
У меня это:
Код
$(call inherit-product-if-exists, vendor/samsung/i9300/newman.mk)
Пока что просто создайте такую структуру. О вендорной папке с проприетариями мы поговорим в пункте 5.2.2. А сейчас дальше.
Далее база которая собирается по умолчанию, основа андроида + языковые пакеты и gps конфиг:
Код
$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)
$(call inherit-product, device/common/gps/gps_us_supl.mk)
Ну и наконец последний штрих - указываем реквизиты))
Код
PRODUCT_NAME := имя_Конфига_файла_продукта
PRODUCT_DEVICE := имя_папки_с_именем_модели_устройства
PRODUCT_BRAND := имя_папки_с_именем_производителя_устройства
PRODUCT_MANUFACTURER := имя_папки_с_именем_производителя_устройства
PRODUCT_MODEL := ну_а_тут_модельку_устройства_пишем
Например, как у меня:
Код
PRODUCT_NAME := newman
PRODUCT_DEVICE := i9300
PRODUCT_BRAND := samsung
PRODUCT_MANUFACTURER := samsung
PRODUCT_MODEL := GT-I9300
Создаем system.prop
Этот файлик с некоторыми конфигами, которые затем пойдут в файл build.prop. Наверняка про такой слышали))
Для начала возьмем со стока только самое необходимое, не надо сразу пихать туда всякие твики и пр.!
Первым делом добавим строки инициализации радиомодуля(ищем в своем build.prop со стока аналогичное):
Код
rild.libpath=/system/lib/lib***ril***.so
rild.libargs=-d /dev/***
Далее прописываем параметры Dalvik-машины:
Код
dalvik.vm.execution-mode=int:jit
- включаем JIT
Далее прописываем все те же параметры dalvik.vm.*** что и на стоке, от себя ничего придумывать не надо!
Прописываем параметр плотности экрана:
Код
ro.sf.lcd_density=
Указываем интерфейс Wi Fi:
Код
wifi.interface=wlan0
Параметры USB:
Код
persist.sys.usb.config=mass_storage,adb
Параметр OpenGL, обязательно!
Код
ro.opengles.version=131072
Ну и параметры добавляющие производительность:
Код
debug.sf.hw=1
video.accelerate.hw=1
debug.performance.tuning=1
debug.composition.type=gpu
debug.gralloc.vsync=0
hwui.render_dirty_regions=false
media.stagefright.enable-player=true
media.stagefright.enable-meta=false
media.stagefright.enable-scan=false
media.stagefright.enable-http=true
media.stagefright.enable-aac=true
media.stagefright.enable-qcp=true
Внимательно посмторите остальные параметры со стока, также это могут быть парметры вида:
Код
ro.product.camera=
ro.bt.bdaddr_path=
persist.rild.nitz***=
mobiledata.interfaces=
ro.ril.baseband=
С конфигом устройства в принципе все. Можно добавить сборку нужных пакетов по вкусу + дописать вызов нужных .mk...Но пока я думаю оно вам не надо)))
Папка overlay
Песня отдельная конечно. Это папка для переопределения исходных параметров. Обычно в ней меняются пути монтирования карты памяти, назввания сетевых интерфейсов и просто корректируются такие дефолтные параметры как яркость, звук и пр. Сейчас разберемся с этим.
Первым делом необходимо взять со стока файл
framework-res.apk и декомпилировать его. Как?
ТУТ написано.
Далее в папке overlay создаем структуру:
frameworks/base/core/res/res/values
У меня к примеру вот так:
device/samsung/i9300/overlay/frameworks/base/core/res/res/values
Там создаем файл
config.xml со след. содержимым:
Код
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
Собственно пространство между тэгом
resources мы сейчас будем с вами заполнять, используя значения со стока.
Далее шагаем по пути: <папка с разобранным фреймом>/res/values и открываем arrays.xml.
Открываем мой оверлейный
config.xml и просто аналогично заменяем мои значения в конфигах на свои из стокового arrays.xml.
Например. Нам нужно записать в оверлейный конфиг(переопределить) параметр автояркости(если у вашего устройства есть датчик освещения конечно):
Код
<integer-array name="config_autoBrightnessLevels">
<item>...</item>
...
<item>...</item>
</integer-array>
Копируем название параметра -
config_autoBrightnessLevels и ищем его в стоковом arrays.xml. У меня в стоке прописан массив таких вот значений:
Код
<item>3</item>
<item>150</item>
<item>3000</item>
Соответсвенно в моем оверлейном конфиге появится вот такое переопределения параметра автояркости:
Код
<integer-array name="config_autoBrightnessLevels">
<item>3</item>
<item>150</item>
<item>3000</item>
</integer-array>
Ну я думаю дальше понятно, аналогично поступаем с остальными параметрами. Какие параметры менять - смотрим в моем примере, а также можно покопаться в сторонних, но я думаю моего хватит, у меня все самое основное.
Дальше будем разбираться с монтированием карт(ы) памяти.
Тут можно сделать проще: перенести файл
storage_list.xml из <папка с разобранным фреймом>/res/xml/ в .../overlay/frameworks/base/core/res/res/xml/
А теперь давайте вернемся к BoardConfig.mk. Заметьте возвращаться придется много раз, больше чем Арнольд Шварценеггер)))
Добавим следующее:
Код
TARGET_USE_CUSTOM_LUN_FILE_PATH :=
Это у нас параметр драйвера карты памяти кот. нах в ядре. Путь у всех схожий.
Либо
Код
TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/class/android_usb/android0/f_mass_storage/lun/file"
- в старых девайсах такое обычно встречается
Либо
Код
TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/devices/platform/бла-бла-бла-usbgadget/gadget/lun%d/file"
- в новых девайсах
Глянуть это все можно прям с устройтсва, при наличии root-прав и Root Explorer
,а.
У меня так:
Код
TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/devices/platform/s3c-usbgadget/gadget/lun%d/file"
Еще, если у вас несколько карт памяти, допусти внутренняя и внешняя, то потребуется еще и этот параметр:
Код
BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true
Ну я думаю пока с конфигом девайса и оверлеем достаточно. Это база, дальше смотрите примеры сами и добавляйте что вам по душе. Можно также переопределить настройки пакетов.
5.2.2. Создание папки вендора
Предлагаю ознакомится с мои примером на гите:
https://github.com/Scorpio92/android_vendor_exynos4Brothers
Тут у нас будут лежать проприетарные файлы, т.е. те элементы прошивки, на которые нет исходников. Это могут быть бинарники, библиотеки, конфиги(*.conf, *.xml), скрипты(*.sh).
В предыдущем пункте мы уже создали необходимую структуру:
vendor/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства
У меня это выглядит след. образом:
vendor/samsung/i9300
Необходим еще .mk файл в котором будет прописано копирование проприетариев и который будет вызываться из
device/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства/Конфиг_файл_продукта.mk
Сперва создайте файл конфига, у меня это newman.mk.
Далее для удобства, в том же каталоге создайте папку
system, а в ней папки:
app, bin, etc, lib, usr, vendor, xbin.
Теперь нам необходимо эти папки наполнить, т.е. взять из стоковой прошивки необходимые файлы и положить их в соответсвующие папки в вендорную папке. Как это сделать и что брать?
Распакуйте system.img со стока либо возьмите прошивку для рекавери формата *.zip и распакуйте ее.
Для начала пара советов:
*в качестве донора - оф. прошивки с которой будете тащить проприетарии, берите самую последнюю оф. прошивку.
*если ваша последняя оф. прошивка не выше android 2.3, то без исходников вам не удастся нормально запустить android 4.x, если же исходников на ваш девайс вообще не существует в свободном доступе, то ищите максимально похожий на ваш девайс и берите что нужно с него.
*не пытайтесь сразу перепрыгнуть несколько версий андроида и собрать самую последнюю версию. Т.е. если ваша последняя оф. прошивка базируется на андроиде 4.1, то не пытайтесь сразу собрать 4.2 или 4.3, у вас ничего не получится, а если даже и повезет, то работать будет очень криво! Возьмитесь за прошивку, которая будет основываться на той же версии андроида что и ваша оф. прошивка. Например возьмите и соберите CyanogenMod10.
*Добейтесь максимальной совместимости и выясните базу(спсиок проприетариев) необходимую для дальнейшего продвижения.
*для выяснения зависимостей между библиотеками и бинарниками очень поможет программа IDA. Скачать можно ТУТ.
*ну и конечно глядите примеры на гитах, пробуйте, экспериментируйте!
А теперь поговорим о самих проприетариях, какие файлы со стока надо тащить?
Нам понадобятся проприетарии графики, vold, тачскрина, key map, звука, камеры, кодеков, bluetooth, wi-fi, ril, gps, сенсоров. Самое первое что нужно перенести это: графика, vold, тачскрин, key map.
Поговорим о них по-отдельности.
Графика
Это в первую очередь драйвера видеоускорителя, а также библиотеки HAL(system/lib/hw): copybit(для андроид 2.3 и ниже), hwcomposer, gralloc.
С HAL в принципе все понятно, для всех устройств их список выглядит примерно так(на своем примере):
Код
system/lib/hw/hwcomposer.smdk4x12.so
system/lib/hw/gralloc.smdk4x12.so
Где
smdk4x12, как вы поняли - платформа на которой базируется ваше устройство.
С драйверами видеоускорителя чуть сложнее, в первую очередь это библиотеки OpenGL и конфиг egl.cfg, а также нек. специфичные библиотеки(приведу с возможными варинтами):
Код
system/lib/egl/egl.cfg
system/lib/libEGL***.so
system/lib/libGLES***.so
system/lib/libgsl.so
system/lib/libsc***.so
system/lib/libOpenVG.so
system/lib/libUMP.so
system/lib/lib<специфика, например Mali, Adreno и т.д.>.so
:system/lib/egl/libq3dtools***.so
system/lib/egl/eglsubAndroid.so
system/etc/firmware/yamato***.fw
system/etc/***_config.txt
Например в моем случае(Android 4.1, Mali-400MP) для работы графики я тащил:
Код
system/lib/hw/hwcomposer.smdk4x12.so
system/lib/hw/gralloc.smdk4x12.so
system/lib/egl/egl.cfg
system/lib/egl/libEGL_mali.so
system/lib/egl/libGLESv1_CM_mali.so
system/lib/egl/libGLESv2_mali.so
system/lib/libEGL.so
system/lib/libGLES_trace.so
system/lib/libGLESv1_CM.so
system/lib/libGLESv2.so
system/lib/libMali.so
system/lib/libUMP.so
system/lib/libion.so
system/lib/libion2.so
Vold
Этот сервис отвечает за монтирование КП. Частично мы с ним уже разобрались: прописали параметры lun-файла в BoardConfig, а также прописали точки монтирования в overlay.
Осталось только добавить файл из стока:
system/etc/vold.fstab
Все, теперь наша(и) КП должны монтироваться!
Тачскрин
Помните куржочек-курсор на экране в CyanogenMod? Причина по которой он появляется - отсутствие драйвера тачскрина. Портировать его просто, необходимо взять из стока:
Код
/system/usr/idc/<все файлы *.idc, кроме qwerty и qwerty2>.idc
Key map
Чтобы правильно распознавались действия по нажатию на кнокпи девайса, необходима карта как физических так и виртуальных кнопок девайса, она есть в:
Код
system/usr/keylayout/<AVRCP, Generic, все кроме qwerty>.kl
Звук
Обычно это одна-две библиотеки(в Андроид ICS и выше)
Код
system/lib/hw/audio.primary.<platform>.so
system/lib/hw/audio_policy.<platform>.so
В Андроид 2.3 и ниже это:
Код
system/lib/libaudio.so
Камера
Аналогично как и со звуком. В Андроид ICS и выше:
Код
system/lib/hw/camera.<platform>.so
В Андроид 2.3 и ниже это:
Код
system/lib/libcamera.so
В некоторых случаях может понадобиться библиотека:
Код
system/lib/libcamera_client.so
Также может потребоваться специфика.
Ее советую выяснять с помощью программы IDA.
Кодеки
Следующий элемент который тесно связан с камерой. Нет кодеков - не будет работать видеозапись в камере и не будет проигрываться видео. Обычно используются OpenMax кодеки.
Код
system/lib/omx/*.so
или
Код
system/lib/lib***OMX***.so
Также иногда производители специально патчат стандартную библиотеку андроид -
libstagefright.so. Возможно потребуется перенос со стока всех библиотек libstagefright***.so, т.к. они тоже могут быть пропатчены.
Bluetooth
Для работы необходима связка бинарников, библиотек, конфигов и возможно скриптов инициализации.
Обычно сам радио модуль это файл *.hcd, который располагается либо в system/bin либо в system/etc/bt. Там же может находится скрипт инициализации, но чаще всего он скрыт в рамдиске(ramdisk).
Еще может понадобиться:
Код
system/etc/bluetooth/main.conf
Wi-Fi
Здесь ситуация практически однотипная:
Код
system/bin/wpa_supplicant
И
Код
system/etc/wifi/*.bin, cal, conf, txt
Либо
Код
system/etc/wl/*.bin, cal, conf, txt
Также вероятно потребуется библиотека
libhardware_legacy.so.
RIL
Это библиотеки отвечающие за радиомодуль. Если все ril библиотеки на месте значит будет работать мобильная сеть и интернет.
Вот здесь как никогда пригодится IDA, бывает зависимостей куча, а бывает нужно всего пара библиотек:
Код
system/lib/libril.so
system/lib/libreference-ril.so
Обязательно бинарник rild:
Код
system/bin/rild
+ возможно еще какой нибудь бинарник, ищите по "gsm" в system/bin.
GPS
Обычно в ICS и выше, "железная" часть как всегда перенесена в HAL, поэтому для работы GPS потребуется всего-лишь:
Код
system/lib/hw/gps.<platform>.so
В Андроид 2.3 и ниже:
Код
system/lib/libgps.so
system/lib/libloc***.so
В любом случае пригодятся конфиги:
Код
system/etc/gps.conf
system/etc/gpsconfig.xml
Также среди бинарников может спрятаться и бинарник, отвечающий за GPS, но это как говорится - специфика.
Сенсоры
Датчики освещенности, гироскоп, компас и т.д. все это относится к сенсорам. И обычно представлены:
Код
system/bin/akmd***
system/lib/hw/sensors.<platform>.so
Ну я думаю кратко о проприетариях я вам рассказал, примерный их список у вас есть и вы их уже раскидали по подкаталогам папки system в вендорной папке. Теперь добавим копирование этих файлов в .mk файл вендора. Это очень просто.
Добавляем в файл переменную:
Код
LOCAL_PATH := vendor/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства
Она нужна для сокращения написания пути. У меня вот так:
Код
LOCAL_PATH := vendor/samsung/i9300
Дальше для каждого проприетарного файла прописываем:
Код
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/путь_до_файла/проприетарный_файл:system/.../проприетарный_файл \
Например:
Код
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/system/lib/libril.so:system/lib/libril.so \
Обратите внимание на синтаксис, везде в .mk файлах где имеет место перечисление, ставится символ "\". На последнем элементе списка он не ставится, например:
Код
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/system/lib/libril.so:system/lib/libril.so \
$(LOCAL_PATH)/system/lib/libreference-ril.so:system/lib/libreference-ril.so \
$(LOCAL_PATH)/system/bin/rild:system/bin/rild \
$(LOCAL_PATH)/system/bin/gsm0710muxd:system/bin/gsm0710muxd
или
Код
PRODUCT_PACKAGES += \
Galaxy4 \
HoloSpiralWallpaper \
LiveWallpapers \
LiveWallpapersPicker \
MagicSmokeWallpapers \
NoiseField \
PhaseBeam \
VisualizationWallpapers \
librs_jni
Собственно о вендорной папке ВСЕ!