AOSP的Android设备配置

Tej*_*hav 46 android

我已经下载了Android源代码.现在我想为自己的设备(LG GT540)制作它.我听说你需要为此创建一些"设备配置".虽然有几位开发人员已经为我的设备创建了设备配置,但​​我想创建自己的设备,仅供学习.
我看到很多文件,如BoardConfig.mk,AndroidProducts.mk等.但不知道他们做了什么.除了它们包含很多配置.在那之上,没有一个好的文档.
任何有Android移植和设备配置经验的人都可以帮助我吗?

t0m*_*13b 109

对...所以你想建立自己的设备树,继续阅读.

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

例如,设备树/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
Run Code Online (Sandbox Code Playgroud)

这就是构建将如何使用它来构建恢复,传感器,灯光和摄像头(当然会有更多),它说' 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)
Run Code Online (Sandbox Code Playgroud)

现在这个,告诉构建系统,能够将这个内核放入其中out/target/product/lg/gt540(注意与设备树目录的相关性?)

AndroidProducts.mk:

PRODUCT_MAKEFILES := \
    $(LOCAL_DIR)/device_gt540.mk 
Run Code Online (Sandbox Code Playgroud)

它告诉构建在' 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 ...
Run Code Online (Sandbox Code Playgroud)

这就是设备的所有细节,例如驱动程序,专有库,专用于设备的支持脚本,out/target/product/lg/gt540/system/在这种情况下被复制到的地方.注意如何覆盖属性,这些最终会出现在Android ROM build.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
Run Code Online (Sandbox Code Playgroud)

这是一段摘录,请注意我们如何指定内核的基地址,这是boot.img在编译完成后生成的,然后又被放入的地方out/target/product/lg/gt540/boot.img.另外,更重要的是,我们告诉构建系统使用目标平台来交叉编译源代码(*TARGET_BOARD_PLATFORM*/*TARGET_CPU_ABI*)那里会有更多信息,例如条件标志传递给编译器,一个例子.我们指定该指令HAVE_FM_RADIO告诉它,当涉及到处理FM无线电系统的源时,有条件地编译部分源.同样,这是特定于硬件的,里程也会有所不同,这也适用于引导地址.简而言之,这就是说' Yo Builder,读取该死的变量并记住它们并在交叉编译这些源文件时应用它们!"

现在显示了每个Android构建make文件的内部.

现在,在vendor/它的一部分,在AOSP中,简单地,再一次,相关并与device/树对应,如继续这个例子,vendor/lg/gt540/它被捡起来lunch.那里有更多的make文件,但普遍的共识是有一个目录proprietary,其中包含被复制的专有库(由于close-source等).在这种情况下,文件device-vendor-blobs.mk中指定了库的复制gt540-vendor-blobs.mk.

当通过执行以下操作发生魔术:

. build/envsetup.sh
Run Code Online (Sandbox Code Playgroud)

这是读取每个device/子目录中的所有条目并"记住它们",因此构建系统知道使用了什么类型的目标等.

. lunch调用gets 时,会出现一个菜单,提示您选择构建所需的设备.现在是进行构建的最后一步也是最后一步......

make -j5 > buildlog.log 2>&1
Run Code Online (Sandbox Code Playgroud)

multitail在另一个终端上运行并监视buildlog.log文件以检查并确保其构建.

最后一步将取决于您拥有多少核(n核+ 1作为规则)并且需要一段时间才能构建,GB构建需要40分钟才能在我的笔记本电脑上运行Arch Linux 64bit,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
Run Code Online (Sandbox Code Playgroud)

感兴趣的是JBQ(Jean Baptiste Queru--管理/分发谷歌来源的'老板'),他的构建步骤是......

make -j32 
Run Code Online (Sandbox Code Playgroud)

对!32核!那......非常强大.