Android实例仿真之二
目录
三 从无入手
第一阶段
第二阶段
第三阶段
第四阶段
第五阶段
第六阶段
第七阶段
八 举两个典型例子:
九 逆向工程
三 从无入手
这节标题叫从无入手,什么意思呢?如果没有Android这个实例存在,你要做一个类似Android的东西,该怎么做?思考从这里开始。
很多时候,我们的学习模式是反推模式。怎么讲呢,有些东西,有人先搞出来了,然后积累了很多经验,这些经验就成为后继者学习的内容。比如说,活字印刷术,为什么要弄字模,因为字模可以复用,提高效率。进一步的,可能会有字模为什么用这种材料,印刷为什么用这种纸等等。就像十万个为什么,当我们从为什么中得到这样做的好处后,我们就学习到很多有用的知识了。但实际上,现代的研究,都是主动式的。从以前经验总结提炼模式进化到先进行理论分析,得到可行性后,再指导实践研究,解决具体技术问题。这个过程,不仅是主动式的,而且也是正推模式的。比如要做一个产品,会进行需求分析,方案设计,之后才进行实施。如果产品取得了成功,其他人也想搞这类产品,那么他就会分析你的产品,这时候就进入了反推模式(一般也叫逆向工程)。他会思考,你为什么这样做,有什么好处。这虽然是一种比较快速的切入手段,但未必是快速成长之路,因为这种模式,一定程度上限制了我们的思考范围和深度。而且,部分在正推模式下未必是那么显而易见的信息,在反推中,就可能变成自然而然的了,这时候,就出现了信息的消失或者隐藏。举个不算太恰当的例子,假设一个机械计算器被设计为支持加法和乘法运算,当我们拆解这个计算器发现其内部有加法和乘法模块时,一定不会觉得有啥特别。但是,如果进一步的,发现乘法模块是由加法模块实现的时,可能会有那么一点点意想不到。总的来讲,这种反推模式,容易出现模块之间的有机关联性被割裂开,从而在系统层面的整体把握上,出现欠缺。再举个浅显的例子,我们都知道,上学做题时,自己思考出答案跟把答案看明白,是有很大的差别的。
前面说了这么多,跟我们后面要继续展开的内容,有什么关系呢?看完下面的内容,大家就明白了。
一直以来,我们学习Android的方式,都是反推模式。在学习过程中,有一天发现系统是这样设计的,可能得到的反馈就是“哦,原来如此”;有一天发现系统包含这些模块,可能得到的反馈是“嗯,是应该这样设计”。其实,这个过程,我们已经放弃了很多主动思考的机会,而是把更多的时间放到了思考答案到底有没有道理、对不对上去了。所以这里,我们尝试从正向来“分析”一下Android系统,看看会有什么不同的收获。
秉着先设计后实现的理念,如果给我们一个构建Android系统的机会,那我们应该先考虑的是要做什么,然后再考虑怎么做,这个顺序才是正确的。对于一个复杂系统的设计,顺手就可能拎出来几条放之四海而皆准的要求或特性。比如:
1 能够简化应用开发,满足工业化、商业化、标准化的要求。这是基础要求。
2 要开放共享,共建共治。
3 要灵活,有很强的适应性、扩展性、维护性。
4 要高性能高可靠。
5 要有竞争力,适应面广,有市场。
6 要能可持续性发展,最好有大公司或者公司联盟背书。
7 上面的都比较虚,如果有现成实际可运行的演示产品或成果就更好了。这一步实现虚转实,这一点很重要。iPhone的惊艳亮相、AlphaGo的一战成名、ChatGPT的量变到质变跃迁,无不为产业界注入了强心剂。
8 能够重复利用现有的成果,那成功的可能性就更大了。
9 当然,如果再包装一番,显得与众不同,显得同时具备先进理念和可玩性,那就更吸引开发者和用户了。
有了上面的安9条,然后我们再来看,该如何设计才能实现上面的要求。
看未来,最好的方法就是回看历史。这是唯物主义告诉我们的方法论。不过这一点显得太哲学化,缺乏实践方面的具体指导价值。我们还是从现有的软件系统来看,该如何做。下面将这个思考过程整理成七个阶段,通过框图分别展示。不过,为了让内容更加聚焦,我们会忽略比较多的细节。
第一阶段
标准分层开发模式

第二阶段
多应用模式,应用不分业务、服务、资源

第三阶段
多应用模式,应用分业务、服务、资源,但没有统一规划

第四阶段
多应用模式,应用分业务、服务、资源,服务和资源有统一规划

第五阶段
多应用模式,应用分业务、服务、资源,服务和资源进一步独立规划

第六阶段
多应用模式,部分业务和服务或者资源中,为了共享、复用逻辑或数据或流程,采用了模块化方式,也认为是标准构件的雏形。此时的典型特点是不对外开放,内部较为宽松模式下的实现。

第七阶段
多应用模式,业务、服务和资源统一使用大框架进行分层管理。应用中嵌入标准构件。典型的特点是对外开放,标准化,实现考虑东西较多。

通过上面的演化步骤,从历史角度来看,我们隐约也能感觉到那种从手工农耕到机器标准化作业的感觉。

看来任何时候,向标准化、工业化目标看齐,都不会错的。
下面,基于上面九条要求,从静态和动态两个方面来看具体实现时该如何入手。
八 举两个典型例子:
其一,应用内,周期管理

上图展示了这样一个可能的理想化方案。APP1和APP2,当然可能还有更多的APP跟框架主代码通过编译,结合在一起。系统加载包含编译结果的程序文件时,会通过写时拷贝,复用父进程已经构建的内置资源。父进程的内置资源是继承在父进程的父进程。不断的回溯,最开的进程只包含少量资源,运行过程中逐步分化出子进程,子进程加载更多的资源,最终构建起完整资源的应用启动进程。操作系统从该完整进程分裂出各个具体的应用进程,自然,应用进程就具备了父进程包含的资源。等到运行时,系统将消息推送给应用进程,应用进程就按照框架设计的周期规格,本分的运行了。
其二,应用内或者应用间,远程过程调用。可以在线程间,或者进程间实现。应用内,主要是线程间的通信,方便消息的处理;应用间,主要是进程间的通信,方面进行服务的获取和使用。

对于进程间的模式,框架同样提供了接口,并在接口实现中定义了远程过程调用的方法。服务端则真正定义了接口实现,并处理远端过来的调用,将结果返回给远端调用者。服务端在实现接口本身的要求时,可能需要操作系统和驱动的支持。远程过程调用作为框架代码,在应用端和服务端有各自的模板实现。开发者可以通过专门的脚步语言描述调用方法和参数,这通常称为接口描述语言。之后,有专门的工具将其翻译为可嵌入框架的代码。公用的部分(外部包装)由工具实现,用户只需要实现逻辑本身要求的代码即可。
编译时,框架和相关代码一起编译,形成一个完整的代码段。运行时,为了提高效率,远程过程调用会进入到内核空间执行,这样就可以完成跨进程的高效内存数据传递。
通过上面两个例子,我们对框架干什么及如何干,应该有个隐隐约约的感觉了吧。这些内容,跟之前的博文传递的思想是一致的(软件架构及几种典型框架_龙赤子的博客-CSDN博客_软件架构)。
具体看Android系统的实现方式之前,我们先简单看一个实践层面的验证。这需要对Android应用进行一个简单的逆向工程。所以,这个过程,我们也就顺便简单介绍一下Android应用的逆向方法。
九 逆向工程
基本的逆向工具有 dex2jar和jd-gui。具体方法如下:
首先将Android应用的安装包apk文件重命名为zip文件,并将其解压到文件夹。
其次使用dex2jar将文件夹中的class.dex文件反编译为jar文件。Dex是一种字节码格式,class.dex就是Android应用代码编译后准备交给虚拟机的“类二进制”文件。
最后使用jd-gui工具查看jar文件中包含的反编译后的Java代码。
但是,使用上面的工具有个问题:有些应用apk包做了加固处理,逆向转jar时可能报错,无法正常处理。还有一个,就是有些应用apk可能存在多个class.dex文件。这主要是Android早期虚拟机的限制导致。
使用dex2jar最新2.1版本(2.0不可以)可以处理一些加固措施,比如转jar的报错问题,但是无法处理多个class.dex文件的情况。此时,可以使用jadx工具。直接从github下载编译好的支持gui且带jre版本的jadx-gui。启动工具,在图形界面中拖入要分析的apk,可一步到位完成反编译及Java类展示,方便快捷。
简单工程,如下图所示:

老工具逆向会报错的应用,如下图所示:

看着有些差异。
包含多class.dex文件的情况,如下图所示:

从其中,我们可以看到,无论是那种情况,除了我们自己的代码外,还有第三方的代码以及安卓系统的代码。这基本验证了框架代码会和我们的代码一起揉到应用中。
有了上面的基础,下面让我们从大的方面来看看Android内部具体是怎么做的。
相关文章:
Android实例仿真之二
目录 三 从无入手 第一阶段 第二阶段 第三阶段 第四阶段 第五阶段 第六阶段 第七阶段 八 举两个典型例子: 九 逆向工程 三 从无入手 这节标题叫从无入手,什么意思呢?如果没有Android这个实例存在,你要做一个类似Android…...
day47【代码随想录】动态规划之买卖股票的最佳时机III、买卖股票的最佳时机IV、最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费
文章目录前言一、买卖股票的最佳时机III(力扣123)二、买卖股票的最佳时机IV(力扣188)三、最佳买卖股票时机含冷冻期(力扣309)四、买卖股票的最佳时机含手续费(力扣714)股票买卖问题总…...
网络数据包接收流程
1. 网络数据包接收流程简述 典型的以太网卡网络包接收流程如下: 1.网络包通过物理介质传到接收端的phy芯片; 2.phy芯片通过RGMII协议传到MAC芯片rx queue fifo中; 3.MAC芯片通过专用DMA将网络包搬运到网卡驱动程序预先分配好的rx ringbuffer中…...
CSAPP学习笔记——虚拟内存(二)
案例研究 Intel Core i7 该处理底层的Haswell微体系结构允许64位的虚拟和物理地址空间,而现在的Core i7实现支持48位(256TB)虚拟地址空间和52位(4PB)物理地址空间,这对目前来说已经完全够用了。ÿ…...
面试sql
创建表 create table Student ( Sno varchar(20) primary key,Sname varchar(20) UNIQUE,Ssex varchar(2),Sbirthday date,class varchar(20) )create table Course ( Cno varchar(20) primary key,Cname varchar(20) UNIQUE,Tno varchar(20) )create table Score ( …...
Python编程自动化办公案例(2)
作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.前期代码 二.实现批量读取 1.os库 2.实现思路 (1&#…...
Vulnhub 渗透练习(七)—— FRISTILEAKS: 1.3
环境搭建 下载链接 virtualbox 打开靶机设置为 host-only,攻击机同样。 具体可点此处 信息收集 开了个 80 端口。 用的是 apache 2.2.15 ,这个版本有个解析漏洞。 目录 根据首页的图片猜测 /fristi/ 目录(不过我没想到 -_-&#x…...
阶段二10_面向对象高级_分类分包思想和案例环境搭建
一.分类思想 1.分类思想概念: 分工协作,专人干专事 2.信息管理系统分类[案例] Student 类-------------------->标准学生类,封装键盘录入的学生信息(id , name , age , birthday) StudentDao 类-----------------&…...
关于打印工具print-js的使用
https://www.jianshu.com/p/f6f09dd9f7db第一步 安装组件//安装print-js npm install print-js --save //删除print-js npm uninstall print-js //安装固定版本 npm install print-js版本号 --save // 全局安装 npm install print-js --save -g第二步 引入组件安装成功后&#…...
Doxygen使用
文章目录简介Doxygen的安装Doxygen的配置生成配置文件常用配置Doxygen注释头文件注释:函数的注释:Doxygen文档生成reference简介 Doxygen 是一个流行的用于生产代码文档的工具,关于它的介绍可以参考官网:https://www.doxygen.nl/index.html。 我使用Dox…...
MySQL数据库调优————表结构设计优化
三范式 第一范式 字段具有原子性,即数据库表的每一个字段都是不可分割的原子数据项,不能是集合、数组、记录等非原子数据项当实体中的每个属性有多个值时,必须拆分为不同的属性 第二范式 满足第一范式的基础上,要求每一行数据…...
set对象和map对象
1 Set对象 介绍: Set数据结构类似数组,但所有成员的值唯一。 Set本身为一个构造函数,用来生成 Set数据结构,使用 add方法来添加新成员。 let a new Set(); [1,2,2,1,3,4,5,4,5].forEach(x>a.add(x)); for(let k of a){ console.log(k…...
stream()流的使用
文章目录引入流流的操作中间操作终端操作流的使用谓词筛选筛选各异的元素流的切片截断流跳过元素映射流的扁平化查找和匹配归约元素求和、最大值和最小值数值流构建流由值构建流由数组创建流引入流 java api提供的一种利用声明式的方式处理数据集合的一个东西,可以…...
C++学习笔记-常量
在程序执行过程中,其值不能改变的量称为常量(Constant)。普通常量的类型是根据数据的书写形式来决定的。如 100 是整型常量,0.5 是实型常量,‘q’ 是字符型常量,“qianfeng” 是字符串常量。 常量是固定值,在程序执行期…...
JavaScript系列之实现继承的几种方式
文章の目录一、借助父构造函数继承属性1、实现方式2、优点3、缺点二、原型链继承1、实现方式2、优点3、缺点三、组合继承四、ES6继承的实现方式参考写在最后一、借助父构造函数继承属性 1、实现方式 先定义一个父构造函数(this指向为window);再定义一个子构造函数…...
java面试准备
1.自我介绍: 2.基础 : 1.集合 : java容器中分为collection 和map两大类 collection 分为list集合(有序且重复的),set集合(无序,不可重复) list集合分为arrayList集合 : 查询快,增删慢,它是基于数组结构的,对数据的增删是在数组的尾部进行添加或删除的,其效率相对于LinkedList…...
kafka-6-python单线程操作kafka
使用Python操作Kafka:KafkaProducer、KafkaConsumer Python kafka-python API的帮助文档 1 kafka tools连接 (1)/usr/local/kafka_2.13-3.4.0/config/server.properties listeners PLAINTEXT://myubuntu:9092 advertised.listenersPLAINTEXT://192.168.1.8:2909…...
【Spring教程】1.Spring概述
1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…...
设计模式-代理模式
控制和管理访问 玩过扮白脸,扮黑脸的游戏吗?你是一个白脸,提供很好且很友善的服务,但是你不希望每个人都叫你做事,所以找了黑脸控制对你的访问。这就是代理要做的:控制和管理对象。 监视器编码 需求&…...
DPDK — MALLOC(librte_malloc,Memory Manager,内存管理组件)
目录 文章目录 目录MALLOC(librte_malloc,Memory Manager,内存管理组件)rte_malloc() 接口malloc_heap 结构体malloc_elem 结构体内存初始化流程内存申请流程内存释放流程MALLOC(librte_malloc,Memory Manager,内存管理组件) MALLOC 库基于 hugetlbfs 内核文件系统来实…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
