android系统源代码添加新产品的支持

不同项目共用一个CPU等核心平台,项目外围有些差异,需要共用绝大部分代码,比如我们基于高通msm8937 64位CPU开发3款产品(每款产品定义为一个项目的体现形式),我们用DEVELOP_PROJECT来记录并区分,DEVELOP_PRODUCT对应这3个项目的名称为evb(评估板)、ht_v8(手持机v8型号设备),dr_v2(门禁设备V2型号设备)。

我们是基于msm8937_64上来扩展为支持几个项目共用一套代码,为验证这套机制的基本实现,我们以修改“设置--->关于手机--->型号”来验证,这个对应device\qcom\msm8937_64\msm8937_64.mk的PRODUCT_MODEL的值。其他部分的兼容性在此基础上展开。

  1. 查找包含msm8937_64的目录

查找了device、system、hardware、vendor和build目录

Msm8937下lk部分是对应msm8952目录,但lk目录修改较少

 

这里面的device/qcom/8937_64是针对8937 64位的,目录如下:

我们是基于框CPU来开发几款产品,所以可以在此目录下把共同部分保持原来的目录结构,产品可能不同的就放在新创建的对应的目录下,比如针对于evb(评估板),我们在device\qcom\msm8937_64下新建device_evb文件夹,把差异性部分放在这里,其他产品类似。

 

  1. 编译设置

先来看看高通默认的编译之前的操作配置

(1)   source build/envsetup.sh

(2)   lunch msm8937_64-userdebug

 

2.1  source build/envsetup.sh

使当前shell读入build/envsetup.sh的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录

 

打印的信息

WARNING: Only bash is supported, use of other shell would lead to erroneous results

including device/generic/mini-emulator-arm64/vendorsetup.sh

including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh

including device/generic/mini-emulator-x86_64/vendorsetup.sh

including device/generic/mini-emulator-x86/vendorsetup.sh

including device/qcom/common/vendorsetup.sh

including vendor/forge/vendorsetup.sh

fatal: Not a git repository (or any of the parent directories): .git

FORGE_VERSION ==> 1B62.XXXXXXX.180823.100.V01.T01

FORGE_AP_VERSION ==> SLM757MG_EQ0_XXXXXXX_180823_100_V01_T01

including vendor/qcom/proprietary/common/vendorsetup.sh

including sdk/bash_completion/adb.bash

 

(1)   找出包含有vendorsetup.sh的文件并执行

这来会找到并执行其中的device\qcom\common\vendorsetup.sh,此sh相关的有

add_lunch_combo msm8937_32-userdebug

add_lunch_combo msm8937_64-userdebug

add_lunch_combo msm8953_32-userdebug

也就是调用add_lunch_combo这个函数,将各自产品添加到LUNCH_MENU_CHOICES变量中去。

(2)   add_lunch_combo()

# Clear this variable.  It will be built up again when the vendorsetup.sh

# files are included at the end of this file.

unset LUNCH_MENU_CHOICES

function add_lunch_combo()

{

    local new_combo=$1

      

    local c

    for c in ${LUNCH_MENU_CHOICES[@]} ; do

        if [ "$new_combo" = "$c" ] ; then

            return

        fi

    done

    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)

}

这里重点

是收集所有的vendor清单,用echo ${LUNCH_MENU_CHOICES[@]}打印出来的值

aosp_arm-eng aosp_arm64-eng aosp_mips-eng aosp_mips64-eng aosp_x86-eng aosp_x86_64-eng mini_emulator_arm64-userdebug m_e_arm-userdebug mini_emulator_x86_64-userdebug mini_emulator_x86-userdebug msm8974-userdebug msm8610-userdebug msm8226-userdebug apq8084-userdebug mpq8092-userdebug msm_bronze-userdebug msm8916_32-userdebug msm8916_32_512-userdebug msm8916_32_k64-userdebug msm8916_64-userdebug msm8994-userdebug msm8996-userdebug msm8909-userdebug msm8909_512-userdebug msm8992-userdebug msm8952_64-userdebug msm8952_32-userdebug msm8937_32-userdebug msm8937_64-userdebug msm8953_32-userdebug msm8953_64-userdebug msm8998-userdebug msm8998_32-userdebug msmfalcon_64-userdebug msmfalcon_32-userdebug msmskunk-userdebug

(3)   adb.bash

在sdk/bash_completion目录下的adb.bash文件也会加载到当前终端来,它是用来实现adb命令的bash completion功能的。也就是说,加载了该文件之后,我们在运行adb相关的命令的时候,通过按tab键就可以帮助我们自动完成命令的输入。关于bash completion的知识,可以参考官方文档: http://www.gnu.org/s/bash/manual/bash.html#Programmable-Completion

2.2  lunch msm8937_64-userdebug

说明下,如果没有前面的source build/envsetup.sh,将会提示-sh: lunch: command not found

输出的信息

============================================

PLATFORM_VERSION_CODENAME=REL

PLATFORM_VERSION=7.1.1

TARGET_PRODUCT=msm8937_64

TARGET_BUILD_VARIANT=userdebug

TARGET_BUILD_TYPE=release

TARGET_BUILD_APPS=

TARGET_ARCH=arm64

TARGET_ARCH_VARIANT=armv8-a

TARGET_CPU_VARIANT=generic

TARGET_2ND_ARCH=arm

TARGET_2ND_ARCH_VARIANT=armv7-a-neon

TARGET_2ND_CPU_VARIANT=cortex-a53

HOST_ARCH=x86_64

HOST_2ND_ARCH=x86

HOST_OS=linux

HOST_OS_EXTRA=Linux-4.4.0-62-generic-x86_64-with-Ubuntu-16.04-xenial

HOST_CROSS_OS=windows

HOST_CROSS_ARCH=x86

HOST_CROSS_2ND_ARCH=x86_64

HOST_BUILD_TYPE=release

BUILD_ID=NMF26F

OUT_DIR=out

 

(1)   build_build_var_cache()

lunch()--->build_build_var_cache()

这里会执行build/core/config.mk

(2)   printconfig

lunch()--->printconfig()--->get_build_var(),此函数的参数是report_config,在core/dumpvar.mk中的print_build_config_vars对应上面打印的信息,但他们的值怎来的呢

 

(3)    

2.3   

  1. 增加DEVELOP_PRODUCT记录我们开发的设备型号

,DEVELOP_PRODUCT对应这3个项目的名称为evb(评估板)、ht_v8(手持机v8型号设备),dr_v2(门禁设备V2型号设备)。

 

3.1  DEVELOP_PRODUCT能够手动选择并全局生效

手动输入,默认为evb

要实现这个多产品选项

/build/envsetup.sh的lunch()调用新增的choose_develop_product(),如下:

PRODUCT_CHOICES=(evb ht_v8 dr_v2)

# 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=

    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 project: $ANSWER"

            fi

        fi

        if [ -n "$1" ] ; then

            break

        fi

    done



}

function lunch()

{

    local answer

       choose_develop_product $2

       …

}

3.2  我们以修改“设置--->关于手机--->型号”来验证

这个对应device\qcom\msm8937_64\msm8937_64.mk的PRODUCT_MODEL的值,默认为

PRODUCT_MODEL := msm8937 for arm64

 

实现这个验证的主要实现如下:

(1)   创建product_evb文件夹

在device\qcom\msm8937_64下创建product_evb文件夹

(2)   product_evb文件夹创建msm8937_64_evb.mk文件

此文件下的内容PRODUCT_MODEL := evb

(3)   msm8937_64.mk把msm8937_64_evb.mk文件包含进来

include device/qcom/msm8937_64/product_$(DEVELOP_PRODUCT)/msm8937_64_$(DEVELOP_PRODUCT).mk

这里用到了记录产品型号的DEVELOP_PRODUCT变量。

 

参考链接:

深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制

https://blog.csdn.net/mr_raptor/article/details/30113417?readlog

 

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

https://blog.csdn.net/felix_wangq/article/details/49834207

 

为android系统添加产品的过程

https://blog.csdn.net/getnextwindow/article/details/48158873

 

Android 系统添加新项目及配置

https://blog.csdn.net/zhbpd/article/details/50274715

 

msm8909+android5.1.1编译前配置及增加新项目和产品所需分支

https://www.2cto.com/kf/201602/491312.html

 

Android集成一个新产品时,lunch的product name和device name注意事项

https://www.2cto.com/kf/201512/454247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loongembedded

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值