Android实例仿真之二

news2024/9/23 13:19:47

目录

三 从无入手

第一阶段

第二阶段

第三阶段

第四阶段

第五阶段

第六阶段

第七阶段

八 举两个典型例子:

九 逆向工程


三 从无入手

   这节标题叫从无入手,什么意思呢?如果没有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内部具体是怎么做的。

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

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

相关文章

Mysql数据库事务

数据库事务 数据库事务由一组sql语句组成。 所有sql语句执行成功则事务整体成功;任一条sql语句失败则事务整体失败,数据恢复到事务之前的状态。 Mysql 事务操作 开始事务 start transaction;- 或 begin;事务开始后,对数据的增删改操作不…

MySQL最佳实践

一、MySQL查询执行过程 1.MySQL分层结构 MySQL8.0没有查询缓存的功能了,如果频繁修改缓存,将会损耗性能查询流程就按照分层结构就可以清楚,只要了解各个组件的各自功能就行分析器主要分析语法和词法是否正确优化器主要优化SQL语句 二、MySQL更新执行过程 更新主要涉及两个重…

SpringCloud - Ribbon负载均衡

目录 负载均衡流程 负载均衡策略 Ribbon加载策略 负载均衡流程 Ribbon将http://userservice/user/1请求拦截下来,帮忙找到真实地址http://localhost:8081LoadBalancerInterceptor类对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表&…

正点原子ARM裸机开发篇

裸机就是手动的操作硬件来实现驱动设备,后面会有驱动框架不需要这么麻烦 第八章 汇编 LED 灯实验 核心过程 通过汇编语言来控制硬件(驱动程序) 代码流程 1、使能 GPIO1 时钟 GPIO1 的时钟由 CCM_CCGR1 的 bit27 和 bit26 这两个位控制&…

SSL/STL是什么?怎么工作的?Keystore 和 Truststore是什么?

安全套接字层(Secure Sockets Layer),也称为 SSL,是一种加密协议(encryption protocol),可在 Internet 上的设备之间创建身份验证的通道(authenticated channel),以便可以安全地共享信息。本质上&#xff0…

动态规划专题精讲1

致前行的人: 要努力,但不要着急,繁花锦簇,硕果累累都需要过程! 前言: 本篇文章为大家带来一种重要的算法题,就是动态规划类型相关的题目,动态规划类的题目在笔试和面试中是考察非常高…

【日常点滴019】Python制作流浪气球游戏(导弹射击类)

Python制作流浪气球游戏(导弹射击类)教学课程代码(分步教学版)1、构建全局通用代码结构2、构建气球精灵类3、构建导弹精灵类4、碰撞检测5、构建游戏信息类 (最终完整代码)教学课程代码(分步教学…

基于springboot+vue的食疗系统

基于springbootvue的食疗系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍&…

java面试题-并发基础

1.多线程的出现是要解决什么问题的? 本质什么?提高程序性能:单线程程序只能按照固定的顺序依次执行每个任务,无法同时处理多个任务。多线程技术可以在同一时间内执行多个任务,从而提高程序的运行效率和响应速度。提高程序的并发性&#xff…

前端借助Canvas实现压缩图片两种方法

一、具体代码 1、利用canvas压缩图片方法一 // 第一种压缩图片方法(图片base64,图片类型,压缩比例,回调函数)// 图片类型是指 image/png、image/jpeg、image/webp(仅Chrome支持)// 该方法对以上三种图片类型都适用 压缩结果的图片base64与原类型相同// …

Python自动化测试-使用Pandas来高效处理测试数据

Python自动化测试-使用Pandas来高效处理测试数据 目录:导读 一、思考 二、使用pandas来操作Excel文件 三、使用pandas来操作csv文件 四、总结 一、思考 1.Pandas是什么? 功能极其强大的数据分析库可以高效地操作各种数据集 csv格式的文件Excel文件H…

Python3-基本数据类型

Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号&…

注意力机制笔记——结合沐神和B站老弓up主

B站【大白话浅谈【注意力机制】】 聚类 是针对 样本, 注意力机制是针对样本相关性,来进行计算的 自注意力机制 指的是 query ,key,value都是同一个部分。 可以学到 类似的 短语 ,和 语义特征。如its 指代的对象。 评论区大佬 根据这篇论文《Effective Approaches to…

[ vulhub漏洞复现篇 ] Drupal 远程代码执行漏洞(CVE-2018-7602)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

设计模式之各种设计模式总结与对比

目录1 目标2 定位3 一句话归纳设计原则4 G0F 23种设计模式简介5 设计模式使用频次总结6 —句话归纳设计模式7 设计模式之间的关联关系和对比1 目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring…

利用React实现多个场景下的鼠标跟随框提示框

前言 鼠标跟随框的作用如下图所示,可以在前端页面上,为我们后续的鼠标操作进行提示说明,提升用户的体验。本文将通过多种方式去实现,从而满足不同场景下的需求。 实现原理 实现鼠标跟随框的原理很简单,就是监听鼠标在…

删除链表的倒数第N个节点

题目描述19. 删除链表的倒数第 N 个结点难度中等2410收藏分享切换为英文接收动态反馈给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例 1:输入:head [1,2,3,4,5], n 2输出:[1,2,3,5]示例 2&#…

【ROS】Windows系统安装ROS体验

大家平时玩ROS都是在Ubuntu系统上,那Windows系统可以安装吗,答案是:可以的!Windows为了发展自家的物联网生态,已经在Windows系统支持ROS了。 文章目录1.安装VS 20172.安装Chocolatey & Git3.安装ROS4.运行ROS例程1…

RabbitMQ核心内容:实战教程(java)

文章目录一、安装二、入门1.分类2.核心概念3.工作原理4.六大模式三、模式一:"Hello World!"1.依赖2.生产者代码3.消费者代码四、模式二:Work Queues1.工作原理2.工具类代码:连接工厂3.消费者代码4.生产者代码5.分发策略不公平分发预…

计算机网络第2章(物理层)学习笔记

❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…