android系统源代码添加新产品的支持
不同項(xiàng)目共用一個(gè)CPU等核心平臺(tái),項(xiàng)目外圍有些差異,需要共用絕大部分代碼,比如我們基于高通msm8937 64位CPU開(kāi)發(fā)3款產(chǎn)品(每款產(chǎn)品定義為一個(gè)項(xiàng)目的體現(xiàn)形式),我們用DEVELOP_PROJECT來(lái)記錄并區(qū)分,DEVELOP_PRODUCT對(duì)應(yīng)這3個(gè)項(xiàng)目的名稱(chēng)為evb(評(píng)估板)、ht_v8(手持機(jī)v8型號(hào)設(shè)備),dr_v2(門(mén)禁設(shè)備V2型號(hào)設(shè)備)。
我們是基于msm8937_64上來(lái)擴(kuò)展為支持幾個(gè)項(xiàng)目共用一套代碼,為驗(yàn)證這套機(jī)制的基本實(shí)現(xiàn),我們以修改“設(shè)置--->關(guān)于手機(jī)--->型號(hào)”來(lái)驗(yàn)證,這個(gè)對(duì)應(yīng)device\qcom\msm8937_64\msm8937_64.mk的PRODUCT_MODEL的值。其他部分的兼容性在此基礎(chǔ)上展開(kāi)。
查找了device、system、hardware、vendor和build目錄
Msm8937下lk部分是對(duì)應(yīng)msm8952目錄,但lk目錄修改較少
?
這里面的device/qcom/8937_64是針對(duì)8937 64位的,目錄如下:
我們是基于框CPU來(lái)開(kāi)發(fā)幾款產(chǎn)品,所以可以在此目錄下把共同部分保持原來(lái)的目錄結(jié)構(gòu),產(chǎn)品可能不同的就放在新創(chuàng)建的對(duì)應(yīng)的目錄下,比如針對(duì)于evb(評(píng)估板),我們?cè)赿evice\qcom\msm8937_64下新建device_evb文件夾,把差異性部分放在這里,其他產(chǎn)品類(lèi)似。
?
先來(lái)看看高通默認(rèn)的編譯之前的操作配置
(1)?? source build/envsetup.sh
(2)?? lunch msm8937_64-userdebug
?
2.1? source build/envsetup.sh
使當(dāng)前shell讀入build/envsetup.sh的shell文件并依次執(zhí)行文件中的所有語(yǔ)句,通常用于重新執(zhí)行剛修改的初始化文件,使之立即生效,而不必注銷(xiāo)并重新登錄
?
打印的信息
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的文件并執(zhí)行
這來(lái)會(huì)找到并執(zhí)行其中的device\qcom\common\vendorsetup.sh,此sh相關(guān)的有
…
add_lunch_combo msm8937_32-userdebug
add_lunch_combo msm8937_64-userdebug
add_lunch_combo msm8953_32-userdebug
…
也就是調(diào)用add_lunch_combo這個(gè)函數(shù),將各自產(chǎn)品添加到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_CHOICESfunction add_lunch_combo(){local new_combo=$1local cfor c in ${LUNCH_MENU_CHOICES[@]} ; doif [ "$new_combo" = "$c" ] ; thenreturnfidoneLUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)}這里重點(diǎn)是收集所有的vendor清單,用echo ${LUNCH_MENU_CHOICES[@]}打印出來(lái)的值
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文件也會(huì)加載到當(dāng)前終端來(lái),它是用來(lái)實(shí)現(xiàn)adb命令的bash completion功能的。也就是說(shuō),加載了該文件之后,我們?cè)谶\(yùn)行adb相關(guān)的命令的時(shí)候,通過(guò)按tab鍵就可以幫助我們自動(dòng)完成命令的輸入。關(guān)于bash completion的知識(shí),可以參考官方文檔:?http://www.gnu.org/s/bash/manual/bash.html#Programmable-Completion。
2.2? lunch msm8937_64-userdebug
說(shuō)明下,如果沒(méi)有前面的source build/envsetup.sh,將會(huì)提示-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()
這里會(huì)執(zhí)行build/core/config.mk
(2)?? printconfig
lunch()--->printconfig()--->get_build_var(),此函數(shù)的參數(shù)是report_config,在core/dumpvar.mk中的print_build_config_vars對(duì)應(yīng)上面打印的信息,但他們的值怎來(lái)的呢
?
(3)?? ?
2.3? ?
,DEVELOP_PRODUCT對(duì)應(yīng)這3個(gè)項(xiàng)目的名稱(chēng)為evb(評(píng)估板)、ht_v8(手持機(jī)v8型號(hào)設(shè)備),dr_v2(門(mén)禁設(shè)備V2型號(hào)設(shè)備)。
?
3.1? DEVELOP_PRODUCT能夠手動(dòng)選擇并全局生效
手動(dòng)輸入,默認(rèn)為evb
要實(shí)現(xiàn)這個(gè)多產(chǎn)品選項(xiàng)
/build/envsetup.sh的lunch()調(diào)用新增的choose_develop_product(),如下:
PRODUCT_CHOICES=(evb ht_v8 dr_v2)# check to see if the supplied variant is validfunction check_develop_product(){for v in ${PRODUCT_CHOICES[@]}doif [ "$v" = "$1" ]thenreturn 0fidonereturn 1}function choose_develop_product(){echo $1T=$(gettop)echo "product choices are:"local index=1local vfor 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))donelocal default_value=evblocal ANSWERexport DEVELOP_PRODUCT=while [ -z "$DEVELOP_PRODUCT" ]doecho -n "Which would you like? [$default_value] "if [ -z "$1" ] ; thenread ANSWERelseecho $1ANSWER=$1fiif [ -z "$ANSWER" ] ; thenexport DEVELOP_PRODUCT=$default_valueelif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; thenif [ "$ANSWER" -le "${#PRODUCT_CHOICES[@]}" ] ; thenexport DEVELOP_PRODUCT=${PRODUCT_CHOICES[$(($ANSWER-1))]}fielseif check_develop_product $ANSWERthenexport DEVELOP_PRODUCT=$ANSWERelseecho "** Not a valid project: $ANSWER"fifiif [ -n "$1" ] ; thenbreakfidone}function lunch(){local answerchoose_develop_product $2…}3.2? 我們以修改“設(shè)置--->關(guān)于手機(jī)--->型號(hào)”來(lái)驗(yàn)證
這個(gè)對(duì)應(yīng)device\qcom\msm8937_64\msm8937_64.mk的PRODUCT_MODEL的值,默認(rèn)為
PRODUCT_MODEL := msm8937 for arm64
?
實(shí)現(xiàn)這個(gè)驗(yàn)證的主要實(shí)現(xiàn)如下:
(1)?? 創(chuàng)建product_evb文件夾
在device\qcom\msm8937_64下創(chuàng)建product_evb文件夾
(2)?? product_evb文件夾創(chuàng)建msm8937_64_evb.mk文件
此文件下的內(nèi)容PRODUCT_MODEL := evb
(3)?? msm8937_64.mk把msm8937_64_evb.mk文件包含進(jìn)來(lái)
include device/qcom/msm8937_64/product_$(DEVELOP_PRODUCT)/msm8937_64_$(DEVELOP_PRODUCT).mk
這里用到了記錄產(chǎn)品型號(hào)的DEVELOP_PRODUCT變量。
?
參考鏈接:
深入淺出 - Android系統(tǒng)移植與平臺(tái)開(kāi)發(fā)(十一)- Android系統(tǒng)的定制
https://blog.csdn.net/mr_raptor/article/details/30113417?readlog
?
為android源碼添加新設(shè)備支持概述
https://blog.csdn.net/felix_wangq/article/details/49834207
?
為android系統(tǒng)添加產(chǎn)品的過(guò)程
https://blog.csdn.net/getnextwindow/article/details/48158873
?
Android 系統(tǒng)添加新項(xiàng)目及配置
https://blog.csdn.net/zhbpd/article/details/50274715
?
msm8909+android5.1.1編譯前配置及增加新項(xiàng)目和產(chǎn)品所需分支
https://www.2cto.com/kf/201602/491312.html
?
Android集成一個(gè)新產(chǎn)品時(shí),lunch的product name和device name注意事項(xiàng)
https://www.2cto.com/kf/201512/454247.html
總結(jié)
以上是生活随笔為你收集整理的android系统源代码添加新产品的支持的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mipi LCD 的CLK时钟频率与显示
- 下一篇: WinSCP远程访问linux服务器和编