高通Android9.0源码兼容不同项目编译环境

 

一、envsetup中添加项目的选项

build/make/envsetup.sh

PRODUCT_CHOICES=(chenqw_test)     #产品选择列表 这里只有chenqw_test这个项目
# check to see if the supplied variant is valid
function check_develop_product()
{
    for v in ${PRODUCT_CHOICES[@]}
    do
        if [ "$v" = "$1" ]
        then
            return 0
        fi
    done
    return 1
}

#添加产品选择 函数
function choose_develop_product()
{
    echo $1
    T=$(gettop)
    echo "product choices are:"
    local index=1
    local v

    for v in ${PRODUCT_CHOICES[@]}
    do
        # The product name is the name of the directory containing
        # the makefile we found, above.
        echo "     $index. $v"
        index=$(($index+1))
    done

    local default_value=evb
    local ANSWER

    export DEVELOP_PRODUCT=                   #export成全局变量
    while [ -z "$DEVELOP_PRODUCT" ]
    do
        echo -n "Which would you like? [$default_value] "

        if [ -z "$1" ] ; then
            read ANSWER
        else
            echo $1
            ANSWER=$1
        fi

        if [ -z "$ANSWER" ] ; then
            export DEVELOP_PRODUCT=$default_value
        elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then

            if [ "$ANSWER" -le "${#PRODUCT_CHOICES[@]}" ] ; then
                export DEVELOP_PRODUCT=${PRODUCT_CHOICES[$(($ANSWER-1))]}
            fi
        else

            if check_develop_product $ANSWER
            then
                export DEVELOP_PRODUCT=$ANSWER
            else
                echo "** Not a valid product: $ANSWER"
            fi

        fi
        if [ -n "$1" ] ; then
            break
        fi
    done

}



function lunch()
{
    local answer

.......................
    choose_develop_product     #在lunch的最前面添加选择的项目并export成全局变量

......................

}

二、AndroidBoard.mk文件中根据实际的项目选择对应的kernel config
对于Android的kernel编译控制基本都是在AndroidBoard.mk 中决定,也可以从编译过程的log可以看出

1、配置kerne的config 跟随项目走

device/qcom/msm8953_64/AndroidBoard.mk

     else ifneq ($(wildcard kernel/msm-4.9),)
         ifeq ($(TARGET_BUILD_VARIANT),user)
-          KERNEL_DEFCONFIG := msm8953-perf_defconfig            #删掉之前的默认config
+          KERNEL_DEFCONFIG := msm8953-$(DEVELOP_PRODUCT)-perf_defconfig  #添加跟随项目的config
         else

-          KERNEL_DEFCONFIG := msm8953_defconfig                   #删掉之前的默认config
+          KERNEL_DEFCONFIG := msm8953-$(DEVELOP_PRODUCT)_defconfig #添加跟随项目的config
         endif
     endif

2、配置自定义的DT_OVERLAY宏,该宏会控制哪些dts使用

ifeq ($(TARGET_KERNEL_VERSION), 4.9)
DTC := $(HOST_OUT_EXECUTABLES)/dtc$(HOST_EXECUTABLE_SUFFIX)

TARGET_KERNEL_MAKE_ENV := DTC_EXT=dtc$(HOST_EXECUTABLE_SUFFIX)
TARGET_KERNEL_MAKE_ENV += CONFIG_BUILD_ARM64_DT_OVERLAY=y
TARGET_KERNEL_MAKE_ENV += CONFIG_BUILD_ARM64_DT_OVERLAY_TEST=y  #自定义dts控制宏
endif

3、使用第2步的控制宏,根据项目选择相应的dts文件

kernel/msm-4.9/arch/arm64/boot/dts/qcom/Makefile
.......................
ifeq ($(CONFIG_BUILD_ARM64_DT_OVERLAY),y)
ifeq ($(CONFIG_BUILD_ARM64_DT_OVERLAY_TEST),y)            #如果使用自定义宏
dts-dirs += $(DEVELOP_PRODUCT)                            #则加载对应目录的dts
else
.......................

#把相关的dts放到test目录下,如果不知道要加哪些,可以把整个qcom的拷贝过去
kernel/msm-4.9/arch/arm64/boot/dts/qcom/test/

#然后修改test下面的Makefile,把一些没必要的dts去掉
kernel/msm-4.9/arch/arm64/boot/dts/qcom/test/Makefile  #文件内容如下,可以从编译或者开机log知道哪个是主的dts

dtbo-$(CONFIG_ARCH_MSM8953) += msm8953-mtp-overlay.dtbo \
	msm8953-no-pmi-overlay.dtbo

dtbo-$(CONFIG_ARCH_SDM450) += msm8953-mtp-overlay.dtbo \
	sdm450-no-pmi-overlay.dtbo

msm8953-mtp-overlay.dtbo-base := sdm450.dtb \
	msm8953.dtb 
	
msm8953-no-pmi-overlay.dtbo-base := msm8953-no-pmi.dtb	
sdm450-no-pmi-overlay.dtbo-base := sdm450-no-pmi.dtb
always		:= $(dtb-y)
subdir-y	:= $(dts-dirs)
clean-files := *.dtb

4、添加Android部分的项目兼容选项

与kernel中的AndroidBoard.mk类似,Android层也有个重要的控制mk文件 device/qcom/msm8953_64/msm8953_64.mk,整个文件控制了相当多的控制命令,以下是我们根据项目做定制化的时候,增加自己的可控mk文件

在msm8953_64.mk添加自己的mk
device/qcom/msm8953_64/msm8953_64.mk

+include device/qcom/msm8953_64/product_$(DEVELOP_PRODUCT)/$(DEVELOP_PRODUCT).mk


添加新的mk文件

device/qcom/msm8953_64/product_test/test.mk

+PRODUCT_INTERNAL_MODEL := TEST
+PRODUCT_VERSION :=1.0.0
+PRODUCT_MODEL := TEST

三、总结

将android和kernel跟项目相关的区分开,在编译阶段选择相应的项目,就可以生成对应项目的定制内核,特别是同一套代码的客户定制和产品定义差异大的时候,可以方便代码的维护,主要记得两个重要的控制编译mk文件就好

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值