device-tree

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

https-%2F%2Fi.imgur.com%2F6UtJPLf.png

歡迎來到新教程!我會嘗試教你如何做一個device-tree。這是ROM最重要的部分之一,現(xiàn)在開始!

作為例子的是三星手機(jī)和7.0ROM

  1. 理解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接口,顯示大小等等
  1. 基本文件
    現(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
  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
  1. 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
  1. 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容