源码根目录下的device目录中保存的是各个厂商相应的代码,故我们可以在这里创建一个自己的目录,比如以公司名称命名,比如felix。公司目录下是自己的设备目录,可以有多个,比如weatherfish。
这样,我们在device目录下就由了felix/weatherfish目录.
在上面创建的目录下,新建一个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
通过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 用于重载系统属性
用于填写目标架构、硬件设备属性、编译器的条件标致、分区分布、boot地址、ramdisk大小等,这部分可以参考其他项目源码,内容太多,而且基本类似,完成可以参考其同意系统架构的,这里就不列出了。
这部分是android系统下编译某个模块的标准的makefile。
然后执行make命令就可以编译android源码了。
编译完成后回在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
其由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是可选的,用于扩展。
可以通过file ramdisk.img
命令查看其文件属性为gzip压缩文件,然后添加后缀.gz后,用gzip -d ramdisk.img.gz
解压缩得到一个cpio格式的ramdisk.img文件。最后用cpio -i -F ramdisk.img
,解压出具体内容。
可以使用simg2img方式解压缩system.img文件, 然后在用mount挂载
simg2img system.img system.img.step1
sudo mount -o loop system.img.step1 system_extracted
首先是生成升级包,在执行完make命令,生成过system.img文件后,可以使用如下命令生产升级包
make otapackage
这里生成的是完整的升级包,也可以使用`build/tools/releasetools/ota_from_target_files 生成差分包。