不同项目共用一个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的值。其他部分的兼容性在此基础上展开。
- 查找包含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) 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
- 增加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注意事项