编译拆https://blog.csdn.net/dongyi1988/article/details/128629011
结构拆https://blog.csdn.net/dongyi1988/article/details/128633808
一、背景
android设备已经遍及各行各业,手机整个项目阶段包括需求沟通,硬件设计打板,研发联调,小批量测试等,其中研发联调可能只有3-4个月时间,涉及的版本可能包括国内版本、国际版本、线下商店演示版本、认证版本、生产版本。手机终端设备更是10个月一个新产品,3个月迭代出新版本。
如此多的工作内容,如此紧迫的工期,项目该如何处理?这里谈下项目架构方面内容,不谈项目管理。
下面就认识下android手机的差异性需求:
华为系有harmonyOS,小米有MIUI、OPPO有colorOS,显然每个厂家都有自己UI方案。
芯片平台区分于高通芯片、联发科芯片、麒麟芯片,芯片平台还区分高中低端芯片。
手机除芯片外硬件种类繁多,例如RAM、充电IC、电池、摄像头、屏幕、WLAN&NFC&BT、指纹、各种sensor(加速度传感器、光感、距感、陀螺仪等)等等;单个硬件厂商也是繁多,光屏幕就包括三星、京东方、天马、LG、TCL等等。并且手机厂商为了规避风险一般一种器件会选择二种以上的供应商。
厂商一般有定制手机应用与特性UI,例如互联互通、商务机、游戏性能机、老年机、特殊行业机。这区别于NFC、指纹等硬件功能相关的差异性。
还需要适应不同国家地区的射频频段,输入法与语言,符合当地的法律法规等需求。
不同场景线下的版本需求又有差异,会出现上面提到的商店演示版本、认证版本、生产版本、正式用户版本。
如此多的差异需要一个拆分解耦思想,把工作任务拆分出来,分给各个领域去实现。当然这个差异还能再分,但不再细说。这里主要讲的是andorid系统设备软件结构拆分思路,大家理解即可。
二、android架构 极简介
早期开发一般是如下图的开发方式
开机流程
https://blog.csdn.net/dongyi1988/article/details/103994152?spm=1001.2014.3001.5501
EDL、recovery、android三个模式启动大概流程如上图,modem、安全域与稳定性相关就不扩展。
开机镜像
按开机流程都会有对应镜像https://blog.csdn.net/ly890700/article/details/67634784
sbl1.img(abl) Partition for secondary boot loader
emmc_appsboot.mbn(aboot) Partition for apps boot loader
recovery.img(recovery) This is specially designed for backup. The recovery partition can be considered as an alternative boot partition
boot.img(boot): Android bootimg, kernel, ramdisk, page size: 2048, cmdline (console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 androidbo)
system.img(system): This partition contains the entire Android OS, other than the kernel and the ramdisk. This includes the Android GUI and all the system applications that come pre-installed on the device
vendor.img(vendor): 芯片域
odm.img(odm) : 厂商定制
dtbo.img(dtbo): 设备树叠加层
域的概念
按照背景里面提到的需求差异,我们增加域的概念,每个域负责不同类型的差异化需求。
system系统域,负责系统的差异化,例如harmonyOS、MIUI、colorOS;
vendor芯片域,负责芯片的差异化,例如高通、MTK、海思、全志等;
device设备域,负责外设的差异化,例如TP、LCD、memory、充电IC、NFC、指纹等等硬件的差异;
odm厂商域,负责厂商的产品系列定制,例如定制应用与UI、商务机、游戏性能机、老年机、特殊行业机等;
product产品域,负责地域与法规的差异化;
version版本域,负责场景的差异化处理版本差异。
三、结构拆分
拆分目的是项目任务拆分,并行开发。每个域独立开发同时增加域的复用性,减少重复移植,提高效率。
2020年在https://blog.csdn.net/dongyi1988/article/details/103995862blog中提到,如果repo可以include,<google的manifest>,<方案商的manifest>,<自己的manifest>来共同管理一套源码,将是非常爽的事情,其实google,方案商,一些厂商一直都在往这方向努力。
所以这拆分不是我提出来,不是copy某厂商,不涉及厂商方案,这里只说下google与平台方案商的拆分,以及部分已知技术。再来波三连图强调。
思想
我们按域的概念将整个终端业务开发工作拆分成各个领域工作,各个领域部门管理自己的代码分支,独立开发编译,生成的镜像在出版本时再组包发布。
a.代码拆分,各领域负责自己的代码;
b.镜像拆分,各领域负责自己的镜像,标注版本和更新list;
c.如果功能有领域交叉内容,功能负责人整理补丁给相关领域;
d.版本发布时,匹配各个领域的镜像,进行组合打包。
优劣评估
优势
首先就是工作的分工,并行开发带来效率的提升;
加快编译与调试速度,自己负责领域只需要编译自己领域镜像,再进行组包即可;
模块的分工可以扩展商业模式,device域可以交给供应商,vendor域可以外包;
研发可以更专注自己的领域,远离移植,远离无效加班;
产品系列省去移植步骤,更多精力去迭代成长,有问题也可快速追溯;
厂商可以保护自己核心技术、核心需求方案,不断淬炼,形成技术or需求壁垒;
各域的镜像版本可以任意组合;
快速定制;
提供定制指导后,还能卖方案。
劣势
需要各域剥离成功的成熟主干;
需要合理架构规划,整个系统必须能拆能组;
剥离与架构规划难度高,需要资深开发与架构;
各域开发管理更多项目产品,需要专业的程序员;
跨域功能需求容易产生责任/分工上的分歧甚至冲突。
四、拆分相关技术
modem、安全域与稳定性会使整个拆分更复杂化,这里不扩展。
后面与技术细节更紧密,分开来讲;这里给个目录结构,均是现有成熟技术,欢迎厂商审查。
编译方案与技术
网址https://blog.csdn.net/dongyi1988/article/details/128629011
代码管理
拆包
vndk
打包
签名
结构拆分方案与技术
网址https://blog.csdn.net/dongyi1988/article/details/128633808