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 内核文件系统来实…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
