不同项目共用一个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_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

  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 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系统源代码添加新产品的支持相关推荐

  1. 在Android系统中添加一款新铃声

    想在Android系统中添加铃声,可以通过adb push 的方法,但如果要多次修改系统,每次push进去就显得太费劲了,这里有个简单的方法,就是把铃声编译进android 的system.img文件 ...

  2. 《Android系统源代码情景分析》一书勘误

    在大家的支持和鼓励下,<Android系统源代码情景分析>一书得以出版了,老罗在此首先谢过大家了.本书的内容来源于博客的文章,经过大半年的整理之后,形成了初稿.在正式出版之前,又经过了三次 ...

  3. Android系统源代码下载

    引用:http://www.cnblogs.com/mandroid/archive/2011/06/06/2073473.html 一.概述 众所周知,Android移动操作系统是Google花费了 ...

  4. Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?

    在上一篇中我们用Android系统源代码分析了我们前面写的代码,有的朋友可能就会问怎么才能下载到Google官方的源代码呢?下面我们通过Git管理工具来对Android系统源代码进行下载.另外为了方便 ...

  5. Android系统源代码情景分析:基础知识

    老罗(罗升阳)发表在的InfoQ上的好文,最新在学习Android,转载一下,方便学习. 老罗的CSDN blog链接:http://blog.csdn.net/Luoshengyang/ 原文链接: ...

  6. 老罗的《Android系统源代码情景分析》翻了10遍还看不懂?因为你用错了

    最近老朽又把罗升阳老师的<Android系统源代码情景分析>拿出来啃了一番. 为什么要加个"又"呢?因为从老罗的第一版开始到迄今为止尚未更新的第三版为止,每年有学习冲动 ...

  7. (Linux)在Ubuntu系统中添加新用户并授予root权限

    向Ubuntu系统中添加新用户并为其授予root权限的步骤如下: 打开终端Terminal 输入命令: sudo su - 以 root 身份登录. 注: sudo su : 切换root身份, 不携 ...

  8. 向Android系统中添加模块及产品流程

     添加Android模块  一.基础知识: (1)在Android系统中,编译都是以模块(而不是文件)作为单位的,每个模块都有一个唯一的名称: (2)为了将模块编译到Android系统中,每个模块都需 ...

  9. Android 系统各版本新特性总结

    Android 4.0 Space 留白 PopupMenu GlidLayout 网格布局 Android 5.0 MaterialDesign设计风格 Material Theme Meteria ...

最新文章

  1. [NOI2014]魔法森林题解
  2. QtCreater的安装路径
  3. 数据中心网络架构和设计指南
  4. 第二阶段_第一小节_小知识
  5. java 高级泛型_Java 泛型高级
  6. sqlite insert数据要用“?”代替“%s”
  7. c++二维数组指针详解
  8. java基础—网络编程——TCP客户端与服务端交互
  9. 【AI研究报告】世界顶级投资银行高盛的AI报告:中国人工智能的现状及创新市场...
  10. 你们的前端是怎么入门的?(并且找到工作)?
  11. vant 底部导航栏 中间凸起
  12. 原生js的JSONP跨域请求
  13. 【小沐学NLP】Python实现词云图
  14. 如何安装python自带的pip_python自带的pip在哪里
  15. 花1亿扶持优质红人,如涵推动网红经济出圈之路有何深意?
  16. final37另一种插值方法:在端点处插入相等的值
  17. python刷页面浏览量
  18. leaflet加载天地图DataServer
  19. 计算机毕设(附源码)JAVA-SSM教务排课管理系统
  20. 万事俱备,只欠价格? — 华为 MateBook 13 长测

热门文章

  1. linux 等待子线程退出,等待一组子线程退出的问题__线程_pthread_join_终止_pthread_detach_释放__169IT.COM...
  2. linux下mvn的运行配置,Linux内网环境下使用Nexus配置Maven私有仓库
  3. 036_Unicode对照表二
  4. html 中如何写js代码提示错误,javascript怎么进行错误处理?
  5. 如何查看tomcat是否安装成功_如何查看网站是否被收录?
  6. 生鲜配送小程序源码_生鲜配送小程序开发
  7. stm32qspi内存映射_STM32F7-discovery QSPI接口使用心得
  8. java提供密码加密的实现
  9. c语言小学生加法考试题程序4,c语言编程题及答案.doc
  10. 圆柱属于能滚动的物体吗_中班科学活动教案:滚动的物体教案(附教学反思)