[Android] Android架构体系(1)

文章目录

  • Android 的框架
  • Dalvik 虚拟机
  • JNI
  • 原生二进制可执行文件
    • Android NDK中的binutils
  • Bionic
    • 谷歌考虑到的版权问题
    • Bionic与传统的C标准库(如glibc)的一些不同
  • 参考

Android 的框架

Android 取得成功的关键因素之一就是它丰富的框架集。

没有这些框架,Android 可能会和其他一些嵌入式 Linux 发布版本一样混得很差。

通过提供各种框架,Android 让应用可以很方便地创建进程,允许开发者使用高级的 Java 语言而不是底层的 C/C++语言进行编程。各种框架的不断增加也在进一步强化这一过程,因为有大量的用于进行图形、音频和硬件访问的API可供开发者使用。

使用 Java 的包命名规则后,Android 的框架会根据它们各自不同的功能被分割在各自不同的命名空间(namespace)中。位于命名空间 android.*中的包是可以供开发者使用的,而位于com.android.* 中的包则是仅供系统内部使用的。

Android 也支持大多数位于命名空间java*中的标准Java 运行时包。

Android 使用的所有框架都是被打包在设备的/system/framework 目录下的数个Java格式的*.jar 文件中的,而在 L版中则是被预编译进 boot.jar 文件中的。

尽管 AOSP 是开源的,但直接从JAR文件中找出相关的包也非常容易-只要调用 dexdump (或者dextra 工具)直接分析JAR
文件中的 classes.dex 文件就行了。

Dalvik 虚拟机

Android 对 Linux 另一个值得注意的扩展就是引入了 Dalvik 虚拟机。

Dalvik 虚拟机是让Android 能够在256M 内存就已经算“很大”了的移动设备中正常工作的关键因素。Dalvik 并不是第一种试图能够运行在移动设备上的虚拟机,Sun 公司的 Microsystems 曾经被认为有望能够压过 Java 2移动版(J2ME)一头,但实际上收效甚微。
Dalvik 主要是由 Dan Bornstein 发明的一一他2008 年在谷歌I/0大会上的演讲被认为是了解Dalvik 虚拟机设计的一份很重要的参考资料。

虚拟机的名字 (Dalvik) 是为了纪念冰岛北部的一个小渔村。

Dalvik 虚拟机尽管看上去和 Java 是等价的,但实际上并不是一个Java 虚拟机。虽然偏离得并不是很远,但它运行的是一种完全不同形式的字节码(这种字节码叫作 DEX,也就是“Dalvik EXecutable”的缩写),而且相对于 Sun/Oracle 设计的JVM,它在执行效率和共享内存方面做了更多的优化。这些优化使得它在受到严格限制的移动平台上占尽优势一这一点也正是 Java(特别是 J2ME)没法在有限的实现之外进一步获得增长的原因。

Android 选择Apache 的 Harmony 文件的一个子集作为它的核心类(core class)的基础。之所以选择 Harmony 是因为它是免费的(在 Apache 许可协议下)(原来是 Sun 的,现在是 Oracle的)JVM 的开源克隆体。Oracle 于 2010 年将谷歌告上了法庭,理由就是谷歌从未正确地获得Java 类库的使用授权,这场旷日持久的官司甚至直到 2015 年初还没有了结。

Dalvik 虚拟机正在被ART (Android 运行时,Android RunTime)逐步取代。但是这并不意味着 Dalvik 正在走向消亡。因为 Dalvik 只有在即时编译 (JIT,Just-In-Time compilation)方面的部分会被取代,而它使用的(DEX)文件格式作为至关重要的体系结构概念,仍是非常有生命力的。

JNI

Android 应用是运行在虚拟机里的,但有时,通常是在需要访问硬件或其他设备 (或芯片集)特有的功能时,它还是需要执行虚拟机之外的代码的。

所以 Dalvik 允许应用通过 JavaNative Interface(JNI)使用原生代码库(ELF 共享库)中的代码。

从某种程度上说,Android 对JNI是又爱又恨。厂商们无疑更青睐于“纯”Dalvik 的应用。

因为所有的代码都是运行在虚拟机里的,所以不会受到虚拟机/操作系统是运行在什么体系结构的处理器上的影响。

在这种情况下,Android 应用可以在无须任何修改的情况下运行在任意一个平台上,无论是 Intel、ARM、MIPS 还是其他什么处理器上。

但是另一方面,虚拟机环境也并非没有限制(特别是在开发者非常关心图形处理问题时) 和缺陷(特别是它很容易被反编译)。因此在应用中使用JNI以优化性能或对抗逆向工程的情况也是屡见不鲜的。

有鉴于此,谷歌也提供了使开发者能够生成原生库 (及二进制可执行程序)的原生代码开发包(NDK,NativeDevelopment Kit)。

我们打开APK文件,常常可以看到对应的动态库.so 或者静态库.a:
在这里插入图片描述

并非所有的应用中都使用了 JNI,但在那些使用了 JNI的应用中,我们也可以很方便地在安装包 (.apk
文件)中找到JNI库,因为它们是被放在一个单独的文件夹 “/lb/architecture中的。

原生二进制可执行文件

从 Linux 的角度讲,所有的可执行文件都是 ELF 二进制可执行文件。

Android 中的关键系统组件都是用 C/C++编写,并被编译成原生的二进制可执行文件的。而用户的应用则是编译成Dalvik 字节码的,但字节码是运行在 Dalvik 虚拟机的上下文环境中的(或者在 ART 中,是在运行之前被编译成原生代码的)。

而 Dalvik 虚拟机本身也是一个ELF格式的二进制可执行文件。因此,尽管大多数开发者大可以心安理得地忘掉“二进制可执行文件”这么一回事,但这些二进制可执行文件仍在Android 中扮演着重要的角色。

在Android中,二进制可执行文件通常都被放在/system/bin和/system/xbin这两个目录中(当然,还有一些重要的二进制可执行文件是放在/sbin 目录中的)。由于它们本身就是 AOSP 的一部分,所以无论是在哪种设备中,大多数的二进制可执行文件都是一样的。但是厂商或者芯片集的制造商往设备里添加一些额外的二进制可执行文件的情况也不少见。

我们可以随时执行 ps 命令,查看通过加载二进制可执行文件而运行起来的进程的列表。

在这里插入图片描述

因为ELF是个标准的文件格式,所以可以使用任何一种Linux ELF 文件解析工具(比如readelf、objdump或者其他 binutils 工具集中的工具) 分析 Android 的二进制可执行文件。

Android NDK在“toolchains/”目录中也提供了完整的工具集(使用交叉编译技术编译的,这些工具就能运行在移动设备上了)。

Android NDK中的binutils

在Android NDK中,binutils是一组二进制工具,用于处理和操作二进制文件,包括可执行文件和目标文件。以下是一些常见的Android NDK中的binutils工具:

  1. as(汇编器): 用于将汇编语言源代码转换成目标文件。
  2. ld(链接器): 用于将多个目标文件和库文件链接成一个可执行文件或共享库。
  3. objdump(目标文件转储工具): 用于获取目标文件的反汇编和其他有用的信息。
  4. strip(剥离工具): 用于从可执行文件或共享库中删除符号表和其他调试信息,以减小文件大小。
  5. readelf(ELF文件查看器): 用于查看和分析ELF(可执行和可链接格式)文件的内容和结构。

这些工具通过NDK中的bin目录提供,路径类似于:<NDK_DIR>/toolchains/<ARCH>/prebuilt/<HOST_PLATFORM>/bin/,其中<NDK_DIR>是NDK的根目录,<ARCH>是目标架构(例如arm、x86等),<HOST_PLATFORM>是宿主平台(例如windows、linux等)。

我们可以使用这些binutils工具来执行各种任务,如编译和链接原生代码,调试和分析二进制文件等。

Bionic

谷歌考虑到的版权问题

与Linux 发行版中使用GNU的LibC(GLibC作为它们的核心运行时(也就是著名的 libc.so)不同,Android选用了它自己的C运行时库一Bionic。

尽管谷歌宣称选择 Bionic 的理由主要是因为它的简洁性,但实际上合法性的考虑也占了很重要的位置。如果在 Android 中使用了使用GPL(GNU public license ,GNU 公共授权协议)授权的 GLibC,那么根据GPL,Android也就必须开源(这有点像 Linux 内核中使用GPL的情形),而这又是谷歌所要极力规避的。而Bionic 尽管也是开源的,但它混合使用了 BSD 授权协议(BSD 授权协议对使用相关软件的第三方软件的限制更少些) 和谷歌自己的授权协议。

Bionic与传统的C标准库(如glibc)的一些不同

Bionic是Android操作系统使用的C标准库。它是为了满足Android平台的需求而设计的,因此与传统的C标准库(如glibc)有一些区别。

Bionic库提供了一组API和功能,用于支持Android操作系统的核心功能,包括进程管理、内存管理、线程创建、文件操作等。Bionic库还对某些标准C库函数进行了优化和改进,以提高性能和适应Android系统的特定需求。

与传统的C标准库相比,Bionic库在以下方面有所不同:

  1. 大小和性能:Bionic库非常精简,旨在减小内存占用和优化启动速度。这对于移动设备这样的资源受限环境非常重要。
  2. 安全性:Bionic库在一些函数实现上有额外的安全保护,以防止缓冲区溢出和其他常见的安全漏洞。
  3. 兼容性:Bionic库与POSIX标准相对兼容,但在某些实现上存在细微差异。因此,一些传统的Linux应用程序可能需要针对Android做一些修改才能在Android平台上正常运行。

Bionic库是Android NDK的一部分,开发者可以使用NDK来编译和构建原生代码,并使用Bionic库提供的功能和API来开发Android应用程序的核心部分。

参考

《最强Android书:架构大剖析》

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

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

相关文章

架构08- 理解架构的模式2-管理和监控

大使模式&#xff1a;构建一个辅助服务&#xff0c;代表消费者使用服务或应用程序发送网络请求。 进程外的代理服务&#xff08;之前介绍中间件的时候也提到了&#xff0c;很多框架层面的事情可以以软件框架的形式寄宿在进程内&#xff0c;也可以以独立的代理形式做一个网络中…

AI绘图制作红包封面教程

注意&#xff1a;有不懂的话可加入QQ群聊一起交流&#xff1a;901944946欢迎大家关注微信公众号【程序猿代码之路】&#xff0c;每天都会不定时的发送一些红包封面&#xff01;&#xff01; 2024的春节即将到来&#xff0c;而在这春节到来之前&#xff0c;就有一个非常爆火的小…

黑马程序员 Java设计模式学习笔记(一)

目录 一、设计模式概述 1.1、23种设计模式有哪些&#xff1f; 1.2、软件设计模式的概念 1.3、学习设计模式的必要性 1.4、设计模式分类 二、UML图 2.1、类图概述 2.2、类图的作用 2.3、类图表示法 类的表示方式 类与类之间关系的表示方式 关联关系 聚合关系 组合…

陀螺仪LSM6DSV16X与AI集成(6)----检测自由落体

陀螺仪LSM6DSV16X与AI集成.6--检测自由落体 概述视频教学样品申请源码下载生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置 概述 本文介绍如何初始化传感器并配置其参数&#xff0c;以便在检测到自由落体事件时发送通知。 最近…

显示报错: nmap.nmap.PortScannerError: ‘nmap program was not found in path‘

解决方案&#xff1a; 《关于想在Pycharm下使用nmap然后报错nmap.nmap.PortScannerError: ‘nmap program was not found in path.然后解决的那些事》 文章中进行了详尽的描述&#xff0c;总结一下就是下载一个nmap.exe&#xff0c;然后在nmap.py中引入nmap.exe所在的路径&…

RabbitMQ常见问题之消息堆积

文章目录 一、介绍二、使用惰性队列1. 基于Bean2. 基于RabbitListener 一、介绍 当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。最 早接收到的消息&#xff0c;可能就会成为死信&#xff0c;会被丢弃&#xff0c;这就…

Pod控制器:

Pod控制器&#xff1a; Pv pvc 动态PV Pod控制器&#xff1a;工作负载。WordLoad&#xff0c;用于管理pod的中间层 &#xff0c;确保pod资源符合预期的状态 预期状态&#xff1a; 副本数容器的重启策略镜像的拉取策略 Pod出现故障时的重启等等 Pod控制器的类型&#xff1a…

【大数据】Flink 详解(八):SQL 篇 Ⅰ

《Flink 详解》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 10 10 10 篇文章&#xff1a; 【大数据】Flink 详解&#xff08;一&#xff09;&#xff1a;基础篇【大数据】Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅰ【大数据】Flink 详解&…

小程序系列--7.页面导航

一、页面导航 1、 什么是页面导航&#xff1f; 页面导航指的是页面之间的相互跳转。例如&#xff0c;浏览器中实现页面导航的方式有如下两种&#xff1a; <a> 链接 location.href 2. 小程序中实现页面导航的两种方式 二、声明式导航 1. 导航到 tabBar 页面 2. 导航…

Cellinx NVT 摄像机 UAC.cgi 任意用户创建漏洞复现

0x01 产品简介 Cellinx NVT IP PTZ是韩国Cellinx公司的一个摄像机设备。 0x02 漏洞概述 Cellinx NVT 摄像机 UAC.cgi接口处存在任意用户创建漏洞,未经身份认证的攻击者可利用此接口创建管理员账户,登录后台可查看敏感信息,使系统处于极不安全的状态。 0x03 复现环境 FO…

乐意购项目前端开发 #4

一、Home页面组件结构 结构拆分 创建组件 在 views/Home 目录下创建component 目录, 然后在该目录下创建5个组件: 左侧分类(HomeCategory.vue)、Banner(HomeBanner.vue)、精选商品(HomeHot.vue)、低价商品(Homecheap.vue)、最新上架(HomeNew.vue) 引用组件 修改 views/Home…

2. 示例:Spring Boot 入门

1.1 概述 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。习惯优于配置 1.2 为什么使用Spring Boot J2EE笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。 1.3 Spring Bo…

设计模式——组合模式

生活中存在很多 “部分-整体” 的关系&#xff0c;例如&#xff1a;大学中的学校与学院、学院与专业的关系。高楼与楼层和房间之间的关系等等。在软件开发中也有类似的情况。这些简单对象与复合对象之间的关系&#xff0c;如果用组合模式&#xff08;把学校、院、系都看作是组织…

链表练习 Leetcode82.删除排序链表中的重复元素 II

题目传送门&#xff1a;Leetcode82 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&#xff1…

【Linux】Linux 系统编程——cd 命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 “cd 命令&#xff0c;即 ‘change directory’ 的缩写&#xff0c;主要用于 Unix、Linux 和 macOS 等操作系统中&#xff0c;用于改变当前工作目录。该命令支持绝对路径和相对路径两种形式。若未指定…

SpringBoot多环境配置与添加logback日志

1、多环境配置 一个项目会有多个运行环境 所以SpringBoot提供了可以适应多个环境的配置文件 每个文件对应一个端口号 application-dev.yml 开发环境 端口8090 application-test.yml 测试环境 端口8091 application-prod.yml 生产环境 端口8092 在application中选择使用哪个…

线性回归实例

1、线性回归&#xff08;linear Regression&#xff09;和逻辑回归&#xff08;logistic Regression&#xff09;的区别 线性回归主要是用来拟合数据&#xff0c;逻辑回归主要是用来区分数据&#xff0c;找到决策边界。 线性回归的代价函数常用平方误差函数&#xff0c;逻辑回…

AI在保护环境、应对气候变化中的作用

对于AI生命周期数据领域的全球领导者而言&#xff0c;暂时搁置我们惯常的AI见解和AI生命周期数据内容产出&#xff0c;来认识诸如世界地球日这样的自然环境类活动日&#xff0c;似乎是个奇怪的事情。我们想要知道&#xff0c;数据是否真的会影响我们的地球环境&#xff1f; 简而…

5.5G来了!全球首次采用,就在福建

近日&#xff0c;在以滨海风景优美而闻名的福建厦门马拉松赛道沿线区域&#xff0c;福建移动携手华为采用5G-A通感一体技术率先完成了低空多站连续组网的通感能力验证&#xff0c;基于4.9GHz频段实现了对城市低空120米下多无人驾驶飞行器的探测与及时预警。这一成果为城市低空资…

【windows】右键添加git bash here菜单

在vs 里安装了git for windows 后&#xff0c;之前git-bash 右键菜单消失了。难道是git for windows 覆盖了原来自己安装的git &#xff1f;大神给出解决方案 手动添加Git Bash Here到右键菜单&#xff08;超详细&#xff09; 安装路径&#xff1a;我老的 &#xff1f; vs的gi…