48

我已经下载了安卓源代码。现在我想为我自己的设备(LG GT540)制作它。我听说您需要为此创建一些“设备配置”。虽然已经有几个开发者为我的设备创建了设备配置,但​​我想创建自己的,只是为了学习。
我看到了很多像 BoardConfig.mk、AndroidProducts.mk 等文件。但不知道它们是做什么的。此外,它们还包含很多配置。除此之外,没有很好的文档。
任何有 Android 移植和设备配置经验的人都可以帮助我吗?

4

4 回答 4

114

对...所以您想构建自己的设备树,请继续阅读。

免责声明:这绝不是完整的,并且会有遗漏,因为我已经解释了所有这些,并复制粘贴了我在自己的设备树上的某些位。

例如,设备树/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核!那个……很给力。

于 2012-07-05T22:11:59.933 回答
7

这里有一些信息:http: //elinux.org/Android_Device

于 2012-10-19T10:41:39.367 回答
2

对于任何为设备构建 Android 的人来说,这里是一个极好的资源: http ://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?bid=98

(ODROID 中 Android 平台开发的实用现实方法)

尽管其中的一些内容是 ODROID 板所特有的,但它仍然提供了对 Android 内部工作原理和新板的必要定制的深入了解。

于 2013-04-23T19:52:01.100 回答
1

如果您想了解硬件方面的问题,我发现的信息量最大的资源可能是:

http://source.android.com/compatibility/overview.html

通读他们为希望构建 Android 设备的制造商编写的文档,这是您会发现的最彻底/完整的参考资料。

于 2012-12-31T18:50:30.503 回答