Android实例仿真之一
目录
零 开局三问
第一问:为什么要有这一章?
第二问:Android算不算是一个嵌入式系统?
第三问:用什么方法来分析Android这个大系统?
一 讨论Android的流行
二 深入浅出Android
零 开局三问
在正式开始这一部分之前,我们有三问需要回答。
第一问:为什么要有这一章?
因为Android有许多优点(其实我觉得最大的优点是可玩性),还有一定的复杂性和难度(从它的目标出发,可知这是必然的),并且是开源的(这是最关键的一点),所以是一个很好的学习例子,学习架构设计和软件开发的例子,值得分析。
第二问:Android算不算是一个嵌入式系统?
我认为答案是肯定的。嵌入式系统整体上看,可以分为三类(https://blog.csdn.net/wwwyue1985/article/details/119428234?spm=1001.2014.3001.5502):一类是基础级的。主要特点是不使用操作系统(纯裸机程序跑)或者只使用简单的带任务调度的操作系统,无通用驱动、网络及图形界面支持。这类系统承载的业务大多是专用的,或者说是专门为某一特定用途或功能或用户群体而定制设计的。第二类是中等级的。主要特点是使用像Linux这类通用操作系统,有图形界面支持,具备一定的通用性,但主要还是为某些复杂功能或通用类用途而设计,包含实时系统和非实时系统。这一类系统对第三方扩展开发的支持有限。第三类是高等级的。主要特点是采用比较完善的通用操作系统,支持各类应用开发,被称为智能系统。像Android就属于这一类。显然,第三类是最庞杂(注意,博主这里用了庞杂,而非复杂)、最通用的,所以其架构灵活度也是最大的,值得学习。
第三问:用什么方法来分析Android这个大系统?
这里可以仿照《深入浅出MFC》一书(侯捷著),对Android框架也做个抽丝剥茧的手术,去掉各种外包装,留下主要骨架(就像龙门客栈里展示的庖丁解牛术),并仿照其骨架进行一个仿真。如此,则能去其繁杂,学其精髓,值得尝试。
一 讨论Android的流行
不知读者有没有思考过,当我们准备开发一款应用时,需要考虑哪些基本的东西?
现思考也来得及,至少能想出来如下三点吧:
1 语言选择:选项很多,但是,用C++还是JAVA亦或其他语言,这是个不小的问题,需要综合考虑。有时候,选项太多,也会是个麻烦事。
2 平台选择:基于操作系统,目前主流的有Linux、Windows、Android、iOS。这块根据目标用户,业务场景等,相对好选择一些。对于移动端的开发,其实Android和iOS都是需要的。
3 开发环境:1和2选好了,这块也基本就能够确定了。采用成熟流行的IDE,还是能够提升不少开发效率的。至少像拼写这种低级错误,能够避免不少。
俗话说,工欲善其事必先利其器。除了上面三个大问题外,编辑、设计、编译、调试、配置管理等等工具,也是必须要准备好的。专业的事不仅要交给专业的人,还需要交给专业的工具。在软件开发中,尤其如此。
当然,我们可以把问题再拓展一下。比如这样问,假设你是一个平台供应商(比如是Google和Apple),如何为开发者提供应用开发的一条龙服务?此时考虑的东西就多了,我们在之前关于Android技术生态构成的讨论中提到过这些内容(https://blog.csdn.net/wwwyue1985/article/details/128759826)。平台搭建就好比是盖楼,要完成大部分看不见的工作,像是地基、管线等,然后留给开发者所见即所得的房屋装饰和配置工作。这有点像SaaS,通用的事情都由平台完成了。回到问题本身,具体来说,除了前面提到的工具外,至少还要包括了基础库、编译器、连接器、SDK、文档、示例、模拟器、开发模型及规范、构建工具、发布平台等等。
我们的生活已经离不开各种各样的软件和工具,也就是大家俗称的各种应用。苹果公司的产品之所以畅销,不仅仅是他优秀的软硬件一体化融合设计,更是各种丰富的应用,吸引了开发者、投资者,最终也吸引了用户。Windows当年打天下,正是依赖其上的应用越来越丰富,用户已经形成了一种依赖,对平台的依赖。
在一个系统中,应用可以看做是一个具有一定功能的模块,可以完成一个具体的任务,为用户使用系统资源提供便利。
我们前面说了,平台搭建好比是盖楼,那开发一款应用,就类似于装修一个房子。首先要有目标用途,是商铺还是自住。如果是商铺,那饭店和修理店的装修需求显然是不一样的,这就需要收集需求,做设计,画图纸,进行完善的规划。前期工作准备充分了,再开始具体施工。开发一款应用也是类似,同样也需要有图纸,进行前期的架构设计,进度计划等。之后才由IT民工将设计转换成代码。只不过软件应用的开发,很多工作都是思维逻辑性的,不需要水泥、沙子、石灰,且复制成本极低。
还有一点,你会发现二者在基础依赖这方面也很像。对于房屋装修来讲,如果开发商没有提供部分管道,装修时想要实现,那就比较麻烦了。比如早期的楼,没有考虑到网络入口,后续就只能在走廊过道等地方拉线。同样,如果软件平台没有提供某些基础功能支持,想在应用里实现,同样很难。比如,应用想要一个1毫秒的定时器,而底层只能提供精度为10毫秒的定时器,那这个1毫秒定时器就无法实现了。
前面提到了,软件的复制成本极低,这是软件不同于其他行业的一个最明显特点。所以,我们开发的应用,就需要运行在流行的平台上,这样应用才能为更多的用户所接触和使用,产生最大的价值。这就产生了一个新的问题,如何提供流行的平台?
Android从出生开始,就迅速流行了起来,所以Android的流行值得我们思考。这里我提几点供大家参考:一是Google使用了Java作为应用的开发语言,降低了开发者的学习成本;二是Google开源了系统,迅速吸引了硬件和设备厂商;三是Google大量使用了开源软件,在最短的时间内完成并推出了基本系统,使得用户得以尽早利用这个平台。俗话说“一步先步步先”,先人一步,在软件领域的重要性不需要多言,微信就是最好的例子。
之后,Google在不影响整个应用生态基础的前提下,不断优化系统底层。可见,Google在最开始把好钢用在了刀刃上,先提供并优先保证应用API的可用性。后期在迭代过程中保持稳定性,最终在整个智能手机浪潮中占得最重要的领域:操作系统;并在操作系统领域占得最重要的元素:先机。现在我们可以看到,Google已经优化或者替换了大量底层的开源组件。如果Google一开始就从底向上自己从头设计系统,那么在移动平台这个赛道的竞争中不见得能够取胜。现在Google不仅在替换许多开源基础组件,甚至要替换Linux内核,并已经替换了上层的Java语言,这些都是利用垄断优势才可以做到的。
先有再优,Google正是凭借这一点,让Android流行并壮大起来。关于有优的思想原则,另一个典型的例子就是Windows NT之父大卫卡特勒。在NT开发期间,其也是坚持先开发功能再优化性能。这世界上本就没有多少最佳方案,更多的是合适不合适。
二 深入浅出Android
前面提到,可以参考侯捷的《深入浅出MFC》来分析Android大系统。那具体怎么做呢?可以从最简单的进程间通信开始,搭建一个基础模型,一步一步丰富功能,到接近一个Android系统。这就有点类似核心主干的仿真了。可以在丰富内容的过程中,添加嵌入式系统领域积累的知识,比如背后的本质东西等。像进程间通信、消息队列、消息循环等。通过深入浅出的了解,最终当作一个标准组件。这就如理解计算机工作的过程,最后就是概念不断积累,细节不断隐藏,认识不断升华的过程。比如组成原理中的CPU、内存、磁盘、网络等,深入的话,有一堆细节;浅出的话,就是一个一个的模块;放在一起的话,就成了一个拥有特异功能的神奇机器。
还有一种方式,就是按照从上到下的方式进行分析,从应用到硬件,逐层递进。这是我们常规的学习方法。具体展开时,可以灵活把握,比如采用发散的树形方式,总的Android系统,到大的模块,再到小的模块,再到细节。这也是一种方法。
关于Android的框架,不是简单介绍有哪些类,画个类图,然后介绍到进程通信就完了。关键是要介绍背后工作的机理原理,而非简单的接口罗列,这些才是重点。通过进程通信,获取服务,启动Activity,暂停Activity等等,这些方面的介绍已经很多了,但是服务怎么启动,怎么暂停的,怎么涉及到底层的,这些核心的东西并没有挖掘出来,特别是有哪些进程,负责了哪些服务,如果能够通过图示将这些展示出来,这样才算是更完整的剖析了设计者的思想。
要完成这部分的工作,或者说达到通透的目的,就必须进行真正的仿真,并记录过程。不过,这是一个庞大的工作,一下子搞定是有点难度的。下面几节我们围绕这个目的,先尝试按这种思路,开个头,做一部分分析工作。
相关文章:
Android实例仿真之一
目录 零 开局三问 第一问:为什么要有这一章? 第二问:Android算不算是一个嵌入式系统? 第三问:用什么方法来分析Android这个大系统? 一 讨论Android的流行 二 深入浅出Android 零 开局三问 在正式开始…...
软考高级-信息系统管理师之重要工具和技术的口语化表示(最新版)
重要工具和技术的口语化表示 本文主要介绍重要工具和技术的口语化解释 1、 模板、表格和标准:就是用之前的项目的模版、表格、标准,结合本项目进行了修改,在编制一些计划、方案的时候就可以采用这个工具和技术。可以拿来就用的,节约时间、提高质量的。 2、 产品分析:通过一…...

基于springboot+vue的个人健康信息服务平台
基于springbootvue的个人健康信息服务平台 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背…...

SpringBoot2.x实战专题——SpringBoot2 多配置文件【开发环境、测试环境、生产环境】
SpringBoot2.x实战专题——SpringBoot2 多配置文件【开发环境、测试环境、生产环境】 目录SpringBoot2.x实战专题——SpringBoot2 多配置文件【开发环境、测试环境、生产环境】一、创建一个SpringBoot项目二、修改pom.xml中SpringBoot的版本三、配置文件3.1 application-dev.ym…...

测试2:编写测试用例的方法
2.编写测试用例的方法 7种 测试常用的方法:code review 代码静态分析、CI/CD CI–持续集成–开发成员经常集成它们的工作,尽快发现集成错误 CD–持续部署–将集成后的代码部署到更贴近真实运行的环境 2.1 测试用例的描述: 用例编号 用例…...

docker安装配置镜像加速器-拉取创建Mysql容器示例
List item docker 常见命令大全docker安装docker拉取创建Mysql容器docker 安装 1、安装链接:https://blog.csdn.net/BThinker/article/details/123358697 ; 2、安装完成需要配置docker镜像加速器 3、docker 镜像加速器推荐使用阿里云的: 编…...

WSL1和WSL2相互转换以及安装路径迁移相关问题
目录 1.从WSL 1如何切换到WSL 2? 2.从WSL 2如何切换回WSL 1? 3.WSL1转换为WSL2后,WSL1里面安装的程序和库需要重装吗? 4.WSL2转换为WSL1后,WSL2里面安装的程序和库需要重装吗? 5.如何备份WSL2…...
系统分析*
文章目录系统分析分析的任务结构化方法OO的方法的任务常用的详细调查方法有哪些?系统分析的建模TFD业务流程图DFDDD数据流图用例模型(重点用例图)用例图的内容:用例之间的关系:对象模型(类图)时…...
【redis】持久化:RDB和AOF
redis的持久化指将数据写入可靠内存中,如ssd。Redis提供了4种持久化策略 RDB:Redis Database,周期性的将某个时间点的数据集快照持久化AOF:Append Only File,每次redis服务接收到写操作(修改内存的操作),都…...

2023Python接口自动化测试实战教程,附视频实战讲解
这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下。 一、整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类,比如数据库sql…...

【原创】java+swing+sqlserver药品管理系统设计与实现
之前数据库都是用的mysql,今天我们使用sqlserver在配合swing来开发一个药品管理系统。方便医院工作人员进行药品的管理,基础功能基本都是一些增删改查操作。 功能分析: 药品管理系统主要提供给管理员和员工使用,功能如下&#x…...
软考高级信息系统项目管理师系列之二十七:信息文档管理与配置管理
软考高级信息系统项目管理师系列之二十七:信息文档管理与配置管理 一、信息文档管理与配置管理内容整理二、信息系统文档管理1.信息系统文档概念2.软件文档分类与质量等级三、配置管理1.配置管理2.典型配置项3.配置项4.配置项操作权限5.配置项状态6.配置项版本号7.配置项版本管…...
软考高级-信息系统管理师之项目管理基础(最新版)
项目管理基础 项目管理特点战略管理三个过程IT项目特点项目管理概念项目管理特点软技能PRINCE2的四个要素组织结构职能型组织优缺点职能型组织优点同时,职能型组织也存在着如下缺点:项目型组织优缺点项目型组织优点项目型组织也存在着如下缺点:矩阵型组织优缺点矩阵型组织的优…...
leetcode240+Search a 2D Matrix II+从右上角开始
链接 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if(matrix.size()0 || matrix[0].size()0) return false;int i0, jmatrix[0].size()-1; //从右上角开始while (i<matrix.size()&&j>0) {int x mat…...

0xL4ugh 2023
这回跟着个队伍跑,不过还是2X以后的成绩,前边太卷了。自己会的部分,有些是别人已经提交了的。记录一下。Cryptocrypto 1给了一些数据,像这样就没有别的了ct [0, 1, 1, 2, 5, 10, 20, 40, 79, 159, 317, 635, 1269, 2538, 5077, 1…...

Mybatis(4)之跟着老杜做一个简单的银行转账会话
这是个MVC项目,我不一定可以完整的实现这个项目,但力求把这个复现出来,尽量的复现细节。 第一步:创建数据库 表 创建表如下: 我们使用 int 是为了方便 然后采用 demcial,精确度较高 添加两个用户 然后…...

VBA提高篇_ 22 事件处理
文章目录1.事件编程2.常用工作簿事件名称与对应处理过程名称示例3. 事件编程的步骤4.工作簿事件4.1 Open4.2 BeforeClose4.3 NewSheet5.工作表事件6.变量和过程函数的作用域1.事件编程 写在事件发生地(对应工作簿或工作表) 2.常用工作簿事…...
【蓝桥杯集训·周赛】AcWing 第91场周赛
文章目录第一题 AcWing 4861. 构造数列一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4862. 浇花一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4861. 构造数列一、题目1、原题…...

【人工智能AI】三、NoSQL 实战《NoSQL 企业级基础入门与进阶实战》
帮我写一篇介绍NoSQL的技术文章,文章标题是《NoSQL 实战》,不少于3000字。这篇文章的目录是 3.NoSQL 实战 3.1 MongoDB 入门 3.1.1 MongoDB 基本概念 3.1.2 MongoDB 安装与配置 3.1.3 MongoDB 数据库操作 3.2 Redis 入门 3.2.1 Redis 基本概念 3.2.2 Red…...

platform 总线
驱动的分离与分层思想 分离:硬件信息分离; 在编写硬件驱动的时候,需要操作许多硬件寄存器。比如gpio 驱动,你需要知道gpio控制器 寄存器的地址,你想要哪个gpio输出?或是输入? 这些操作最终都是靠设置寄存…...

2023第10届生物发酵展3月30-4月1号山东济南开展,参观路线来了
2023第10届生物发酵展3月30-4月1号山东济南开展,参观路线来了!展会时间:2023年3月30日-4月1日展馆地址:山东国际会展中心(济南市槐荫区日照路1号)展馆:4号馆、5号馆BIO CHINA生物发酵展…...

RK356x U-Boot研究所(命令篇)3.6 fdt命令的用法
平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3文章目录 一、fdt命令的配置二、fdt命令的定义三、fdt命令的用法3.1 fdt list3.2 fdt rm3.3 fdt set一、fdt命令的配置 .config配置文件需要有以下配置: rk3568_defconfig默认已使能。 二、fdt命令的定义 usb命令定义在cm…...
2023年社工工资多少钱一月 能领多少补贴
2023年社会工作者人员的待遇还算可以,每月的全额工资一共5000多,扣完五险一金以后每月的到手工资一共4000多,不同地区薪资也是不同的,一线城市会在7千元以上,还可以领取几百到几千元不等的补贴。 12023年社工工资多少钱…...

面试攻略,Java 基础面试 100 问(十一)
抽象类(abstract class)和接口(interface)有什么异同? 抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现ÿ…...

接口测试(Fiddler工具)
目录 1.Fiddler是什么? 2.Fiddler的原理 3.Fiddler安装 4.Fiddler界面 4.1.常用工具 4.2 会话列表 4.3 状态栏 4.4 内容显示区 1.Fiddler是什么? Fiddler是客户端与服务器之间的HTTP代理,是当前最常用的HTTP协议抓包工具。 主要功能&a…...
Debian/Ubuntu 安装和使用 perf 调试工具
为操作系统安装基本依赖环境:apt-get update -y apt-get upgrade -y apt-get install lrzsz zip unzip libkrb5-dev libicu-dev screen iftop openssl libssl-dev libunwind8 iftop net-tools gcc gdb cmake curl wget -y apt-get install gcc gdb cmake python-dev…...
【Python语言基础】——Python NumPy 数组连接
Python语言基础——Python NumPy 数组连接 文章目录 Python语言基础——Python NumPy 数组连接一、Python NumPy 数组连接一、Python NumPy 数组连接 连接 NumPy 数组 连接意味着将两个或多个数组的内容放在单个数组中。 在 SQL 中,我们基于键来连接表,而在 NumPy 中,我们按…...

解决IDEA报错:无效的目标发行版: 17
解决IDEA报错:无效的目标发行版: 17 目录解决IDEA报错:无效的目标发行版: 17报错由来解决报错【1】检查setting设置,查看编译器编译模块的编译版本是否是你需要的【2】尝试去修改当前项目的启动设置,设置JRE为你需要的版本。【3】…...

Redis第四讲
目录 四、Redis04 4.1 Redis集群应用场景 4.2 集群 4.2.1 基本原理 4.2.2 主从复制的作用 4.3 配置集群(一台虚拟机) 4.3.1 规划网络 4.3.2 创建节点 4.3.3 创建目录 4.3.4 配置redis7001.conf 4.3.5 配置其余文件 4.3.6 后台启动redis 4.3…...
Linux Ubuntu 软件安装与卸载
文章目录1 下载 deb 安装包后安装2 清理安装包3 卸载安装2 Ubuntu升级某个软件参考:1 下载 deb 安装包后安装 进入下载位置,执行 terminal sudo dpkg -i *.deb推荐sudo apt install *.deb 2 清理安装包 sudo apt-get install 会将下载的文件放在 /var…...