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的值。其他部分的兼容性在此基础上展开。
- 查找包含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_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文件也会加载到当前终端来,它是用来实现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 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
实现这个验证的主要实现如下:
(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
android系统源代码添加新产品的支持相关推荐
- 在Android系统中添加一款新铃声
想在Android系统中添加铃声,可以通过adb push 的方法,但如果要多次修改系统,每次push进去就显得太费劲了,这里有个简单的方法,就是把铃声编译进android 的system.img文件 ...
- 《Android系统源代码情景分析》一书勘误
在大家的支持和鼓励下,<Android系统源代码情景分析>一书得以出版了,老罗在此首先谢过大家了.本书的内容来源于博客的文章,经过大半年的整理之后,形成了初稿.在正式出版之前,又经过了三次 ...
- Android系统源代码下载
引用:http://www.cnblogs.com/mandroid/archive/2011/06/06/2073473.html 一.概述 众所周知,Android移动操作系统是Google花费了 ...
- Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?
在上一篇中我们用Android系统源代码分析了我们前面写的代码,有的朋友可能就会问怎么才能下载到Google官方的源代码呢?下面我们通过Git管理工具来对Android系统源代码进行下载.另外为了方便 ...
- Android系统源代码情景分析:基础知识
老罗(罗升阳)发表在的InfoQ上的好文,最新在学习Android,转载一下,方便学习. 老罗的CSDN blog链接:http://blog.csdn.net/Luoshengyang/ 原文链接: ...
- 老罗的《Android系统源代码情景分析》翻了10遍还看不懂?因为你用错了
最近老朽又把罗升阳老师的<Android系统源代码情景分析>拿出来啃了一番. 为什么要加个"又"呢?因为从老罗的第一版开始到迄今为止尚未更新的第三版为止,每年有学习冲动 ...
- (Linux)在Ubuntu系统中添加新用户并授予root权限
向Ubuntu系统中添加新用户并为其授予root权限的步骤如下: 打开终端Terminal 输入命令: sudo su - 以 root 身份登录. 注: sudo su : 切换root身份, 不携 ...
- 向Android系统中添加模块及产品流程
添加Android模块 一.基础知识: (1)在Android系统中,编译都是以模块(而不是文件)作为单位的,每个模块都有一个唯一的名称: (2)为了将模块编译到Android系统中,每个模块都需 ...
- Android 系统各版本新特性总结
Android 4.0 Space 留白 PopupMenu GlidLayout 网格布局 Android 5.0 MaterialDesign设计风格 Material Theme Meteria ...
最新文章
- [NOI2014]魔法森林题解
- QtCreater的安装路径
- 数据中心网络架构和设计指南
- 第二阶段_第一小节_小知识
- java 高级泛型_Java 泛型高级
- sqlite insert数据要用“?”代替“%s”
- c++二维数组指针详解
- java基础—网络编程——TCP客户端与服务端交互
- 【AI研究报告】世界顶级投资银行高盛的AI报告:中国人工智能的现状及创新市场...
- 你们的前端是怎么入门的?(并且找到工作)?
- vant 底部导航栏 中间凸起
- 原生js的JSONP跨域请求
- 【小沐学NLP】Python实现词云图
- 如何安装python自带的pip_python自带的pip在哪里
- 花1亿扶持优质红人,如涵推动网红经济出圈之路有何深意?
- final37另一种插值方法:在端点处插入相等的值
- python刷页面浏览量
- leaflet加载天地图DataServer
- 计算机毕设(附源码)JAVA-SSM教务排课管理系统
- 万事俱备,只欠价格? — 华为 MateBook 13 长测
热门文章
- linux 等待子线程退出,等待一组子线程退出的问题__线程_pthread_join_终止_pthread_detach_释放__169IT.COM...
- linux下mvn的运行配置,Linux内网环境下使用Nexus配置Maven私有仓库
- 036_Unicode对照表二
- html 中如何写js代码提示错误,javascript怎么进行错误处理?
- 如何查看tomcat是否安装成功_如何查看网站是否被收录?
- 生鲜配送小程序源码_生鲜配送小程序开发
- stm32qspi内存映射_STM32F7-discovery QSPI接口使用心得
- java提供密码加密的实现
- c语言小学生加法考试题程序4,c语言编程题及答案.doc
- 圆柱属于能滚动的物体吗_中班科学活动教案:滚动的物体教案(附教学反思)