[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.rhkb.cn/news/240620.html

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

相关文章

【问题解决】cannot import name ‘circle‘ from ‘skimage.draw‘ 问题解决

使用 from skimage.draw import circle 报错如下&#xff1a; from skimage.draw import circle ImportError: cannot import name circle from skimage.draw (/home/onur/.local/lib/python3.9/site-packages/skimage/draw/__init__.py)修改&#xff1a; from skimage.draw …

Linux_Docker图形化工具Portainer如何安装并结合内网穿透实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块一

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤)

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤) 目录 时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤)预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现GRNN广义回归神经网络时间序列…

IDEA 2023.3.2 安装教程

1.下载2023.3.2版本IDEA 链接&#xff1a;https://pan.baidu.com/s/1RkXBLz6qxsd8VxXuvXCEMA?pwd5im6 提取码&#xff1a;5im6 2.安装 3.解压文件&#xff0c;进入&#xff0c;选择方式3 4.将下面文件夹复制到任意位置&#xff08;不要有中文路径&#xff09; 5.进入下面文…

PDF有编辑密码怎么办

目录 注意&#xff1a; windows方法&#xff1a; 1 python 下载 2 打开命令行 3 安装 pikepdf 4 编写python脚本 5 使用py脚本 6解密完成 Linux方法&#xff1a; 注意&#xff1a; 此方法可以用于破解PDF的编辑密码&#xff0c;而不是PDF的打开密码 当遇到类似如下问…

跨境电商账号频繁?你的IP可能“不干净”了

疫情促进了跨境电商行业的加速发展&#xff0c;许多卖家也抓住了这波流量红利&#xff0c;跨境电商月入数万&#xff0c;数十万甚至数百万的造福神话也不断在上演&#xff0c;但由于国内外电商运营模式不同&#xff0c;多店运营、用户数据收集、刷单等行为都受到了国外平台的严…

Linux Shell脚本入门

目录 介绍 编写格式与执行方式 Shell脚本文件编写规范 脚本文件后缀名规范 首行格式规范 注释格式 shell脚本HelloWord入门案例 需求 效果 实现步骤 脚本文件的常用执行三种方式 介绍 3种方式的区别 小结 多命令处理 Shell变量 环境变量 目标 Shell变量的介绍 变量类型 系统环境…

OpenHarmony 应用开发入门 (一、环境搭建及第一个Hello World)

万事开头难。难在迈出第一步。心无旁骛&#xff0c;万事可破。没有人一开始就能想清楚&#xff0c;只有做起来&#xff0c;目标才会越来越清晰。--马克.扎克伯格 前言 2024年1月16日&#xff0c;华为目前开启已HarmonyOS NEXT开发者预览版Beta招募&#xff0c;报名周期为1月15…

群晖NAS搭建WebDav结合内网穿透实现公网访问本地影视资源

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Android Launcher3各启动场景源码分析

文章目录 一、概述二、开机启动Launcher2.1、开机启动Launcher流程图2.2、开机启动流程源码分析 三、短压Home键启动Launcher3.1、短压Home键启动Launcher流程图3.2、短压Home键启动Launcher源码分析 四、Launcher异常崩溃后的自启动4.1、Launcher异常崩溃后的自启动流程图4.2、…

电路原理2-非线性电阻

前言&#xff1a;整理笔记基于清华大学于歆杰老师的《电路原理》&#xff0c;电路原理是基于无源负载和电源组成电路的分析方法。 1.非线性元件&#xff08;从伏安特性曲线看电阻&#xff09; 隧道二极管&#xff08;N型电阻&#xff0c;压控型电阻&#xff09; 充气二极管&…

springcloud Eureka服务注册与发现

文章目录 代码地址Eureka基础知识什么是服务治理什么是服务注册与发现 单机版eurekaServerIDEA生成eurekaServer端服务注册中心类似物业公司EurekaClient端cloud-provider-payment8001修改EurekaClient端cloud-consumer-order80 集群Eureka构建步骤新建cloud-eureka-server7002…

2. goLand安装及外配置参数通用用法

目录 概述测试代码解决外配置参数结束 概述 选择版本安装 go 安装的版本 1.go安装及相关配置 goLand 对于 习惯 idea 系列使用的人&#xff0c;还是很友好的。 测试代码 package mainimport ("flag""fmt""os" )func main() {name : flag.St…

[足式机器人]Part2 Dr. CAN学习笔记-Ch04 Advanced控制理论

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - Ch04 Advanced控制理论 1. 绪论2. 状态空间表达State-Space Representation3. Phase Portrait相图&#xff0c;相轨迹3 1. 1-D3 2. 2-D3 3. General Form3 4. Summary3.5. 爱情中的数学-Phase …

.NET 8.0 发布到 IIS

如何在IIS&#xff08;Internet信息服务&#xff09;上发布ASP.NET Core 8&#xff1f; 在本文中&#xff0c;我假设您的 Windows Server IIS 上已经有一个应用程序池。 按照步骤了解在 IIS 环境下发布 ASP.NET Core 8 应用程序的技巧。 您需要设置代码以支持 IIS 并将项目配…

ubuntu系统(10):使用samba共享linux主机中文件

目录 一、samba安装步骤 1、Linux主机端操作 &#xff08;1&#xff09;安装sabma &#xff08;2&#xff09;修改samba配置文件 &#xff08;3&#xff09;为user_name用户设置samba访问的密码 &#xff08;4&#xff09;重启samba服务 2、Windows端 二、使用 1、代码…

上海亚商投顾:沪指探底回升 大金融板块午后走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 指昨日探底回升&#xff0c;深成指、创业板指午后跌超1%&#xff0c;尾盘集体拉升翻红&#xff0c;北证50指数涨…

QtCreator12无法识别Qt5.15.2的安卓SDK与NDK配置解决

解决方法: 设置JDK为JDK11 使用Android Studio下载 Android SDK Command-line Tools 10.0 打开Android SDK Location : 双击打开cmdline-tools 复制10.0中所有东西到latest中 点击Manage Kits并选择Devices 然后点击Android会弹出下图窗口,并自动更 安装完成 成功识别