编译拆https://blog.csdn.net/dongyi1988/article/details/128629011
结构拆https://blog.csdn.net/dongyi1988/article/details/128633808
google对android架构的拆分
android的linux内核解耦https://blog.csdn.net/dongyi1988/article/details/128731557
android的system域解耦https://blog.csdn.net/dongyi1988/article/details/128739983
android设备已经遍及各行各业,手机整个项目阶段包括需求沟通,硬件设计打板,研发联调,小批量测试等,涉及的版本可能包括国内版本、国际版本、线下商店演示版本、认证版本、生产版本。现实是终端设备是10个月一个新产品,3个月迭代出新版本,新产品真正给研发的时间可能只有3-4个月时间。
如此多的工作内容,如此紧迫的工期,项目该如何处理?这里谈下项目架构方面内容,不谈项目管理。
下面就认识下android手机的差异性需求:
华为系有harmonyOS,小米有MIUI、OPPO有colorOS,显然每个厂家都有自己UI方案。
芯片平台区分于高通芯片、联发科芯片、麒麟芯片等,芯片还区分高中低端产品。
手机除芯片外硬件种类繁多,例如RAM、充电IC、电池、摄像头、屏幕、WLAN&NFC&BT、指纹、各种sensor(加速度传感器、光感、距感、陀螺仪等)等等;单个硬件厂商也是繁多,光屏幕就包括三星、京东方、天马、LG、TCL等等。并且手机厂商为了规避风险一般一种器件会选择二种以上的供应商。
厂商一般有定制手机应用与特性UI,例如互联互通、商务机、游戏性能机、老年机、特殊行业机。这区别于NFC、指纹等硬件功能相关的差异性。
还需要适应不同国家地区的射频频段,输入法与语言,符合当地的法律法规等需求。
不同场景线下的版本需求又有差异,会出现上面提到的商店演示版本、认证版本、生产版本、正式用户版本。
如此多的差异需要一个拆分解耦思想,把工作任务拆分出来,分给各个领域去实现。当然这个差异还能再分,但不再细说。这里主要讲的是andorid系统设备软件结构拆分思路,大家理解即可。
早期开发一般是如下图的开发方式
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,
所以这拆分不是我提出来,不是copy某厂商,不涉及厂商方案,这里只说下google与平台方案商的拆分,以及部分已知技术。再来波否认三连图强调。
我们按域的概念将整个终端业务开发工作拆分成各个领域,各领域部门管理自己的代码分支,独立开发编译,生成的镜像在出版本时再组包发布。
a.代码拆分,各领域负责自己的代码;
b.镜像拆分,各领域负责自己的镜像,标注版本和更新list;
c.如果功能有领域交叉内容,功能负责人整理补丁给相关领域;
d.版本发布时,匹配各个领域的镜像,进行组合打包。
android官网划分
基本就是拆分解耦的优劣
优势
首先就是工作的分工,并行开发带来效率的提升;
加快编译与调试速度,只需要编译自己负责领域的镜像,再进行组包即可;
模块的分工可以扩展商业模式,device域可以交给供应商,vendor域可以外包;
产品省去移植步骤,研发可以更专注自己的领域,更多精力去迭代成长,远离移植,远离无效加班;
同因问题可类比追溯;
厂商可以保护自己核心技术、核心需求方案,不断淬炼形成技术or需求壁垒;
各域的镜像版本可以任意组合;
快速定制,提供定制指导后,还能卖方案。
劣势
1.需要各域剥离完善的成熟主干;
2.需要合理架构规划,整个系统必须能拆能组;
3.剥离与架构规划难度高,需要资深开发与架构;
4.一个地方出了问题影响多项目产品,需要专业的程序员;
5.跨域的功能容易产生责任/分工上的分歧,甚至冲突。
modem、安全域与稳定性会使整个拆分更复杂化,这里不扩展。
后面与技术细节更紧密,分开blog来讲;这里给个目录结构,均是现有成熟技术,欢迎厂商审查。
网址https://blog.csdn.net/dongyi1988/article/details/128629011
网址https://blog.csdn.net/dongyi1988/article/details/128633808
网址