为android源码添加新设备支持概述

1目录结构概述

源码根目录下的device目录中保存的是各个厂商相应的代码,故我们可以在这里创建一个自己的目录,比如以公司名称命名,比如felix。公司目录下是自己的设备目录,可以有多个,比如weatherfish。
这样,我们在device目录下就由了felix/weatherfish目录.

2 vendorsetup.sh

在上面创建的目录下,新建一个vendorsetup.sh文件,用于在lunch命令的时候调用,告知系统你的位置。
内容如下:

add_lunch_combo aosp_weatherfish-userdebug

这个定义是在envsetup.sh中被调用的,循环遍历查找device目录和vendor目录下的vendorsetup.sh,找到后就include进去。其中vendor目录是4.3以前的版本。

# Execute the contents of any vendorsetup.sh files we can find.
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
         `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
    echo "including $f"
    . $f
done
unset f

3 添加AndroidProducts.mk

通过PRODUCT_MAKEFILES 包含指定的makefile文件,用于指定编译完成后需要拷贝到设备文件系统中的各种文件;设置系统属性(/system/build.prop)等功能。

# Get the long list of APNs
PRODUCT_COPY_FILES := device/sample/etc/apns-full-conf.xml:system/etc/apns-conf.xml

# Inherit from the common Open Source product configuration
$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)

PRODUCT_NAME := aosp_weatherfish
PRODUCT_DEVICE := weatherfish
PRODUCT_BRAND := Android
PRODUCT_MODEL := AOSP on Weatherfish
PRODUCT_MANUFACTURER := felix
PRODUCT_RESTRICT_VENDOR_FILES := true

$(call inherit-product, device/felix/weatherfish/device.mk)
$(call inherit-product-if-exists, vendor/felix/weatherfish/device-vendor.mk)

PRODUCT_NAME := aosp_weatherfish

PRODUCT_PACKAGES += \
    Launcher3

系统变量说明:

PRODUCT_NAME 产品名称,最终会显示在 关于设备 选项卡中。
PRODUCT_DEVICE 设备名称
PRODUCT_BRAND 产品所属品牌
PRODUCT_MANUFACTURER 产品生产商
PRODUCT_MODEL 产品型号
PRODUCT_PACKAGES    系统需要预装的程序,如apks
PRODUCT_LOCALES 所支持的国家语言 [两字节语言码]-[两字节国家码]
PRODUCT_POLICY 策略
PRODUCT_TAGS    产品标签描述
PRODUCT_PROPERTY_OVERRIDES  用于重载系统属性

4 BoardConfig.mk

用于填写目标架构、硬件设备属性、编译器的条件标致、分区分布、boot地址、ramdisk大小等,这部分可以参考其他项目源码,内容太多,而且基本类似,完成可以参考其同意系统架构的,这里就不列出了。

5 Android.mk

这部分是android系统下编译某个模块的标准的makefile。

然后执行make命令就可以编译android源码了。

6生成文件分析

编译完成后回在out/target/product/[YOUR_PRODUCT]/目录下生产最终的镜像文件。包括以下:

boot.img        包含内核启动参数,内核等多个元素
randisk.img 一个小型的文件系统,是android系统启动的关键
system.img  android系统运行的程序包(frameworks),被挂载在/system
userdata.img    各程序的数据存储,被挂载在/data
recovery.img    设备进入 恢复模式 时所需要的镜像包
misc.img        即 miscellaneous 包含各种杂项资源
cache.img       缓存区,被挂载在/cache

6.1 boot.img

其由system/core/mkbooting中生成的mkbooting工具制作,有两个地方会调用它:droidcore依赖,和build/core/Makefile.
参考system/core/mkbooting/Bootimg.h文件,其头部结构如下:

** +-----------------+ 
** | boot header     | 1 page
** +-----------------+
** | kernel          | n pages  
** +-----------------+
** | ramdisk         | m pages  
** +-----------------+
** | second stage    | o pages
** +-----------------+

其中1page是4K header中包含一个结构体boot_img_hdr,该结构体定义也在Bootimg.h中;Kernel,其大小为(kernel_size+page_size-1)/page_size,也就是页对齐的;ramdisk同样是页对齐的;second stage是可选的,用于扩展。

6.2 ramdisk.img

可以通过file ramdisk.img命令查看其文件属性为gzip压缩文件,然后添加后缀.gz后,用gzip -d ramdisk.img.gz解压缩得到一个cpio格式的ramdisk.img文件。最后用cpio -i -F ramdisk.img,解压出具体内容。

6.3 System.img

可以使用simg2img方式解压缩system.img文件, 然后在用mount挂载

simg2img system.img system.img.step1
sudo mount -o loop system.img.step1 system_extracted

7 OTA系统升级

首先是生成升级包,在执行完make命令,生成过system.img文件后,可以使用如下命令生产升级包

make otapackage     

这里生成的是完整的升级包,也可以使用`build/tools/releasetools/ota_from_target_files 生成差分包。

你可能感兴趣的:(为android源码添加新设备支持概述)