android系统源代码添加新产品的支持
不同項目共用一個CPU等核心平臺,項目外圍有些差異,需要共用絕大部分代碼,比如我們基于高通msm8937 64位CPU開發(fā)3款產品(每款產品定義為一個項目的體現(xiàn)形式),我們用DEVELOP_PROJECT來記錄并區(qū)分,DEVELOP_PRODUCT對應這3個項目的名稱為evb(評估板)、ht_v8(手持機v8型號設備),dr_v2(門禁設備V2型號設備)。
我們是基于msm8937_64上來擴展為支持幾個項目共用一套代碼,為驗證這套機制的基本實現(xiàn),我們以修改“設置--->關于手機--->型號”來驗證,這個對應device\qcom\msm8937_64\msm8937_64.mk的PRODUCT_MODEL的值。其他部分的兼容性在此基礎上展開。
查找了device、system、hardware、vendor和build目錄
Msm8937下lk部分是對應msm8952目錄,但lk目錄修改較少
?
這里面的device/qcom/8937_64是針對8937 64位的,目錄如下:
我們是基于框CPU來開發(fā)幾款產品,所以可以在此目錄下把共同部分保持原來的目錄結構,產品可能不同的就放在新創(chuàng)建的對應的目錄下,比如針對于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文件并依次執(zhí)行文件中的所有語句,通常用于重新執(zhí)行剛修改的初始化文件,使之立即生效,而不必注銷并重新登錄
?
打印的信息
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í)行
這來會找到并執(zhí)行其中的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這個函數(shù),將各自產品添加到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)}這里重點是收集所有的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文件也會加載到當前終端來,它是用來實現(xiàn)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()
這里會執(zhí)行build/core/config.mk
(2)?? printconfig
lunch()--->printconfig()--->get_build_var(),此函數(shù)的參數(shù)是report_config,在core/dumpvar.mk中的print_build_config_vars對應上面打印的信息,但他們的值怎來的呢
?
(3)?? ?
2.3? ?
,DEVELOP_PRODUCT對應這3個項目的名稱為evb(評估板)、ht_v8(手持機v8型號設備),dr_v2(門禁設備V2型號設備)。
?
3.1? DEVELOP_PRODUCT能夠手動選擇并全局生效
手動輸入,默認為evb
要實現(xiàn)這個多產品選項
/build/envsetup.sh的lunch()調用新增的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? 我們以修改“設置--->關于手機--->型號”來驗證
這個對應device\qcom\msm8937_64\msm8937_64.mk的PRODUCT_MODEL的值,默認為
PRODUCT_MODEL := msm8937 for arm64
?
實現(xiàn)這個驗證的主要實現(xiàn)如下:
(1)?? 創(chuàng)建product_evb文件夾
在device\qcom\msm8937_64下創(chuàng)建product_evb文件夾
(2)?? product_evb文件夾創(chuàng)建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系統(tǒng)移植與平臺開發(fā)(十一)- Android系統(tǒng)的定制
https://blog.csdn.net/mr_raptor/article/details/30113417?readlog
?
為android源碼添加新設備支持概述
https://blog.csdn.net/felix_wangq/article/details/49834207
?
為android系統(tǒng)添加產品的過程
https://blog.csdn.net/getnextwindow/article/details/48158873
?
Android 系統(tǒng)添加新項目及配置
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
總結
以上是生活随笔為你收集整理的android系统源代码添加新产品的支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mipi LCD 的CLK时钟频率与显示
- 下一篇: WinSCP远程访问linux服务器和编