对...所以您想构建自己的设备树,请继续阅读。
免责声明: 这绝不是完整的,并且会有遗漏,因为我已经解释了所有这些,并复制粘贴了我在这里的某些部分我自己的设备树。
设备树,例如/device/lg/gt540将包含以下make文件:
-
Android.mk - 这将告诉构建系统包含并专门为您的设备构建源。请参阅下面的示例。这取决于设备和硬件,您可以在示例设备树下拥有 libsensors、liblights、libcamera 子目录,即
/device/lg/gt540/libsensors、/device/lg/gt540/liblights、/device/lg/gt540/libcamera 等。
-
AndroidBoard.mk - 这是用于内核的,构建系统使用它来放置内核映像(几分钟后会详细介绍)
-
AndroidProducts.mk - 指定适当设备的 make 文件,用于构建。即
/device/lg/gt540/device_gt540.mk,这也是具体的。
-
device_xxxxx.mk - 指定要复制到最终输出中的属性和附加内容,在这种情况下,例如,
device_gt540.mk
-
BoardConfig.mk - 这是所有内容的核心,这是设置编译器条件标志、分区布局、引导地址、ramdisk 大小等的地方。
让我们深入了解其中的每一个,看看它们都适合哪里。
Android.mk:
ifeq ($(TARGET_BOOTLOADER_BOARD_NAME),xxxxx)
include $(call all-named-subdir-makefiles, recovery libsensors liblights libcamera ....)
endif
这就是构建将如何使用它来构建恢复、传感器、灯光和摄像头(当然会有更多),它的意思是“Yo Builder,进入每个指定的目录,并构建相应的来源 plskthxbai'
AndroidBoard.mk:
LOCAL_PATH := device/lg/gt540/
#
# Boot files
#
TARGET_PREBUILT_KERNEL := $(LOCAL_PATH)/kernel
file := $(INSTALLED_KERNEL_TARGET)
ALL_PREBUILT += $(file)
$(file): $(TARGET_PREBUILT_KERNEL) | $(ACP)
$(transform-prebuilt-to-target)
现在,这是告诉构建系统,能够将此内核放入out/target/product/lg/gt540(注意与设备树目录的相关性?)
AndroidProducts.mk:
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/device_gt540.mk
它告诉构建就像'Yo Builder,请阅读该设备制造文件并在构建完成后处理它。'
*device_xxxxx.mk:(对于本例,device_gt540.mk)*
PRODUCT_NAME := lg_gt540
PRODUCT_DEVICE := gt540
PRODUCT_MODEL := LG GT 540
PRODUCT_COPY_FILES += \
... specific ...
PRODUCT_PROPERTY_OVERRIDES := \
ro.com.android.dateformat=dd-MM-yyyy \
... more stuff ...
在这种情况下,设备的所有细节(例如驱动程序、专有库、专门为设备的支持脚本)都将复制到out/target/product/lg/gt540/system/。请注意这些属性的覆盖,它们最终出现在 Android ROM 的 /system 的根目录中的 build.prop 中。
BoardConfig.mk:
LOCAL_PATH:= $(call my-dir)
TARGET_NO_BOOTLOADER := true
TARGET_PREBUILT_KERNEL := device/lg/gt540/kernel
TARGET_PREBUILT_RECOVERY_KERNEL := device/lg/gt540/recovery_kernel
# This will vary from device!
TARGET_BOARD_PLATFORM := msm7k
TARGET_ARCH_VARIANT := armv6-vfp
TARGET_CPU_ABI := armeabi
TARGET_CPU_ABI := armeabi-v6l
TARGET_CPU_ABI2 := armeabi
# OpenGL drivers config file path
BOARD_EGL_CFG := device/lg/gt540/egl.cfg
# Dependant, not to be taken literally!
BOARD_GLOBAL_CFLAGS += -DHAVE_FM_RADIO
# Dependant, not to be taken literally!
BOARD_KERNEL_BASE := 0x02600000
# this will be device specific, and by doing cat /proc/mtd will give you the correct sizes
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00480000
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00480000
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x0cf80000
BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x0d020000
BOARD_FLASH_BLOCK_SIZE := 131072
这是一段摘录,请注意我们如何指定内核的基地址,这是在编译完成后生成boot.img 并再次放入out/target/product/lg/gt540/boot.img 的方式。此外,更重要的是,我们告诉构建系统使用目标平台来交叉编译源代码 (*TARGET_BOARD_PLATFORM*/*TARGET_CPU_ABI*) 那里会有更多信息,例如要传递给编译器的条件标志,例如一个例子。我们指定了指令HAVE_FM_RADIO 来告诉它,在处理 FM 广播系统的源时,有条件地编译部分源。同样,这是特定于硬件的,里程会有所不同,这也适用于引导地址。简而言之,这就是说'Yo Builder,读取该死的变量并记住它们并在交叉编译这些源文件时应用它们!'
现在每个 Android 构建 make-file 的内部都已显示。
现在,在它的 vendor/ 部分,在 AOSP 中,再次简单地关联并对应于 device/ 树,如继续此示例,vendor/lg/gt540/ 被 @987654342 拾取@。那里有更多的 make 文件,但普遍的共识是有一个名为 proprietary 的目录,其中包含被复制的专有库(由于封闭源等)。库的复制在文件 device-vendor-blobs.mk 中指定,在本例中为 gt540-vendor-blobs.mk。
当奇迹发生时,请执行以下操作:
. build/envsetup.sh
这是读取每个 device/ 子目录中的全部条目并“记住它们”,因此构建系统知道使用什么类型的目标等。
当. lunch 被调用时,会出现一个菜单,提示您选择构建所需的设备。现在是构建的最后也是最后一步......
make -j5 > buildlog.log 2>&1
我在另一个终端上运行multitail 并监视buildlog.log 文件以检查并确保其构建。
这最后一步将取决于您拥有多少核心(通常是 n 个核心 + 1),构建需要一段时间,在我运行 Arch Linux 64 位的笔记本电脑上,GB 构建需要 40 分钟,ICS 构建大约需要 2 小时 30 分钟.因此,里程会因您的机器所具有的马力类型而异。
构建完成后,一个小铃声响起,在所述日志文件的底部,我看到了:
Combining NOTICE files: out/target/product/xxxxx/obj/NOTICE.html
Target system fs image: out/target/product/xxxxx/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/xxxxx/system.img
out/target/product/xxxx/system.img+ total size is 108776448
作为感兴趣的 JBQ(Jean Baptiste Queru - 管理/分发来自 Google 的源代码的“老板”),他的构建步骤是这样的......
make -j32
是的! 32核!那个……太强大了。