当前位置: 首页 > news >正文

Android实例仿真之三

目录

四 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命令看进程及其父子关系,分析各个服务。这是从动的角度来分析逻辑的东西。

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

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

相关文章:

Android实例仿真之三

目录 四 Android架构探究 五 大骨架仿真 六 Android实例分析思路拓展 四 Android架构探究 首先,Android系统所带来的好处,就在于它本身代码的开放性,这提供了一个学习、借鉴的平台。这对分析仿真而言,本身就是一大利好&#xf…...

关于MySQL的limit优化

1、前提 提示:只适用于InnoDB引擎 2、InnoDB存储特点 它把索引和数据放在了一个文件中,就是聚集索引。这与MyISAM引擎是不一样的。 3、SQL示例 -- 给cve字段建立索引 select * from cnnvd where cveCVE-2022-24808 limit 300000,10;由于M…...

Java-Stream流基本使用

collection.stream将会破坏原有的数据结构&#xff0c;可以通过collect方法收集&#xff0c;可以用Collectors提供的构造器&#xff0c;add等方法构造形成新的数据结构。 HashSet<List<Integer>> rs new HashSet<>(); rs.stream().toList();Collection集合转…...

Liunx(狂神课堂笔记)

一.常用命令 1. cd 切换目录 cd ./* 当前目录cd /* 绝对路径cd .. 返回上一级目录cd ~ 回到当前目录pwd …...

【史上最全面esp32教程】点灯大师篇

文章目录前言ESP32简介认识arduino的两个函数点灯步骤函数介绍LED灯闪烁流水灯总结前言 esp32有很多的功能&#xff0c;例如wifi&#xff0c;蓝牙等&#xff0c;这节我们学习最简单的点灯。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 ESP32简介 …...

【Java 面试合集】内存中为什么要区分栈和堆

内存中为什么要区分栈和堆 1. 概述 嗨&#xff0c;大家好Java 面试合集又来了&#xff0c;今天我们分享的主题很大众化以及普通。无论是Java 语言本身还是别的语言都会有所涉及&#xff0c;但是今天我们从Java角度来讲下 2. 分析 今天我们会从多个方向来分享这个话题 2.1 栈是…...

【NLP实战】Python字符串处理

一、Python字符串基本操作 1. 去掉前后的特殊字符&#xff08;strip&#xff09; Python的strip操作可以去除字符串前后的空格&#xff08;不改变原串&#xff09;下例将前后的空格均删掉&#x1f447; str 人工智能 str.strip() # OUT:人工智能rstrip删除右边的空格&a…...

17.CSS伪类

举一个简单的例子来说明什么是伪类&#xff1f; 从之前的代码中&#xff0c;如下图&#xff0c;我们像给这两个列表中的某一列单独设置样式&#xff0c;我们该如何做呢&#xff1f; 我们肯定会选择在li标签上添加class去实现&#xff0c;如下 开始标记结束标记实际元素 <…...

数据链路层

一.以太网数据链路层考虑的是相邻两个节点&#xff08;通过网线/光纤、无线直接相连的两个设备&#xff09;之间的传输&#xff0c;这里的典型协议中最知名的就是“以太网”这个协议了数据链路层&#xff0c;也规定了物理层的内容以太网帧格式&#xff1a;IP地址用来描述整个传…...

投票需要什么流程微信投票互助平台的免费投票平台搭建

“最美家政人”网络评选投票_免费小程序投票推广_小程序投票平台好处手机互联网给所有人都带来不同程度的便利&#xff0c;而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票&#xff0c;对于运营及推广来说找一个合适的投票小程序能够提高工作效…...

数据结构——算法的时间复杂度

&#x1f307;个人主页&#xff1a;_麦麦_ &#x1f4da;今日名言&#xff1a;生命中曾经有过的所有灿烂&#xff0c;都终究需要用寂寞来偿还。——《百年孤独》 目录 一、前言 二、正文 1.算法效率 1.1如何衡量一个算法的好坏 1.2算法的复杂度 2. 时间复杂度 2.1时间复杂度的…...

Go基础-类型

文章目录1 bool2 有符号整数3 无符号整数4 浮点数5 复数6 string7 关于类型转型1 bool bool类型有两个值&#xff0c;一个是true&#xff0c;一个是false。 测试 package mainimport "fmt"func main() {a : trueb : falsec : a && bd : a || bfmt.Println(a…...

良许翻天覆地的2022年

大家好&#xff0c;我是良许&#xff0c;新年快乐呀~ 在我女室友坚持不懈的努力之下&#xff0c;2022年的最后一天我终于被她传染了&#xff0c;阳了~ 此时的我&#xff0c;正顶着37多度的低烧写下这篇年终总结。 2022年&#xff0c;对于大多数人而言&#xff0c;封控是主旋…...

node+vue微信小程序的社区后勤报修系统

社区后勤报修系统小程序进行总体设计和详细设计。总体设计主要包括小程序功能设计、小程序总体结构设计、小程序数据结构设计和小程序安全设计等&#xff1a;详细设计主要包括社区后勤报修系统小程序数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对社区后…...

WSL(Windows Subsystem for Linux)

一、WSL优势 •传统方式&#xff1a;获取Linux操作系统环境&#xff0c;必须安装完整的虚拟机&#xff0c;如VMware•WSL&#xff1a;以非常轻量化的方式&#xff0c;得到Linux系统环境总结&#xff1a;WSL更方便&#xff0c;简单、好用、轻量化、省内存 二、什么是WSL ①不…...

华为OD机试题 - 单词反转(JavaScript)

最近更新的博客 华为OD机试题 - 任务总执行时长(JavaScript) 华为OD机试题 - 开放日活动(JavaScript) 华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试题 - 最小步骤数(JavaScript) 华为OD机试题 - 任务混部(JavaScript) 华为OD机试题 - N 进…...

人工智能原理复习 | 产生式系统的搜索策略

文章目录 一、回溯策略二、图搜索策略三、A 算法与 A* 算法CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 主要内容:回溯策略、图搜索策略(无信息的图搜索、启发式的图搜索)、A 算法与 A* 算法 一、回溯策略 回溯算法(BackTracking Algorithm) 实际上是一个类似枚举的搜…...

初始C语言 - 数组(一维数组、二维数组、数组越界、数组传参)

目录 一、一维数组的创建和初始化 1、数组的创建 2、 数组的初始化 3.一维数组的使用 数组通过下标来访问 总结: 1. 数组是使用下标来访问的&#xff0c;下标是从0开始。 2. 数组的大小可以通过计算得到。 4、一维数组在内存中的存储 二、 二维数组的创建和初始化 1.二…...

人工智能原理复习 | 可分解产生式系统的搜索策略

文章目录 一、前言二、基础知识三、AO* 算法四、博弈树搜索五、总结CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 主要内容: 与 / {/} /或图搜索、AO* 算法、极大极小过程、...

线段树(维护区间信息)

一&#xff0c;定义&#xff1a; 可以在logN时间内实现区间修改&#xff0c;单点修改&#xff0c;区间查询等操作的工具 二&#xff0c;思路&#xff08;修改无乘法时&#xff09;&#xff1a; 1&#xff0c;建树 通过把区间不断二分建立一颗二叉树 我们以维护一个数组a{1…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...