Android实例仿真之三

news2024/9/24 7:23:02

目录

四 Android架构探究

五 大骨架仿真

六 Android实例分析思路拓展


四 Android架构探究

   首先,Android系统所带来的好处,就在于它本身代码的开放性,这提供了一个学习、借鉴的平台。这对分析仿真而言,本身就是一大利好,可以更深入的探究,更加接近真实情况。其次,从Android系统中所学的东西也可以运用于其他一些系统的设计中(额外的,它使用的优秀开源软件及使用方法也是值得学习运用的)。最后,这种公开性所开放出来的底层修改机会,也使得在Android系统本身上可以有一番作为,比如对系统进行优化。

   Android系统的作用是支撑一个个的APP,所以,每一个APP都应该平等的享用系统的资源,不管是硬件资源还是软件资源,并且,APP之间的地位也是平等的。如此一来,就存在两个部分,一个是系统管理部分,为各个APP服务,一个是APP们,平等的跟管理者交互。对于Windows系统,也是如此。管理者提供系统服务,APP们通过管理者,使用系统资源。将这种情况简化,那么一般的嵌入式系统产品,就是一个APP跟一些个服务交互。因为不会有人为这些个特殊的嵌入式产品编写APP,所以,不需要对服务和服务的使用者进行过多封装。反而,从这个角度来看,因为共享需求,Android将系统资源封装,供每个APP使用则是合理的,而且也是得体的,既不存在大材小用问题,也不存在设计浪费问题,更不存在多而无用的问题。

   框架在此中,充当了中间件的作用。

   框架在此中,也类似于C库,作为一种共享库,存在于每一个APP中。因此,框架是一套逻辑,将各个部分管理(粘)到一起的逻辑。就如同博主在这篇讨论框架的文章中所述,软件架构及几种典型框架_龙赤子的博客-CSDN博客_软件架构,通常我们看到main函数是第一个被调用的入口函数,但是实际上,main只是程序框架给我们的入口。我们在Android开发中,不用从main开始第一行代码编写,也只是因为框架帮我们实现了main该做的事情。这个过程中,框架进行了二次封装。框架设计了一套逻辑共享库,每一个应用集成该共享库,应用不用实现main接口,只需集成共享库的类接口即可。应用起来后,实现在共享库中的框架逻辑会调用main接口,并且会自动调用运行周期各个点上注册的函数。如此,我们写的代码,就跟框架融合在一起了。

   最终,大家共享的就是逻辑,就是框架中的逻辑。框架中的全局变量不会产生影响,因为应用之间是相互隔离的。框架只需处理好内部的共享即可。对于应用之间的交互,框架会依赖系统服务完成。关于这些,可以参考之前第三部分的说明。

   再多说一些。我们可以从不同角度看框架的作用与价值。注意,框架不是虚的,它有承载的实体。从静态的角度来看,架构是一个层,既是分割层,也是中间层,更是粘合层。

   框架提供逻辑与功能共享,为所有服务和APP所共享。此时,从进程角度来看,框架的逻辑存在于每一个实体进程之中。大家按照框架给的统一模式来编写个性代码。如果还以房子为例的话,统一的框架表示了房屋的承重、管道等,大家是一样的,但是每家利用这些资源装修后的房子,是不一样的。再举个之前一直用的形象例子,开网店。框架提供的各种资源是统一接口的,比如CPU、内存、存储、网络、显示等等。每一家利用这些资源,开发构建的各自网店不仅样式不一样,功能更是多了去了。卖书的店铺跟卖手机的店铺关注的点肯定是不一样的。

   基于上面的分析和Android系统的学习,结合第三部分的思考,整理了Android系统与Android内部Framework框架之间关系的一幅图,如下:

 

   Android Framework图示说明:

   先看左上图,这是Android启动的简略过程。通过这个过程,我们会了解到zygote的原理。这是整个讨论的基础。

   再看右上图,上面部分是系统框架和应用的分层对应图。下面是应用的三种运行状态。第一种,应用不需要与外部沟通,只依赖框架内部逻辑。第二种,应用需要通过框架,跟其他服务沟通,完成功能。第三种,应用可用自己与系统底层沟通,完成功能。正常来讲,部分服务实现的也是这种方式,从而将系统资源提供给大家共享。

   最后,看下图,粗略展示了几种状态的运行关系。应用和服务依赖框架注册到服务管理模块,并依赖内核提供的沟通机制,实现进程间的通信。这部分是对图上半部分左右两块的另一个视角展示。

   对于图中嵌入的诸多小方块,其涉及应用和框架内置的代码逻辑。关于这部分,说明如下:

   先从编译开始,用户编写Java文件,提供布局,UI语言等其他文件和资源。Java编译为class字节文件,其他图片、C/C++动态库等资源直接打包,运行时再按照规则处理。

   对于Java编译,分三种情况:

   第一种,独立不依赖其他模块的Java代码,直接编译为Java字节码即可,设备中的虚拟机会解读这些字节码并执行它们。

   第二种,依赖第三方jar文件,编译时需要导入class文件,以便编译时遇到未知接口时可以查找这些依赖文件,找到接口所在文件,并将其关联起来,从而形成一个整体。打包时需要导入安装包中。这也算是框架的一部分,或者说是整个拼图的一部分。

   第三种,系统自身提供的jar文件,比如android.jar。需要根据SDK提供的不同版本选择合适的版本使用。构成本身同样为class文件,编译遇到未知接口时会查找连接(这就是为什么IDE中要下载相关的SDK),并形成一个整体。这部分跟第三方依赖库可能有些差异。第三方依赖库是需要打包到安装包中的,因为系统不能保证内部包含特定APP依赖的特定第三方jar。但是对于系统自身提供的jar,可能没必要将所有的都打包到APP中,因为系统在应用环境构建时,公共的部分已经加载到系统中了。这就类似我们用C、C++编写程序,在二进制代码中会标出来需要使用标准库,但是并不实际打包到可执行程序文件中。程序实际加载运行时,操作系统会帮助解决依赖的标准库问题。我想Android也是类似的。

   从进程运行角度来看,通过框架的分割,实现了逻辑的相互隔离,并减少了逻辑上的缠绕。框架存在于进程之中,服务于实体之间的交互,也在上图中得到了体现。总的来讲,这部分既是对第三部分的进一步确认和细化,也是我们做框架大骨架仿真的一个基础(一个尝试)。

   为强化对上面内容的理解,我们再举两个例子。一个是想象的例子,一个是实际的例子。先看想象的例子:

 

   上面以应用显示为例子。系统中有一个处理显示合成渲染的进程,所有应用要显示的内容,都是告诉该进程来完成的。这个告诉过程,就由框架来完成了。另外,不同应用功能不同,用到框架中的资源也不一样。比如一个带WIFI相关功能的应用跟一个单纯打电话的应用,对框架资源使用的部分肯定是不同的,但这并不影响框架发挥作用。

   下面再看看实际的例子。

 

   上面两图展示了博主做的一个IPTV应用架构,该应用基于Android平台。该应用要用到浏览器,并且要对浏览器进行改造,因此,博主将系统的浏览器复制了一份,给该IPTV应用单独提供了一个特供浏览器。这个特制浏览器跟系统原生浏览器基本一致,只是增加了对一些自定义JS对象的支持。

 

   为了给自己的应用提供一个特制浏览器,博主将Android浏览器从底层到上层都复制了一份。这样从静态来看,应用Framework中就包含了两个浏览器核心。只不过我们专门改过的那份核心,别的应用调用不到。从动态来看,应用层代码逻辑复制了一份,底层动态库也复制了一份,所以应用进程空间中,浏览器相关的代码都有两份,而且浏览器中有关线程的创建也会多一份,最终造成的结果就是系统默认自带的那个浏览器核心代码在IPTV应用中永远不会调到,也不会参与网页的渲染。

   从这个例子,大家也可以感受一下框架的魅力。

五 大骨架仿真

   暂略。

六 Android实例分析思路拓展

   补充说明:在第五部分展开之前,再整理一下思路。

   实例:Android运行时的情景分析

   以运行时内存中的各个进程为对象,来研究各个类的实现。从这个角度看的话,代码的实现都可以看成是逻辑的堆彻,是静态的,提供了设计精巧的条条通道,通过这些通道彼此关联起来,以便再运行时彼此交互。这种思路更加接近于逻辑控制,而我们常常还停留在流程控制上。(其实,我们理解一个事物,往往喜欢从流程入手,这样更容易一些。但当我们认识到一定程度后,流程的东西反而成了拖累。此时,就喜欢从抽象的角度来看待问题,这样能够看到更本质的东西。而那些流程上的细节,已经内化于心,被隐藏起来了)。

   另外一种运行时情景分析【进程运行时情景分析】

   1 全局变量在任务之外

   2 构建内存运行时情景图,比如代码段,数据段等

   3 数据结构在内存中的样式和作用

   4 深刻理解程序就是数据结构加算法这一说

   5 任务也就是线程与进程的内存情景

   6 从内存情景图着手,分析代码的执行流程,感受内存中数据结构及其附带的Buffer的变化,实际了解程序执行。

图片1 外框内存田 内框进程 进程内框分任务和数据,参考操作系统概念一书

图片2 内存中运行的程序进行拍照,快照图 时刻1 时刻2 时刻3等等的图片,通过加粗变化的地方,感受2和5描述的内容

   第三种情景分析角度,通过进程分析Android服务。这是很多讲述Android架构的书籍所忽略的一点。使用PS命令看进程及其父子关系,分析各个服务。这是从动的角度来分析逻辑的东西。

   其实还可以学架构设计中的做法,分不同的角度来分析,比如逻辑图、框架图、物理图、进程图、开发图等等。就像矩阵的变换一样,东西还是那个东西,但是变化一下角度,就能看到不一样的内容。这里也是如此,通过不同的角度,对程序的运行情景有一个完整的认识。

   以上记录一些框框思路,后续有时间补充具体内容。

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

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

相关文章

[JAVA安全]Spring Messaging之CVE-2018-1270

漏洞简介 Spring 框架中通过spring-messaging 模块来实现 STOMP (Simple Text-Orientated Messaging Protocol),STOMP是一种封装 WebSocket的简单消息协议。攻击者可以通过建立WebSocket连接并发送一条消息造成远程代码执行, spring-messagin…

C++笔记 模板的进阶知识

目录 1. 非类型模板参数 2.模板的特化 2.1 函数模板的特化 2.2 类模板的特化 2.2.1 全特化 2.2.2 偏特化 3.模板的分离编译 3.1 什么是分离编译? 3.2 模板的分离编译 4.模板的总结 模板的初阶内容:(594条消息) C模板的原理和使用_全貌的博客-CSD…

【干货】如何打造HR无法拒绝的简历?测试开发大牛带手把手你写简历!

通过率90%,优秀的软件测试简历长什么样? 也许口才好的人会觉得简历不重要,能说就行了,那是因为你没有体会过石沉大海的感觉! 很多人觉得疑惑,为什么我投了那么多简历,都没有接到面试通知&…

加油站会员管理小程序实战开发教程15 完结篇

这篇是本次实战课程的最后一篇,我们在上篇还有两个问题没解决。一个是会员卡类型显示不对,一个是不同的会员卡我们希望背景色显示不同。我们先处理一下这两个问题 1 显示会员卡类型 在列表上直接显示会员卡类型,目前显示的是数字,这个是因为枚举类型导致的。枚举类型在数…

关于vb6无边框的窗体开发遇到的部分问题的解决方案

为了美化或自定义窗体,通常会把窗体做成无边框形式,使用无边框窗体会存在一些问题的,以vb为例,当窗体borderstyle设置为0时,会出现以下问题:1.任务栏不再出现程序图标 2.窗体无法拖行移动 3.窗体无法拖动缩放&#…

WampServer安装教程

文章目录简介:官网地址安装步骤:我是阿波,学习PHP记录一下笔记,如果对你有帮助,欢迎一键三连,谢谢! 简介: WampServer是一个用于Windows操作系统的Web开发环境,其名称来…

10- 天猫用户复购预测 (机器学习集成算法) (项目十) *

项目难点 merchant: 商人重命名列名: user_log.rename(columns{seller_id:merchant_id}, inplaceTrue)数据类型转换: user_log[item_id] user_log[item_id].astype(int32)主要使用方法: xgboost, lightbm竞赛地址: 天猫复购预测之挑战Baseline_学习赛_天池大赛-阿里云天池…

java并发编程原理1(原子性,可见行,有序性,volatile,synchronized)

一、原子性: 1.1 Java中如何实现线程安全? 多线程操作共享数据出现的问题。 锁: 悲观锁:synchronized,lock乐观锁:CAS 可以根据业务情况,选择ThreadLocal,让每个线程玩自己的数据。 1.2 C…

内大-oj练习题(2期)

内大oj2期 1. 输出一个数的质数因子2. 寻找完数3. 圆的面积4. 求同存异5. 2的k进制数6. 输出排序序列6. DNA算法1. 输出一个数的质数因子 介绍 因子,例如 33=9 (3就是因子); 19=9(1,9就是因子) 质数, 只能被1和本身整除的数 题目 代码 #include <iostream>

Windows7下使用VMware11.1.1安装ubuntu-16.04.7

一、说明二、安装说明三、安装步骤详解1、先安装VMware软件2、创建虚拟机3、编辑虚拟机4、开启虚拟机&#xff0c;初始化Linux系统一、说明 虽然VMware和ubuntu最新版已经很高了&#xff0c;我这电脑由于是win7配值还低&#xff0c;所以采用低版本来安装 VMware版本&#xff1…

C++Primer15.5节练习

练习15.18&#xff1a; Base* p &d1&#xff1a;合法 p &d2&#xff1a;不合法&#xff0c;只有当派生类公有地继承基类时&#xff0c;用户代码才能使用派生类向基类的转换 p &d3&#xff1a;不合法&#xff0c;只有当派生类公有地继承基类时&#xff0…

ChatGpt与Google 谁能给出最好的回答

ChatGPT由于其先进的会话和技术功能而越来越受欢迎。你可以问聊天机器人任何你想问的问题&#xff0c;它会在几秒钟内输出答案。虽然它不是一个搜索引擎&#xff0c;你应该使用ChatGPT作为你的信息来源而不是谷歌&#xff0c;百度吗? 我们来根据国外的一场测试来看一下 ChatG…

spring注解方式整合Dubbo

系列文章目录 文章目录系列文章目录一、创建一个父工程项目二、创建子模块(dubbo-api模块)二、创建子模块(dubbo-provider模块)三、创建子模块(dubbo-consumer模块)总结一、创建一个父工程项目 这里我们通过Spring Initializer 来帮我们构建一个spring-dubbo这个父项目,点击nex…

python进阶--Numyp库(一)

一、Numpy库介绍 NumPy&#xff08;Numerical Python&#xff09;是Python的⼀种开源的数值计算扩展。提供多维数组对象&#xff0c;各种派⽣对象&#xff08;如掩码数组和矩阵&#xff09;&#xff0c;这种⼯具可⽤来存储和处理⼤型矩阵&#xff0c;⽐Python⾃身的嵌套列表&am…

【Redis 高级】- 持久化 - RDB

【Redis 高级】- 持久化 - RDB &#x1f451;什么是持久化呢&#xff1f; 那当然是够持久呀&#xff0c;这个持久如果在你不主动去删除的情况下&#xff0c;它就一直存在的。 &#x1f3b7;那么这有什么用呢&#xff1f; 举个栗子&#xff1a;我们在用 PowerPoint 在写价值 …

WEB系列(二)-----------XSS

XSS原理及基础 定义 恶意攻击者会往Web页面里插入JS代码,当用户点击网页时.镶嵌的JS代码就会执行,从而达到恶意的特殊目的. 原因 程序对输入和输出的控制不够严格&#xff0c;导致payload输出到前段时被浏览器当做有效代码执行从而产生危害。 分类 存储型反射型DOM型 测…

常见排序算法--Java实现

常见排序算法--Java实现插入排序直接插入排序折半插入排序希尔排序交换排序冒泡排序快速排序选择排序直接选择排序堆排序归并排序基数排序各种排序方法比较在网上找了些排序算法的资料。此篇笔记本人总结比较&#xff0c;简单注释&#xff0c;觉得比较好理解&#xff0c;且相对…

四大步骤,教你彻底关闭Win10自动更新

文章目录一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务三、禁用任务计划里边的Win10自动更新四、在注册表中关闭Win10自动更新参考资料一、禁用Windows Update服务 1、同时按下键盘 Win R&#xff0c;打开运行对话框&#xff0c;然后输入命令 services…

C语言运算符优先级和结合性一览表

所谓优先级就是当一个表达式中有多个运算符时&#xff0c;先计算谁&#xff0c;后计算谁。 运算符的优先级从高到低大致是&#xff1a;单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符()和逗号运算符 简单记就是&#xff1a;&#xff01; > 算术运…

一起学 pixijs(1):常见图形的绘制

大家好&#xff0c;我是前端西瓜哥。 pixijs 是一个强大的 Web Canvas 2D 库&#xff0c;以其强大性能而著称。其底层使用了 WebGL 实现了硬件加速&#xff0c;当然如果不支持的话&#xff0c;也能回退为 Canvas。 本文使用的 pixijs 版本为 7.1.2。 Application Applicati…