android架构拆分方案

news2024/11/28 20:45:05

编译拆https://blog.csdn.net/dongyi1988/article/details/128629011

结构拆https://blog.csdn.net/dongyi1988/article/details/128633808

一、背景

android设备已经遍及各行各业,手机整个项目阶段包括需求沟通,硬件设计打板,研发联调,小批量测试等,其中研发联调可能只有3-4个月时间,涉及的版本可能包括国内版本、国际版本、线下商店演示版本、认证版本、生产版本。手机终端设备更是10个月一个新产品,3个月迭代出新版本。

如此多的工作内容,如此紧迫的工期,项目该如何处理?这里谈下项目架构方面内容,不谈项目管理。

下面就认识下android手机的差异性需求:

  1. 华为系有harmonyOS,小米有MIUI、OPPO有colorOS,显然每个厂家都有自己UI方案。

  1. 芯片平台区分于高通芯片、联发科芯片、麒麟芯片,芯片平台还区分高中低端芯片。

  1. 手机除芯片外硬件种类繁多,例如RAM、充电IC、电池、摄像头、屏幕、WLAN&NFC&BT、指纹、各种sensor(加速度传感器、光感、距感、陀螺仪等)等等;单个硬件厂商也是繁多,光屏幕就包括三星、京东方、天马、LG、TCL等等。并且手机厂商为了规避风险一般一种器件会选择二种以上的供应商。

  1. 厂商一般有定制手机应用与特性UI,例如互联互通、商务机、游戏性能机、老年机、特殊行业机。这区别于NFC、指纹等硬件功能相关的差异性。

  1. 还需要适应不同国家地区的射频频段,输入法与语言,符合当地的法律法规等需求。

  1. 不同场景线下的版本需求又有差异,会出现上面提到的商店演示版本、认证版本、生产版本、正式用户版本。

如此多的差异需要一个拆分解耦思想,把工作任务拆分出来,分给各个领域去实现。当然这个差异还能再分,但不再细说。这里主要讲的是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.版本发布时,匹配各个领域的镜像,进行组合打包。

优劣评估

优势

  1. 首先就是工作的分工,并行开发带来效率的提升;

  1. 加快编译与调试速度,自己负责领域只需要编译自己领域镜像,再进行组包即可;

  1. 模块的分工可以扩展商业模式,device域可以交给供应商,vendor域可以外包;

  1. 研发可以更专注自己的领域,远离移植,远离无效加班;

  1. 产品系列省去移植步骤,更多精力去迭代成长,有问题也可快速追溯;

  1. 厂商可以保护自己核心技术、核心需求方案,不断淬炼,形成技术or需求壁垒;

  1. 各域的镜像版本可以任意组合;

  1. 快速定制;

  1. 提供定制指导后,还能卖方案。

劣势

需要各域剥离成功的成熟主干;

需要合理架构规划,整个系统必须能拆能组;

剥离与架构规划难度高,需要资深开发与架构;

各域开发管理更多项目产品,需要专业的程序员;

跨域功能需求容易产生责任/分工上的分歧甚至冲突。

四、拆分相关技术

modem、安全域与稳定性会使整个拆分更复杂化,这里不扩展。

后面与技术细节更紧密,分开来讲;这里给个目录结构,均是现有成熟技术,欢迎厂商审查。

编译方案与技术

网址https://blog.csdn.net/dongyi1988/article/details/128629011

代码管理

拆包

vndk

打包

签名

结构拆分方案与技术

网址https://blog.csdn.net/dongyi1988/article/details/128633808

GKI

DTB&DTBO

ko模块动态加载

ODM、product、version编译

GSI

vendor 域 MTK&QCOM

VNDK

技术扩展

开机logo自适应方案

selinux

overlayfs

域的实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新网站如何快速被收录?网站收录如何查询

新网站如何快速被收录? 首先是向搜索引擎提交 各大搜索引擎都向网站提供了自动提交功能&#xff0c;而百度搜索引擎也有网站提交入口&#xff0c;主动提交网站能够增加百度收录几率&#xff0c;让搜索引擎尽快发现我们的网站已经上线。 然后是做好SEO优化&#xff1b; 1.网站内…

强(矩阵快速幂)

题目描述 Lh&#xff1a;粉兔你教我一下抽屉原理吧 Clz&#xff1a;就是给你一个长度为 n 的序列&#xff0c;每个数只能取 0,1,2&#xff0c;那你连续取三个数必然有两个相等…… Lh&#xff1a;等等你梭啥&#xff0c;再说一遍 Clz&#xff1a;……emmm 当我没说 Marser&…

测试框架 Jest 实用教程

官网 https://jestjs.io/docs/getting-started 安装 cnpm i --save-dev jest使用 在项目中的任意位置&#xff08;通常单独建个名为 test 的文件夹&#xff09;新建以 .test.js 为后缀的测试文件&#xff0c;如 expect.test.js &#xff08;若项目中有 test.js 存在&#xff0c…

【阶段三】Python机器学习10篇:机器学习项目实战:K近邻算法的基本原理、计算步骤与KNN(K近邻)分类模型

本篇的思维导图: K近邻算法(英文为K-Nearest Neighbor,因而又简称KNN算法)是非常经典的机器学习算法。 K近邻算法的基本原理 K近邻算法的原理非常简单:对于一个新样本,K近邻算法的目的就是在已有数据中寻找与它最相似的K个数据,或者说“离它最近”的K个数…

设计模式——备忘录模式

备忘录模式一、基本思想二、应用场景三、结构图四、代码五、优缺点5.1 优点5.2 缺点一、基本思想 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫…

Bilibili支持了AV1编码,关于AV1编码你知道吗?

Bilibili支持了AV1编码&#xff0c;关于AV1编码你知道吗&#xff1f; AV1编码是一种新的视频编码标准&#xff0c;由联合开发的开源编码器&#xff0c;它由英特尔、微软、谷歌、苹果、Netflix、AMD、ARM、NVIDIA和其他一些公司共同开发&#xff0c;旨在替代H.264和HEVC等现有的…

Word控件 Aspose.words for.NET 授权须知

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

实验 2 灰度变换与空间滤波

目录实验 2 灰度变换与空间滤波一、实验目的二、实验例题1. 灰度变换函数 imadjust2. 使用对数变换压缩动态范围。3. 直方图均衡化 histogram equalization实验 2 灰度变换与空间滤波 一、实验目的 掌握灰度变换的原理和应用。掌握对数变换、幂律变换和直方图均衡化的原理和应…

融合注意力模块SE基于轻量级yolov5s实践路面坑洼目标检测系统

在很多的项目实战中验证分析注意力机制的加入对于模型最终性能的提升发挥着积极正向的作用&#xff0c;在我之前的一些文章里面也做过了一些尝试&#xff0c;这里主要是想基于轻量级的s系列模型来开发构建路面坑洼检测系统&#xff0c;在模型中加入SE注意力模块&#xff0c;以期…

Android开发-AS学习(二)

1.5 ProgressBar常用属性描述android:max进度条的最大值android:progress进度条已完成进度值android:indeterminate如果设置为true&#xff0c;则进度条不精确显示进度style“&#xff1f;android:attr/progressBarStyleHorizontal"水平进度条MainActivity.java package c…

机试_1_暴力求解

一、枚举 判断是否可以使用枚举&#xff1a;分析数据量。 若时间限制在1000ms的情况下&#xff0c;大约可以进行10⁷的运算。 复杂度数据量O(n!)10O(2ⁿ)20O(n)200O(n)3000O(nlogn)10⁶O(n)10⁷O(√10)10⁴O(logn)>10⁰1 abc–清华大学 描述 设a、b、c均是0到9之间的数字…

Java课程设计——学生成绩管理系统

1 需求分析1.1 需求分析概述需求分析是开发软件系统的重要环节&#xff0c;是系统开发的第一步和基础环节。通过需求分析充分认识系统的目标、系统的各个组成部分、各部分的任务职责、工作流程、工作中使用的各种数据及数据结构、各部门的业务关系和数据流程等&#xff0c; 为系…

nacos的配置管理

前言 此博客对nacos的配置管理进行简单介绍&#xff0c;如果降配置文件放在项目中&#xff0c;那么每次进行修改后都要重新编译部署项目&#xff0c;是极其不方便的&#xff0c;如果将配置文件放在一个固定的位置&#xff0c;尽管解决了以上的问题&#xff0c;但是管理起来还不…

【Java寒假打卡】Java基础-File

【Java寒假打卡】Java基础-File概述-三种构造方法绝对路径和相对路径File的创建功能File的删除功能File的判断和获取功能listFile方法练习1&#xff1a;在当前模块下面aaa文件夹创建一个文件a.txt练习2&#xff1a;删除一个多级文件夹练习3&#xff1a;统计一个文件夹中每一种文…

UE插件和项目目录结构学习笔记

Plugins插件的二种安装方式 1、安装到虚幻引擎&#xff08;推荐&#xff09; 转到虚幻引擎安装位置的插件文件夹 Engine/Plugins 将解压得到的插件文件夹放入Marketplace文件夹下&#xff08;如没有新建一个&#xff09;。 启动虚幻引擎打开项目&#xff0c;菜单->编辑->…

如何在线免费将PPT转PDF格式

我们经常会遇到制作演示文稿PPT的格式&#xff0c;但是这种格式一般在传阅的过程中稳定性都较差&#xff0c;所以很多人会选择转成PDF格式&#xff0c;那么有没有免费的处理方式呢&#xff1f; 打开浏览器搜索speedpdf找到并打开在线转换工具首页&#xff0c;选择主页上的PPT转…

Python表白妙招,把情书写进她的照片里

前言 我的好兄弟们&#xff0c;2022年可算是过去了&#xff0c;这不马上要过年了吗 就是说&#xff0c;各位兄弟有对象了吗&#xff0c;没有的回家还要面对亲戚的各种提问 退一步来说&#xff0c;有心仪的人吗&#xff0c;如果有的话&#xff0c;就来看看这篇 程序员的表白小…

【Vue + Koa 前后端分离项目实战7】使用开源框架==>快速搭建后台管理系统 -- part7 前端实现最新期刊管理【增删查改】

人生没有白走的路&#xff0c;每一步都作数。 对应后端部分章节回顾&#xff1a; 【Vue Koa 前后端分离项目实战5】使用开源框架&#xff1e;快速搭建后台管理系统 -- part5 后端实现最新期刊列表管理【增删查改】_小白Rachel的博客-CSDN博客 效果展示&#xff1a; 目录 一、…

少儿Python每日一题(15):回文数

原题解答 本次的题目如下所示: 【编程实现】 回文数是指一个像14641这样“对称”的数,即:将这个数的各位数字按相反的顺序重新排列后,所得到的数和原来的数一样。请编程求不同位数数字的回文数的个数。用户输入一个正整数M(2<M<7),M作为回文数的位数。要求输出M位…

【Javascript】高阶函数,JSON

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录高阶函数箭头函数apply函数JSON高阶函数 把函数作为参数&#xff0c;或者返回一个函数&#xff…