WeSeong 登录
← 返回文章列表
安卓

安卓 (Linux 内核、HAL、原生 C/C++ 库、ART、Java API 框架、应用程序)

安卓 (Linux 内核、HAL、原生 C/C++ 库、ART、Java API 框架、应用程序)

一、概述

安卓 (Android)我们将详细探讨安卓系统,它基于Linux和Java。安卓系统由以下几个层次组成:Linux内核层、HAL(硬件抽象层)、原生C/C++库、Android运行时、Java API框架以及系统应用程序。我们将分别了解每个层次的功能和工作方式。 Linux 内核它负责管理和控制整个系统,包括硬件、网络和文件系统访问等。 HAL它通过 Java API 框架,为设备提供硬件功能的标准接口。 原生 C/C++ 库它允许使用 FreeFont(字体)、WebKit(浏览器引擎)、Media(编解码器)、SQLite(轻量级数据库)等技术。 Android 运行时这使得操作系统能够运行安卓应用程序。 Java API 框架它包含 Activity Manager(电话、资源、通知等)、内容提供商、视图系统等功能,并提供硬件控制的接口。 应用程序层它可分为系统应用程序和用户应用程序。系统应用程序可以使用最高权限(root)进行管理,例如电话、短信等。用户应用程序则由普通用户进行管理,例如KakaoTalk、Naver等。



Ⅱ. 安卓

  1. Linux 内核和硬件抽象层 (HAL)

安卓 (Android)这是一个为移动设备设计的操作系统。它基于Linux内核,并且最近也开始使用Java语言开发应用程序,同时也可以通过Kotlin进行开发。此外,通过Native Development Kit,还可以使用C、C++在Android平台上进行开发。


Android 系统通常采用这种结构,具体如下: Linux 内核的层次让我们先来看看。这是一个基于Linux内核开发的操作系统(OS),与其他的操作系统一样, 它负责管理和控制整个系统,包括硬件、网络和文件系统访问等。 它还具有更详细的功能,包括安全设置、内存管理、电源管理、网络系统管理以及各种设备(如蓝牙设备、网络设备、电池、AP芯片、各种传感器等)的驱动管理。 接下来是…… HAL (硬件抽象层)HAL 代表抽象化的硬件,类似于在 Windows 中,可以通过多个 API 接口来访问硬件。在 Android 系统中,它也提供了一种标准接口,通过 Java API 框架来访问设备的硬件功能。如图所示 它能够提供音频功能,或者提供诸如蓝牙、摄像头、传感器等特定类型的硬件模块。


* 尽管在 Android 系统中使用的大部分 CPU 采用 RISC 架构,但也存在使用 Intel 架构 CPU 的 Android 设备。 想要了解更多关于 CPU 的信息,请参考以下文章。

[SK쉴더斯 SeSAC 东城分校] CPU 架构、内存架构


2. 本地 C/C++ 库和 ART (Android 运行时)

接下来 原生 C/C++ 库 (原生 C/C++ 库) 层次这部分包含了上面提到的 Android Native Development Kit (NDK)。Android NDK 允许开发者使用 C 或 C++ 语言进行应用程序开发。作为库,它允许开发者使用 FreeFont(字体)、WebKit(浏览器引擎)、Media(编解码器)和 SQLite(轻量级数据库)等。在上面这张图中,可以看到与原生层紧邻的 Android 运行时层这使得操作系统能够运行多个安卓应用程序。 之前曾被称为Dalvik,但现在 Android 运行时这种技术被称为“DEX格式”,它允许将经过Java编译后的字节码转换为DEX格式,然后将其打包成APK文件,从而实现程序的运行。 这样说可能不太容易理解,让我们来了解一下Java是如何编译和运行的。


2-1. JVM(Java虚拟机)和 DVM(Dalvik 虚拟机)


在用 Java 语言进行开发(编写代码)后,Java 编译器会根据类来生成 Java 字节码。然后, Java 虚拟机这个程序是可以运行的,它直接以 Java 字节码的形式存在,也就是 Jar 文件。 我们可以更详细地了解一下:


如图所示,如果使用 Java 编写的程序通过编译器转换为字节码,然后这个字节码就变成了标准的 Java 程序 JAR 文件,那么…… 安卓应用程序最初以 Dalvik ByteCode (.dex) 格式存在,然后经过进一步转换,最终转换为 APK 格式。 经过这种转换的 JAR 和 APK 文件是 Java 虚拟机 (JVM)鸡蛋 Android 运行时这使得应用程序能够像实际使用“Naver 地图”一样,帮助用户找到他们想去的地方。


* JVM(Java 虚拟机)在 shell 和用户程序(应用程序)之间运行。 针对 Android 平台的名称是 Dalvik 虚拟机,它支持跨平台编译。 跨编译它可以创建一个应用程序,该应用程序可以在 A 平台上编译 Java 代码,然后在 B 平台上运行。 换句话说,你可以将其理解为可以在 Linux 平台上编译,然后在 Android 平台上运行。 虽然 JVM 本身可以在任何操作系统上运行,但由于其重量较大,在 Android 平台上,使用更轻量级的版本,并进行跨平台编译会更好。 达尔文字节码(即 classes.dex 文件)它在 Dalvik 虚拟机中运行应用程序。


让我们更准确地了解 JVM 和 DVM。JVM 是一种用于执行 Java 字节码的虚拟机。 Java 虚拟机是用于运行安卓应用程序的 DVM。 Dalvik 虚拟机它是依赖于平台的。也就是说,


不同的操作系统,JVM 的实现方式也不同。但是… 编译后的 Java 字节码 (JAR 文件) 可以在任何 JVM 上运行。 Dalvik 虚拟机针对移动设备环境进行了优化,使其能够在较低的内存环境下运行(这主要是因为移动设备的电池和性能限制)。这两个虚拟机都基于 Java,如果您使用 Java 编写代码,就可以看到 .java 文件,这是 Java 源代码,而 .class 文件则是 Java 字节码。 Dalvik 虚拟机可以将 .class 文件转换为 dex 格式,使其可执行。 此外,还有一个特点是


JVM(Java虚拟机) 堆栈虽然基于此,但 DVM 具有... 寄存器它基于这种机制。因此,在执行过程中,JVM 使用类似于之前接触过的汇编语言的 PUSH 和 POP 这样的操作符。而 DVM 由于操作数被存储,因此不需要 PUSH 和 POP 操作,而是通过简单的指令来执行,虽然指令数量较少,但代码长度较长。类似于在安卓系统中,可以将 DEX 文件反编译为 Smali 代码(安卓 DEX 格式的汇编语言),从而让人能够理解机器码。



* 此外,Windows 也是基于堆栈的。


2-2. ART(Android 运行时)、APK(Android 软件包)、DEX(Dalvik 可执行文件)

ART是谷歌为了在DVM中提升性能而进行的修改。DVM的 即时编译过程这些 AOT 编译流程因此,这两个流程都在使用中,而AOT编译... 垃圾回收这方面得到了改进。 让我们再来看看JIT(准时制)。 JIT指的是 动态翻译有时也称之为“首次启动时机器翻译”。这是因为在应用程序首次启动时,系统会进行机器翻译。然而, 由于对硬件的压力较大,可能会导致电池续航时间缩短等负面影响(如电池和CPU),并且运行速度会变慢。 不过,它的容量较低,但安装速度很快。AOT(提前编译) 在安装应用程序时,会进行编译。因此,可以减少电力消耗,并提高性能两倍。 然而,它的容量较大,但安装速度较慢。尽管如此,它的运行速度很快,并且可以减少对硬件(如电池、CPU)的消耗。自 2016 年 Android 7.0 (Nougat) 之后,ART 既使用了 JIT 编译,也使用了 AOT 编译。在安装时,默认使用 JIT 编译,并在需要时灵活地应用 AOT 编译。


APK 文件在安卓系统中 一种以程序形式分发的格式的文件它采用类似于 Java 程序的 JAR 格式,并使用 ZIP 压缩结构。 APK 包文件安装的路径包括 /data/app/包名 和 /data/data/包名。 DEX 是 达尔文可执行文件它是由用 Java 编写的类文件组成的集合。


通过这张图片,您可能会更容易理解。Java源代码首先被组织成不同的类,然后将这些类组合成一个名为 Classes.dex 的文件,最后由 DVM 运行。


※ 之前已经说明过,在 Windows 系统中,存在 PE 结构。Windows 通过 Prefetch 功能对这些 PE 文件进行优化。如果在首次使用程序后进行优化,后续运行速度可能会更快。您可以在以下网站安装并打开 WinPrefetchView 程序,您会看到许多以“pf”作为扩展名的文件。即使是同一个程序,如果文件路径不同,也会显示不同的文件。 我们可以这样理解:Android 的 DEX 文件负责应用程序的优化。但需要注意的是,Android 的文件路径可能会有所不同。

查看 Windows 预加载文件 (.pf) 的内容



3. Java API 框架和应用程序层

我重新从安卓系统的层级结构中提取了一些图片(因为之前已经提取了很多)。 Java API 框架正如我之前简要提及的那样,在HAL层级中 为了使用硬件,请参考框架提供的接口。据报道,安卓操作系统的一些功能可以通过这个API访问。这些功能包括Activity Manager(如电话、资源和通知)、内容提供者和视图系统。在讨论应用程序层面的应用程序组件时,我们可能会更详细地介绍这些内容。


应用程序层它可分为系统应用程序和用户应用程序。系统应用程序位于 /system 目录下,用户无法控制或修改。可以将其与安卓手机自带的应用程序(如电话、短信等)进行比较。用户应用程序位于 /data 目录下,用户可以控制或修改。每个应用程序 沙箱这些应用是在沙盒环境中运行的,它们无法直接影响系统或进行数据通信。 只能访问拥有特定权限的资源,例如 KakaoTalk 和 Naver 等常见的应用程序。 我们可以认为,当我们使用这些应用程序并授予它们权限,实际上也是在沙盒环境中进行操作。


※ 让我们更详细地解释一下“沙盒”的概念: 这是一种被隔离的区域,进入后不允许。 每个应用程序 独立的空间这在程序中是正常的,而且,进入沙箱环境 它也可能影响其他应用程序。 用户应用程序以普通用户的权限运行,而系统应用程序的控制和修改只能由管理员权限完成。同样,即使在沙箱保护下,也可以通过管理员权限绕过,这就像安卓手机用户可能会遇到的“越狱”。越狱允许普通用户以管理员权限来控制,类似于在 Linux 中使用 setuid 和 setgid 来更改进程的权限。换句话说,越狱可以被认为是破坏 Linux 内核安全(如果您在使用 Linux 的 sudo su 命令,那么您应该知道 su 的含义)。


为了更详细地解释沙盒和root,我们先来了解一下:

与所有安全功能一样,应用程序沙箱也具有不可突破性。然而,如果设备配置良好,想要突破沙箱,就需要损害 Linux 内核的安全。

谷歌

即使在基于Linux的安卓系统中,root权限也能让您完成所有操作。 最高用户等级这是一种情况。 只有少数关键的应用程序才能以 root 权限运行,但一旦在 Android 设备上进行 root,就可以以 root 权限运行所有正在运行的应用程序。 实际上,我们可以认为制造商在技术上是我们的手机所有者。 尽管我们从技术上来说是手机的所有者,但由于这种原因,我们无法获得 root 权限。 至于为什么进行 root,原因可能因用户而异。 目的是完全控制该设备。 这可能出于以下目的:为了让手机拥有更美观的主题,或者为了使用只能通过“root”安装的特殊应用程序。 此外,也可能是为了学习或从事与开发者或安全相关的工作。 但这些都伴随着… 缺点虽然存在这样的情况, 该设备的安全防护薄弱,容易受到恶意应用程序的攻击。包括已失效的联系方式、消息等,这些原本应该被沙盒机制保护。 其他应用程序可能通过某种方式入侵,从而执行额外的操作(例如,获取信息)。或者设备损坏 无法使用或失效,导致保修失效因此,可能无法进行维修。


※ 苹果手机最初就是为了让用户拥有 root 权限而设计的。实际上,苹果手机也是基于 Linux 系统的。而且,它也像其他系统一样,被设计成只能在沙盒环境中运行,从而防止对其他应用程序的入侵。因此,在苹果手机上进行 root 操作… 破解电子设备人们称之为“应用签名”。那么,为什么人们认为 iPhone 的安全性更高?主要原因是应用签名。 简单来说,无论是 Android 还是 iPhone,开发者都会对应用程序进行签名,并通过证书来验证其真实性。 建立互信关系。 然而,Android 允许开发者进行签名,但 iPhone 则由 Apple 在 App Store 中自行处理,因此无法使用未经认证的应用程序。因此,人们认为 iPhone 的安全性更高。 虽然安卓系统上的应用商店里有很多 APK 文件,但与苹果系统相比,这可能也是一个原因。


3-1. 应用程序组件(Activity、Service、Broadcast Receiver、Content Provider)

应用程序组件 (App 组件)这些是安卓应用程序必须具备的必要组成部分,它们各自独立存在,并负责执行特定的功能。总共有4个组成部分,它们决定了系统或用户如何访问应用程序。 入口首先 活动活动是用户与系统直接交互的入口。 用户界面 (UI)可以这样理解。 服务这是一个通用的入口,用于在后台持续运行应用程序。在这里,“后台”指的是应用程序在不主动运行的情况下,仍然可以播放音乐、在一段时间后自动执行任务、下载或复制大型文件、以及进行网络通信等一系列操作。换句话说,在 Windows 中,我们通过键盘或鼠标来控制程序,这被称为“前台”。而在 Android 平台上,通过打开应用程序并直接触摸来控制,这也可以被认为是“前台”。而“后台”则需要能够在不直接控制的情况下,自主运行。 背景界面不提供用户界面。


※ “前台”和“后台”的概念适用于所有操作系统。


广播接收器这是一个组件,可以帮助应用程序定期接收系统发出的事件。 用户流程(Flow - 异步数据流,即,一种连续地数据传输方式) 即使在使用特定应用程序时,持续地向外发送数据,大多数广播操作是由系统触发的,例如屏幕关闭、电池电量不足或拍照等操作。 应用程序也可以通过广播功能,在状态栏上显示通知。


※ 广播接收器的组成部分中的“Boot Complete”与Windows的启动程序类似。如果恶意软件被添加到此启动程序中,即使关闭和重新启动手机,它仍然可以继续运行。


最后 内容提供者它管理应用程序数据的共享集合,例如文件系统和 SQLite,这些都是用于持久存储数据的存储库。应用程序数据的共享集合指的是,这些数据可以通过网页或普通应用程序访问。例如,内容提供者可以管理用户的联系信息,并通过这些信息,普通应用程序也可以提供与联系信息相关的额外功能。


* 虽然可以通过组件获取 Intent,但 Intent 是一种用于在不同应用程序组件之间请求特定任务的消息对象。 换句话说,当需要在多个应用程序之间或在同一应用程序内部进行通信时,可以使用 Intent。 例如,如果需要显示界面,则使用 Activity 组件;如果需要在后台执行任务,可以使用 Service 组件;如果需要发送通知,可以使用 BroadcastReceiver 组件。 Intent 是一种用于发送消息,例如,通过内容提供者获取共享数据。



Ⅲ. 通过网络学习到的简单总结

这部分可以简单理解为技巧。通信网络由国家层面构建,通信公司使用。为了保护个人身份,即保持匿名性,可以绕过常规的网络连接过程,例如使用代理、VPN、SNI等。通常,从起始点经过多个路由器到达目的地(这是一种最初由军队使用的技术)。 代理它就像一个代理,可以代替我完成刚才提到的常见网络流程。因此,源IP显示为代理,而代理通常位于提供服务的服务器之外。 VPN(虚拟专用网络)它看起来像是从我这里发出的,但实际上是通过一个虚拟计算机到达目的地。也就是说,我被这个虚拟计算机所隐藏。 不同的 VPN 提供商,通过使用这些 VPN,你的源 IP 地址就会变成该提供商的虚拟计算机。 SNI (服务器名称指示)这种方式是由互联网服务提供商(ISP)对Host的信息进行过滤,从而阻止访问有害网站。 类似于韩国的SKT、KT、LG,我们的网络连接实际上也在受到一定程度的监控。 当普通用户尝试通过HTTP(80端口)或HTTPS(加密的443端口)访问国家指定的有害网站时,会被阻止。 也就是说,在通过路由器进行常规的网络连接之前,会在中间进行监控并阻止。 至于源IP地址,仍然是自己的IP地址。


请勿访问有害网站(或者……)。



评论

从今天开始,基础教育的最后一周开始了。我们从移动设备的概念开始,内容逐渐深入,这很有趣,但也让我感到有些压力,因为内容越来越多。从明天开始,我们将进行更多实践性的课程,我有点担心能否跟上进度,但另一方面,我也很期待这些课程会很有趣。😁