WeSeong 登录
← 返回文章列表
Android

Android(Linux Kernel, HAL, Native C/C++ Libraries, ART, Java API 框架、应用程序)

Android(Linux Kernel, HAL, Native C/C++ Libraries, ART, Java API 框架、应用程序)

一、概述

让我们来看看 Android(Android). Linux 和 Java 基于 Android 从 Linux Kernel 层延伸到 HAL(Hardware Abstraction Layer), Native C/C++ Libraries, Android Runtime, Java API Framework 和 System Apps 层。让我们了解每一层的作用和工作原理。 Linux Kernel 负责管理和控制整个系统,包括硬件、网络和文件系统访问。 HAL 通过 Java API 框架(Framework)为设备的硬件功能提供标准接口。 Native C/C++ Libraries FreeFont(字体), Webkit(浏览器引擎), Media(编解码器), SQLite(轻巧 DB) 它允许您使用诸如 Android Runtime Android 它使应用程序可以被操作系统使用。 Java API Framework Activity Manager(Telephony, Resource, Notification 等等)。 Content Providers, View System 有多种类型,包括硬件控制为了 提供了一个接口。 应用层系统分为系统应用程序和用户应用程序。系统应用程序拥有最高的用户权限(root)有些应用程序可以由用户管理,例如电话呼叫和消息。用户应用程序可以由普通用户管理,包括 KakaoTalk 和 Naver。



Ⅱ. Android(Android)

  1. Linux Kernel 和 Hardware Abstraction Layer(HAL)

Android(Android)它是一款专为移动设备设计的操作系统。 Linux 它基于内核,最近基于 Java 语言构建。 Kotlin此外,还在开发应用程序。 Native Development Kit通过 Android在 C, C++开发也可以通过


Android通常遵循以下结构,如下所示 Linux Kernel(Linux 内核层我们来看看。 Linux 基于内核开发 OS(作为一个操作系统,内核与其他操作系统类似。 管理和控制整个系统,包括硬件、网络和文件系统访问。 还有更详细的功能,如安全设置、内存管理、电源管理、网络系统管理以及设备(蓝牙设备、网络设备、电池、AP芯片、多个传感器等)驱动程序管理。 HAL(Hardware Abstraction Layer) 层次结构它存在。 HAL指抽象的硬件, Windows有几种方法可以使用硬件 API 接口通过 与可访问的一样 Android在 Java API 通过框架为设备的硬件功能提供标准接口。如上图所示 Audio使您可以使用 Bluetooth, 它提供了用于特定类型硬件组件的模块,例如 Camera、Sensors 等。


在 Android 中使用的 CPU 通常采用 RISC,但也有一些使用基于英特尔的 CPU 的 Android.有关 CPU 的更详细信息,请参阅以下帖子。

[SK Shielders SeSAC 成东第1] CPU Architecture, Memory Architecture


  1. Native C/C++ Libraries 和 ART(Android Runtime)

下一篇 Native C/C++ Libraries(本地 C/C++ 库)层次结构有一个本地层,我们之前已经简要提到过。 Android Native Development Kit(NDK)它包括 Android NDK C或 C++ 它支持基于语言的应用程序开发,并且作为一款库, FreeFont(字体), Webkit(浏览器引擎), Media(编解码器), SQLite(轻巧 DB) 它允许您使用诸如此类的内容。在上图中,原生图层的旁边 Android Runtime 层次结构有的。简单地说,有几种情况。 Android 它允许应用程序由操作系统使用。之前 Dalvik以前也叫这个名字,但现在 ART(Android Runtime)被称为字节码,它是使用 Java 编译器编译的 它允许您转换为 DEX 格式,将其打包为 APK 并运行。这可能很难理解,因此我们来看看 Java 是如何编译和执行的。


2-1. JVM(Java Virtual Machine) 和 DVM(Dalvik Virtual Machine)


在 Java 中开发(编码)后 Java Compiler Class基于 Java Bytecode创建一个。这样, Java Virtual Machine我可以运行这个程序, Java Bytecode处于可执行状态的文件 Jar如果我们更详细地看一下这个问题,


如上图所示 Java该公司开发的程序 Compiler通过 ByteCode被转换为这个 ByteCode转到"一般" Java 程序 JAR如果是这样, Android 应用程序 Dalvik ByteCode(.dex)然后再次转换它 APK它被转换为字符串。 转换后 JAR和 APK JVM(Java Virtual Machine)和 ART(Android Runtime)我们实际上通过它使用 Naver Maps通过 您可以在真实的环境中使用应用程序,就像探索您想要访问的地方一样。


※ JVM(Java Virtual Machine)它位于shell和用户程序(应用程序)之间。Android 的名称是 Dalvik Virtual Machine它是交叉编译的。* 交叉编译 A 在平台上 Java编译它 B 它可以创建在平台上运行的应用程序,即 Linux在编译中 Android将其视为使我们能够运行各种事物是个好主意。 JVM 在任何操作系统上都可以实现此操作,但它存在明显的缺点。 Android它更轻便,可以进行交叉编译 Dalvik ByteCode(完全正确 classes.dex)与 Dalvik Virtual Machine运行应用程序。


让我们仔细看一下 JVM 和 DVM. JVM 是一个 Java 虚拟机 ,用于运行 Java 字节码 . DVM 是一个 Dalvik 虚拟机 ,用于运行 Android 应用程序 . Java 虚拟机依赖于平台,这意味着


按操作系统 JVM它会变化。但是 编译的 Java 字节码JAR)是什么 JVM它可以从任何地方运行。 Dalvik 虚拟机针对移动设备环境进行了优化,并专门设计用于在低内存条件下运行,这与移动设备的限制(如电池寿命和性能)有关。这两种虚拟机 Java基于 Java如果你尝试编写它, .java 您应该可以看到该文件,它是 Java 源代码和 .class这是 Java 字节码。 Dalvik 虚拟机就是这个。class 文件 dex我们将其更改为可执行的状态。 另一个特点是


JVM 堆栈 (Stack)虽然基于, DVM 注册 (Register)是基于的。因此,在计算过程中 JVM我们使用栈来查看上次简要讨论过的汇编器。 PUSH, POP另一方面,使用了类似的运算符。 DVM因为操作数已被存储 PUSH, POP 由于它使用简单的指令而没有运算符,指令数量较少,但代码较长。正如汇编语言允许人类在一定程度上理解机器代码一样, Android在 DEX反编译它 Smali 代码 (Android DEX 您可以使用格式汇编器来检查此信息。



顺便说一句,Windows 也是基于堆栈的。


2-2. ART(Android Runtime) 和 APK(Android Package Kit), DEX(Dalvik Executable)

ART Google DVM它已被修改以提高性能。 DVM的 JIT 编译过程 AOT 编译过程然而,这两种过程都在使用中,而 AOT 编译 Garbage Collection此问题已得到改进。 JIT(Just In Time)我们来仔细看看。 JIT 动态翻译Dynamic Translation)它也被称为机器翻译,因为它在第一次执行时将应用程序翻译为机器代码。 硬件上有负载,这会产生负面影响,例如电池寿命降低(电池、 CPU它运行起来可能繁琐且缓慢。 但是,其容量小,安装速度快。 AOT(Ahead of Time) 在应用程序安装时进行编译,可降低功耗并将性能提高 2 倍。 相反,它具有高容量和较慢的安装速度,但执行速度快,硬件(电池)消耗低。 CPU) 使用量在下降。 2016 年 Android 自 who(7.0) 以来 ART在 JIT和 AOT 它用于编译,但不在安装期间使用 JIT根据情况使用它并保持灵活性 AOT应用它。


APK 是一种在 Android 上分发的 程序的文件格式。它是 Java 程序 JAR 文件格式的扩展格式,具有 ZIP 压缩结构。APK 包文件安装在 /data/app/包名 和 /data/data/包名 目录中。DEX 是 Dalvik Executable,是 Java 编写的 Class 文件的集合。


如果你看到这张图片,就更容易理解了。 Java Source Code被创建为类,这些类被组合在一起 Classes.dex已创建 DVM它继续运行。


在上一篇文章中提到,Windows 有一个 PE 结构。这个 PE 结构用于优化带有 Windows 扩展的 Prefetch通过 文件,这些文件具有 pf 扩展名。如果您在第一次使用程序后对其进行优化,那么它可能会在以后运行得更快。在下面的网站上安装和打开 WinPrefetchView 程序时,您会看到几个 pf 文件,尽管它们是同一个程序,但路径不同。如前所述,Android DEX 负责应用程序优化。但是,Android 的路径可能不同。

查看 Windows Prefetch (.pf) 文件的内容



3. Java API Framework 和应用层

Android 我尝试从上面重新导入层次结构的照片(它已经被下载得太多了…)。 Java API Framework这已经在前面提到过。 HAL 在此层次结构中, 请参阅用于启用硬件使用的接口框架他说。 Android OS其许多功能都是 API通过 它是可访问的 Activity Manager(Telephony, Resource, Notification 等等)。 Content Providers, View System有的。当我们在应用层描述应用程序组件时,将会更详细地讨论这一部分。


应用层它分为系统应用程序和用户应用程序。系统应用程序位于 /system 存在于目录中,用户无法修改或删除。 Android 在购买手机时,最好考虑内置的应用程序(电话、短信等)。用户应用程序是/data 它存在于一个目录中,用户可以对其进行修改或编辑。每个应用程序 沙箱 (Sandbox)它已安装且无法单独访问或传输数据。只有具有每个应用程序权限的资源才能被访问,而像 KakaoTalk 和 Naver 这样的通用应用程序都是用户应用程序。我们可以认为应用程序的使用和权限的授予都与沙箱有关。


※ 为了更详细地解释沙箱, 这是一种隔离空间,是你不应该进入的区域。 每个应用程序 单独空间跑到那里是很自然的,然后进入沙箱。 它也不能影响其他应用程序。 用户应用程序以普通用户权限运行,而系统应用程序只能在具有管理员权限的情况下被禁用或修改。同样,通过管理员权限可以绕过沙箱保护的内容,但一旦破坏了沙箱保护, Android 如果您是手机用户,您可能已经听说过 rooting。rooting 允许普通用户使用管理员权限进行控制, Linux在 setuid, setgid它更改了程序的所有者,就像更改进程的权限一样,也会更改所有者。 Linux 可以说,进行 root 会危及内核的安全性。Linux在 sudo 您可能以前已经使用过 su 命令。 switch user)。


为了更详细地解释沙箱和定位,我们来继续下一步。

与所有安全功能一样,应用程序沙箱不会受到破坏。但是,在配置合理的设备上逃离沙箱,必须破坏 Linux 内核的安全性。

Google

Linux 基于 Android此外, root 权限允许您执行所有操作 最高用户级别只有几个核心实用程序。 root 可以以具有特权的方式执行,但 Android在 Rooting(如果你进行了 root 操作,所有正在运行的应用程序都会 root 它可以获得许可使用。事实上,制造商可以被视为我们购买的手机的所有者。我们拥有物理上的手机,但这就是为什么我们 root 虽然这不是一种特权,但进行这种 rooting 的原因是每个用户都有不同的目标。 它旨在完全控制设备。 这可能是为了用更漂亮的主题装饰手机,使用只能通过 root 才能安装的特殊应用程序,也可能是因为开发者或安全相关的研究或工作。但这都有代价。 缺点它也存在, 设备安全性受到威胁,使其容易受到恶意应用程序的攻击那些本来应该通过沙箱保护的联系人、消息和其他数据 其他应用程序已经渗透并添加了 操作(例如提取信息)如果设备损坏,您也可以这样做。 变得不可用或保修无效可能无法修复它。


※ iPhone 从一开始就使用了根用户权限。事实上, iPhone Linux 它基于沙箱,该沙箱的配置可防止其他应用程序受到破坏,同时也阻止在 iPhone 上进行 root 操作。 越狱 (Jailbreak)Jail Breaking)那么为什么 iPhone 更安全呢?这是因为应用程序签名。有一种称为代码签名的技术,它可以在开发的应用程序上留下签名,无论是 Android 还是 iOS,以验证证书。通过 建立信任关系。 但是 Android开发者可以为应用程序签名,但对于 iPhone 来说,苹果会通过 App Store 自己进行签名,因此未经验证的应用程序无法使用。据称,这样做可以提供更好的安全性。 Android网上有很多 apk 文件,但这也是为什么 iPhone 没有它们的原因。


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

应用组件 (app components) 是一个 Android应用必须具备的基本组件,它们以独立的形式存在,每个组件执行特定的角色。一共有四个组件,入口点决定系统或用户如何进入应用。首先,有 Activity(活动) ,这是直接与用户交互的入口点。将其视为 用户界面 (UI) . Service(服务) 是一个多功能的入口点,用于在后台运行应用。这里,后台 (Background) 指在应用不运行时执行的一系列过程,例如播放音乐、时间流逝、下载或复制大文件,或通过网络进行通信。换句话说,在 Windows 中使用键盘或鼠标响应控制程序称为前台 (Foreground),而在 Android 中直接触摸和控制应用屏幕则称为后台。 前景是您所期望的。另一方面,背景应能够独立运行,而不需要直接控制。即使应用程序未运行,它也能正常工作。因此,背景不提供用户界面。


※ 此前景、背景概念适用于所有操作系统。


Broadcast Receiver(广播接收器)是一个组件,允许系统将定期发生的事件传递给应用程序。 用户流程Flow - 异步数据流,即数据以连续方式传输和接收的形式 即使我在使用特定应用程序并持续发送和接收数据时,大多数广播也是由系统触发的,例如屏幕关闭、电池电量低或拍摄照片时。甚至一般用户应用程序也会产生广播。通过 您可以执行诸如在状态栏中显示通知等任务。


广播接收器组件中的Boot Complete(启动完成)类似于Windows中的启动程序。恶意软件可以在启动完成中注册,以便即使手机关闭也能持续运行。


最后 Content Provider(内容提供者)是一个文件系统, SQLite它管理数据持久存储中的一组共享类型的应用程序数据。一组共享类型的应用程序数据意味着它可供基于 Web 的或通用型应用程序使用。例如,内容提供者可以管理用户的联系信息,并使其可供其他应用程序使用。通过, 一般用户应用程序还可以通过联系人信息提供单独的功能。


※ 在组件中 Intent知道一下倒也不错。 Intent是一个消息对象,可用于向其他应用组件请求特定操作,即在多个应用之间通信或在同一应用内通信时。 Intent在编写应用程序时,您可以使用 Activity 组件来显示屏幕,使用 Service 组件在后台运行,使用 Broadcast Receiver 组件传递通知,以及使用 Content Provider 组件提供内容。通过 这就是您发送消息来指示服务器检索共享数据的地方。 Intent。



三、关于网络的简单总结

这个部分只是 TIP这没什么大不了的,只需了解这一点即可。通信网络是以国家为基础建立的,由电信公司租用。为了保持匿名,也就是保持隐私,可以绕过通常的网络连接过程。 Proxy, VPN, SNI 有很多种。通常,信号会从源头传递到目的地,途经多个路由器(这种技术起源于军事领域)。 Proxy它起着一种中介的作用,代表我完成常见的网络连接过程。 Source IP Proxy进来吧。 Proxy它通常位于提供服务的服务器之外。 VPN(Virtual Private Network)它从我开始,仿佛外面有一台虚拟计算机,但这台虚拟计算机通过 它会到达目的地。也就是说,我被虚拟机隐藏了。多个 VPN 有一家公司,这个公司通过 VPN如果您使用 Source IP这将成为该公司的虚拟机。 SNI(Server Name Indication) ISP(Internet Service Provider) 该公司 Host它过滤信息,以阻止访问有害网站。 ISP 在我国,公司是 SKT, KT, LG这意味着我们的网络历史在一定程度上正在被监控。对于普通用户来说, HTTP(端口 80), HTTPS(当用户尝试通过加密端口 443 访问由国家指定的有害网站时,路由器会阻止访问并重定向。换句话说,路由器在流量经过正常网络流程之前就进行监控,并阻止访问。 Source IP在这种情况下,是我。


※ 我们不要访问任何有害网站(或 .....)。



评论

今天标志着我们基础培训的最后一周开始。从手机的基础知识开始学习很有趣,但我也担心内容越来越多。明天我们将有几堂实践课,我担心自己跟不上,但另一方面,我真的很期待。😁