我已经下载了安卓源代码。现在我想为我自己的设备(LG GT540)制作它。我听说您需要为此创建一些“设备配置”。虽然已经有几个开发者为我的设备创建了设备配置,但我想创建自己的,只是为了学习。
我看到了很多像 BoardConfig.mk、AndroidProducts.mk 等文件。但不知道它们是做什么的。此外,它们还包含很多配置。除此之外,没有很好的文档。
任何有 Android 移植和设备配置经验的人都可以帮助我吗?
4 回答
对...所以您想构建自己的设备树,请继续阅读。
免责声明:这绝不是完整的,并且会有遗漏,因为我已经解释了所有这些,并复制粘贴了我在自己的设备树上的某些位。
例如,设备树/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 大小等的地方。
让我们看看其中的每一个,看看它们都适合哪里。
安卓.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
(注意与设备树目录的相关性?)
安卓产品.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 ROMbuild.prop
的根目录中找到。/system
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 构建生成文件的内部结构。
现在,就它的vendor/
一部分而言,在 AOSP 中,再次简单地与device/
树相关并对应,就像继续这个示例一样,vendor/lg/gt540/
它被lunch
. 那里有更多的 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),构建需要一段时间,GB 构建在我运行 Arch Linux 64 位的笔记本电脑上需要 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核!那个……很给力。
这里有一些信息:http: //elinux.org/Android_Device
对于任何为设备构建 Android 的人来说,这里是一个极好的资源: http ://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?bid=98
(ODROID 中 Android 平台开发的实用现实方法)
尽管其中的一些内容是 ODROID 板所特有的,但它仍然提供了对 Android 内部工作原理和新板的必要定制的深入了解。
如果您想了解硬件方面的问题,我发现的信息量最大的资源可能是:
http://source.android.com/compatibility/overview.html
通读他们为希望构建 Android 设备的制造商编写的文档,这是您会发现的最彻底/完整的参考资料。