這是一篇翻譯,原文鏈接見文末#

https-%2F%2Fi.imgur.com%2F6UtJPLf.png
歡迎來到新教程!我會嘗試教你如何做一個device-tree。這是ROM最重要的部分之一,現(xiàn)在開始!
作為例子的是三星手機(jī)和7.0ROM
-
理解device-tree的文件結(jié)構(gòu)
https-%2F%2Fi.imgur.com%2FESluLNM.png
首先從文件夾開始:
- bluebooth | 這個文件夾包含了一些文件和C頭文件,用來定義手機(jī)的藍(lán)牙的一些特性(默認(rèn)藍(lán)牙名稱,Bluetooth library name(.hcd),WBS forcing,低耗能支持)
- cmhw | CyanogenMod Hardware,包含了一些Java類來使得一些基本功能工作,比如震動強(qiáng)度,顯示顏色校準(zhǔn)等
- configs | 文件夾里包含了一些子文件夾,里面有一些來自原生固件的文件,如audio,WiFi,GPS,key-layout,NFC等,這些文件有時被修改,也有時保持原生(audio經(jīng)常被修改)
- include | 這里包含了所有的來自手機(jī)硬件的需要進(jìn)行修改的C頭文件(例:samsung_audio.h來自hardware/samsung/,這個文件被修改以定義大量的capture、speakers devices)
- init | init文件夾包含了一些簡單的C或C++函數(shù)來選擇手機(jī)運(yùn)行ROM的優(yōu)秀版本(啥的優(yōu)秀版本)(例:SM-A310FD支持雙卡,因此函數(shù)在檢測FD models時的時候會開啟雙卡支持)
- libshims | 這是一個可選的文件夾,對所有的設(shè)備都不必需,這里包含了一些抽象函數(shù)類似API的方式提供給手機(jī)
- overlay | 這個文件夾是最終的部分。它為framework、應(yīng)用等包含了XML配置文件,保持framework與原生一致是很重要的(使用apktool?)
- ramdisk | 這個文件夾包含從內(nèi)核提取的原生ramdisk作為基礎(chǔ),根據(jù)權(quán)限和服務(wù)等進(jìn)行修改
- ril | 這里包含了一些Java函數(shù)來使radio功能工作(網(wǎng)絡(luò)切換、處理電話、檢測SIM卡等)
- sepolicy | 這個文件夾里包含了一些*.te文件,其中包含了相機(jī)、audio、應(yīng)用的權(quán)限。
文件:
- Android.mk | 這個makefile存在于很多文件夾中。目的是在用戶調(diào)用正確的build命令時,building腳本可以正確檢測到device-tree
- BoardConfig.mk | 這個makefile是最重要的文件之一,包含了board的定義(分區(qū)大小,include路徑、overlay路徑、CPU、Soc等等)
- Lineage.mk | 這個文件是首先被building腳本讀取的,僅包含了產(chǎn)品名稱、代號、制造商還有是平板還是手機(jī),并且link device.mk
- device.mk | 這個文件包含了所有的需要使用或者需要復(fù)制的包、應(yīng)用、權(quán)限和庫,也包含了設(shè)備編譯apps的時候需要的大?。ɡ簒hdpi)
- extract-files.sh+setup-makefiles.sh | 這些shell腳本被調(diào)用來創(chuàng)建vendor(通過ADB從proprietary-files.txt拉取需要的文件到vendor文件夾)
- proprietary-files.txt | 這個文本文件一行一個文件,決定了AOSP需要的來自原生固件的文件(audio庫、圖形庫(例如OpenGL、MALI驅(qū)動等),等等)
- system.prop | 這個文件包含了一些需要被復(fù)制到build.prop的屬性,包含了一些設(shè)置,比如RIL類、庫、支持,要使用的WLAN接口,顯示大小等等
-
基本文件
現(xiàn)在我們解釋完文件結(jié)構(gòu)了,開始研究基本文件。
A. Android.mk
# Here we define a variable called "LOCAL_PATH" that just contain the path to the device tree (ex: /device/samsung/a3xeltexx)
# 這里我們定義了一個叫做"LOCAL_PATH"的變量,僅包含了device-tree的目錄,這個call my-dir大概就是取當(dāng)前文件夾,這個my-dir竟然是個函數(shù),build/envsetup.sh生成的,對call來說,這個my-dir相當(dāng)于表達(dá)式,調(diào)用完之后返回一個變量,再用$去獲取其值
LOCAL_PATH := $(call my-dir)
# Here we open an if statement that will be true if the user requested to build that device.
# 開始了一個if語句,在用戶要求build此設(shè)備的時候為真,思考,如果目標(biāo)設(shè)備與這個一致的話,那么filter之后是有東西的,ifneq的兩個參數(shù)一個有東西,一個為空,那么就是不相等,即執(zhí)行下面的語句;如果目標(biāo)設(shè)備與device不一致,filter出來的是空的,那么ifneq里面相等,不執(zhí)行下面語句。
ifneq ($(filter a3xeltexx,$(TARGET_DEVICE)),)
# Here we call other makefiles in the device-tree
# 調(diào)用所有其他的makefiles,看語句的話,這個all-subdir-makefiles也是一個函數(shù),也就是調(diào)用當(dāng)前目錄下面的所有子文件夾下的makefile
include $(call all-subdir-makefiles,$(LOCAL_PATH))
# Here we clean variables
#...算了,大概知道這個是清除變量用的就行
include $(CLEAR_VARS)
# Here we close the if statement.
endif
B. Lineage.mk
# Note: the lineage.mk can also be called slim.mk, pa.mk, aoscp.mk, etc...
# Depending on the ROM to build. LineageOS based roms will use lineage.mk
# 這個可以根據(jù)ROM不同叫的名字也不同,原來如此,甭管叫啥都一樣會被調(diào)用的
# Inherit device configuration
# 繼承設(shè)備配置,我猜這個inherit-product的功能是從device.mk獲取設(shè)備配置
$(call inherit-product, device/samsung/a3xeltexx/device.mk)
# Inherit from the common Open Source product configuration
# 從開源產(chǎn)品配置里面繼承公共配置
$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
# Inherit common CM phone.
# 從CM的公共配置里面繼承
$(call inherit-product, vendor/cm/config/common_full_phone.mk)
# Set those variables here to overwrite the inherited values.
# 設(shè)置專有參數(shù)來覆蓋繼承的值
PRODUCT_NAME := lineage_a3xeltexx
PRODUCT_DEVICE := a3xeltexx
PRODUCT_BRAND := samsung
PRODUCT_MANUFACTURER := samsung
C. Proprietary-files.txt
# Note: the proprietary-files.txt contains files needed to make the phone or features working.
# 這里包含的是一些能夠使手機(jī)或者功能正常工作的文件
# Consider below values as example.
# Scaler CSC
lib/libexynosscaler.so
lib/libexynosgscaler.so
lib/libexynosutils.so
# Gralloc
lib/hw/gralloc.exynos5.so
# GPS
bin/gpsd
bin/gps.cer
lib/hw/gps.default.so
lib/libwrappergps.so
lib/libfloatingfeature.so
# Graphics
vendor/lib/egl/libGLES_mali.so
# etc.... There is much more files to pull :D
# 等等,有太多需要拉取的文件了
# 這個是vendor里面的嗎?
D. System.prop
# Note: again, consider below values as example.
# Note 2: system.prop need to define HWUI and Dalvik values that you can find in stock firmware.
# system.prop需要定義一些可以在原生固件里面找到的HWUI和Dalvik的相關(guān)參數(shù)
# media
media.stagefright.legacyencoder=1
media.stagefright.less-secure=1
# Graphics
ro.opengles.version=196609
ro.sf.lcd_density=320
# HWC
debug.hwc.force_gpu=1
-
BoardConfig
來談?wù)凚oardConfig.mk
感覺這塊東西變化太多,像這個里面很多東西4c的device都沒有
# This is a example. It's uncomplete.
這是一個不可編譯的例子
# You can refer to GitHub to see complete BoardConfig.mk
# Platform
# Here we define our manufacturer, based board (exynos5), target board (exynos7580), our slsi variant
# 這里定義生產(chǎn)商,等等等等,也不大認(rèn)識,到時候看4c的現(xiàn)有的應(yīng)該就認(rèn)得了
BOARD_VENDOR := samsung
TARGET_BOARD_PLATFORM := exynos5
TARGET_SOC := exynos7580
TARGET_SLSI_VARIANT := cm
# Arch
# Here we define our CPU
# 大概是cpu相關(guān)的東西,架構(gòu)啊什么的,結(jié)合4c的到時候再看吧
TARGET_BOARD_SUFFIX := _32
TARGET_ARCH := arm
TARGET_ARCH_VARIANT := armv7-a-neon
TARGET_CPU_ABI := armeabi-v7a
TARGET_CPU_ABI2 := armeabi
TARGET_CPU_VARIANT := cortex-a53
TARGET_CPU_CORTEX_A53 := true
# Bootloader
TARGET_BOOTLOADER_BOARD_NAME := universal7580
# Define device codename we support
# 定義支持的設(shè)備代號
TARGET_OTA_ASSERT_DEVICE := a3xelte,a3xeltexx,a3xelteub,a3xeltedo,a3xeltekx
# Define device-tree path
# 定義device-tree的路徑,這是個奇怪的問題,大概是后面有什么會用到這個
DEVICE_PATH := device/samsung/a3xeltexx
# Include path
# 原來如此!
# include里面是與手機(jī)相關(guān)的頭文件
# 所以后面的語句實際上很多就是將device里面的各種東西給包含進(jìn)來
TARGET_SPECIFIC_HEADER_PATH += $(DEVICE_PATH)/include
# Bluetooth
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(DEVICE_PATH)/bluetooth
# Hardware
# 喔,其實就到這里
BOARD_HARDWARE_CLASS += $(DEVICE_PATH)/cmhw
# Init
# 這兩個參數(shù)我也不知道是啥
TARGET_INIT_VENDOR_LIB := libinit_sec
TARGET_UNIFIED_DEVICE := true
# Kernel
# 內(nèi)核配置?路徑,架構(gòu)
TARGET_KERNEL_CONFIG := lineage-a3xeltexx_defconfig
TARGET_KERNEL_SOURCE := kernel/samsung/a3xeltexx
TARGET_KERNEL_ARCH := arm64
TARGET_KERNEL_HEADER_ARCH := arm64
# Extracted with libbootimg
# 用libbooting提取,這個東西小米是不是沒有啊,沒找到哎
BOARD_CUSTOM_BOOTIMG_MK := hardware/samsung/mkbootimg.mk
BOARD_KERNEL_SEPARATED_DT := true
BOARD_MKBOOTIMG_ARGS := --kernel_offset 0x00008000 --ramdisk_offset 0x01000000 --tags_offset 0x00000100 --board SRPOJ08A000KU
TARGET_CUSTOM_DTBTOOL := dtbhtoolExynos
# Partitions sizes
BOARD_HAS_NO_MISC_PARTITION := false
TARGET_USERIMAGES_USE_EXT4 := true
BOARD_BOOTIMAGE_PARTITION_SIZE := 33554432 # 32MB
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 39845888 # 38MB
BOARD_CACHEIMAGE_PARTITION_SIZE := 209715200 # 200MB
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 3145728000 # 3GB
BOARD_USERDATAIMAGE_PARTITION_SIZE := 12096372736 # 11GB
BOARD_FLASH_BLOCK_SIZE := 4096
# .dat compression
BLOCK_BASED_OTA := true
# PowerHAL
TARGET_POWERHAL_VARIANT := samsung
# Properties
TARGET_SYSTEM_PROP += $(DEVICE_PATH)/system.prop
# Charger
BACKLIGHT_PATH := /sys/devices/14800000.dsim/backlight/panel/brightness
# Recovery
TARGET_RECOVERY_FSTAB := $(DEVICE_PATH)/ramdisk/fstab.samsungexynos7580
# Radio
BOARD_RIL_CLASS := ../../../$(DEVICE_PATH)/ril
BOARD_MODEM_TYPE := tss310
# NFC
BOARD_NFC_CHIPSET := pn547
# Here we include the vendor
-include vendor/samsung/a3xeltexx/BoardConfigVendor.mk
- The device.mk
談?wù)刣evice.mk,:的作用似乎是分割路徑,那么是不是這樣理解,有一些文件需要復(fù)制到ROM的某些路徑下面,就從這里設(shè)置如何復(fù)制,其實也就是提供了兩個路徑,會有其他腳本去處理,我不清楚這么理解對不對
# Note: this is an example. This is uncomplete
# Include layers
DEVICE_PACKAGE_OVERLAYS += device/samsung/a3xeltexx/overlay
# Define screen size for prebuilt apps
PRODUCT_AAPT_CONFIG := xlarge
PRODUCT_AAPT_PREF_CONFIG := xhdpi
PRODUCT_AAPT_PREBUILT_DPI := hdpi mdpi
# Use dtbhtoolExynos to build dt.img
PRODUCT_PACKAGES += \
dtbhtoolExynos
# Screen size for boot animation
TARGET_SCREEN_HEIGHT := 1280
TARGET_SCREEN_WIDTH := 720
# Copying audio files
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/audio/audio_policy.conf:system/etc/audio_policy.conf \
$(LOCAL_PATH)/configs/audio/mixer_paths.xml:system/etc/mixer_paths.xml
# Copying bluetooth files
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/bluetooth/bt_vendor.conf:system/etc/bluetooth/bt_vendor.conf
# Copying GPS config files
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/gps/gps.conf:system/etc/gps.conf \
$(LOCAL_PATH)/configs/gps/gps.xml:system/etc/gps.xml
# Advertise we support theres features
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.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.heartrate.xml:system/etc/permissions/android.hardware.sensor.heartrate.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.stepcounter.xml:system/etc/permissions/android.hardware.sensor.stepcounter.xml \
frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:system/etc/permissions/android.hardware.sensor.stepdetector.xml \
frameworks/native/data/etc/android.hardware.nfc.xml:system/etc/permissions/android.hardware.nfc.xml \
frameworks/native/data/etc/android.hardware.nfc.hce.xml:system/etc/permissions/android.hardware.nfc.hce.xml \
frameworks/native/data/etc/com.android.nfc_extras.xml:system/etc/permissions/com.android.nfc_extras.xml
# Include our GPS shim
PRODUCT_PACKAGES += \
libshim_gpsd
# Include our edited ramdisk
PRODUCT_PACKAGES += \
fstab.samsungexynos7580 \
init.baseband.rc \
init.samsung.rc \
init.samsungexynos7580.rc \
init.samsungexynos7580.usb.rc \
init.wifi.rc \
ueventd.samsungexynos7580.rc \
init.battery.rc
- Details
到這里就結(jié)束啦
Also, i didn't explained how to fill include, etc...
For that part, i recommend you to use a device-tree near from your device, you copy it, then you adapt it to your device (change codename, manufacturer, screen size, CPU, etc....)
Making a device-tree is a lot of copy from other device-tree, github commits, etc...
這是一篇翻譯
內(nèi)容來源[XDA]/android/software/guide-how-to-make-device-tree-phone-t3698419
