这一章主要是介绍安卓从Linux分支而来却又具有自己特有特性如Dalvik,framworks,JNI,bionic等。
- 1.1 主要是安卓的发展历史 每个版本的变更
wiki也有相应的更新 目前android已更新到8.1(注意每个版本代表性的更新特性)
可以看到6.0和7.0已经占到了约50%.
- 1.2 安卓和linux在体系结构上的区别(重点)
可以明显的看到区别在于 GlibC替换成了Bionic和HAL (主要是为了避开开源协议)
然后Android删除了Linux上特有的那些特有的X-Windows和Gnome/KDE/etc等,增加了Dalvik JNi Frameworks等
- Android的Frameworks层
安卓的很大一部分成功来源于他丰富的framworks,不然它也只是一个简单的嵌入式设备。
同时Android也允许开发人员使用更高级别的JAVA ,而不是低级别的C/C++;主要原因是得益于android丰富的API
通过Java的包命名方式,Android框架被分为独立的命名空间,
Table 1-2: The Android Frameworks(API 1~22)
Package Name | API | Contents |
android.app | 1 | Application Support |
android.content | Content providers | |
android.database | Database support, mostly SQLite | |
android.graphics | Graphics support | |
android.opengl | OpenGL Graphics support | |
android.hardware | Camera, input and sensor support | |
android.location | Location support | |
android.media | Media support | |
android.net | Network support built over java.net APIs | |
android.os | Core OS Service and IPC support | |
android.provider | Built-in Android content-providers | |
android.sax | SAX XML Parsers | |
android.telephony | Core Telephony support | |
android.text | Text rendering | |
android.view | UI Components (similar to iOS‘s UIView) | |
android.webkit | Webkit browser controls | |
android.widget | Application widgets | |
android.speech | 3 | Speech recognition and Speech-to-Text |
android.accounts | 4 | Support for account management and authentication. |
android.gesture | Custom gesture support | |
android.accounts | 5 | User account support |
android.bluetooth | Bluetooth support | |
android.media.audiofx | 9 | Audio Effects support |
android.net.sip | Support for VoIP using the Session Initiation Protocol (RFC3261) | |
android.os.storage | Support for Opaque Binary Blobs (OBB) | |
android.nfc | Support for Near Field Communication | |
android.animation | 11 | Animation of views and objects |
android.drm | Digital Rights Management and copy protection | |
android.renderscript | RenderScript (OpenCL like computation language) | |
android.hardware.usb | 12 | USB Peripheral support |
android.mtp | MTP/PTP support for connected cameras, etc | |
android.net.rtp | Support for the Real-Time-Protocol (RFC3501) | |
android.media.effect | 14 | Image and Video Effects support |
android.net.wifi.p2p | Support for Wi-Fi Direct (Peer-To-Peer) | |
android.security | Support for keychains and keystores | |
android.net.nsd | 16 | Neighbor-Service-Discovery through Multicast DNS (Bonjour) |
android.hardware.input | Input device listeners |
Package Name | API | Contents |
android.hardware.display | 17 | External and virtual display support |
android.service.dreams | "Dream" (screensaver) support | |
android.graphics.pdf | 19 | PDF Rendering |
android.print[.pdf] | Support for external printing | |
android.app.job | 21 | Job scheduler |
android.bluetooth.le | Bluetooth Low-Energy (LE) support | |
android.hardware.camera2 | The new camera APIs | |
android.media.[browse/projection/session/tv] | Media browsing and TV support | |
android.service.voice | Activation by "hot words" (e.g. "OK Google") | |
android.system | uname(), poll(2) and fstat[vfs](2) | |
android.sHUYLFHFDUULHU | 22 | SMS/MMS support (CarrireMessageingService) |
frameworks是以jar包的形式存在于设备的/system/framwork 下 最终被打包成boot.art文件。
2.Dalvik虚拟机
随着本书的印刷,Dalvik正在被Android RunTime(ART)所取代, 如本章后面所述。然而,与普遍的看法相反,这并不意味着 Dalvik正在消失:只有Just-In-Time(JIT)编译方面 取而代之,但文件格式(DEX)仍然非常活跃,关键架构也是如此 概念。因此,我们在第二卷中详细讨论了Dalvik DnG ART。
3.JNI
虽然Android程序在虚拟机中运行,但通常为了访问硬件或者其他设备需要使用JNI在程序代码中创建库。
Google 提供了NDK供我们使用。在处理图形界面和对抗反编译时很有效。同时为了适配Arm intel自己做了一个仿真器
Intel provides a closed-source ARMemulation called Houdini (extending Dalvik/ART, as
discussed later in Volume II) as part of theirAndroid distribution. This emulator, (along with a
few minor modifications in Dalvik), enables ARMnative libraries to work on Intel architectures.
4.二进制文件
多见于/system/bin或者/system/xbin目录下
编译android源码时会使用NDK-toochains来交叉编译
5. Bionic
Android使用自己的C运行库,Bionic
Bionic是开源的,但是使用aBSD许可证(这对于第三方链接更加宽容)以及Android的混合体自己的执照。
6. 增加的特性
抛开法律问题,bionic比GLibC更轻量化,对于Android来说效率更高。
bionic的系统调用存放在 bionic/libc/SYSCALLS.TXT,当然也有些系统调用是不导出的。
不支持System V IPC,有限的Pthread功能:一方面,Pthread支持内置于Bionic有限的C ++支持:虽然支持C ++(的确,大部分Android的代码都是
用C ++编写),例外情况不是。同样,标准模板库(STL)不是包括,但没有限制手动链接它(一个端口可以找到外部/ stlport项目)。
增加了功能:
系统属性:属性是Android的独特功能,它允许系统以及提供各种配置和操作参数的应用程序在一个简单的键/值存储中。这与Java属性的概念类似(实际上是通过Java的System.properties可访问)。 Android严重依赖于此机制,通过共享内存区域提供,可访问且只读到系统上的所有进程,但只能通过/ init进行设置。
硬编码了UID/GID的实现:而不是依赖于password和group.
内置DNS解析:Bionic集成了DNS名称到IP解析代码 (一般在libresolv.so中)。
硬编码的服务和协议:彻底解决libresolv.so。移除了*nux上部分对文件和协议的支持
7.移植中的挑战:
在移植中主要的问题点在Bionic,虽然在某种程度上于GUN libc兼容,但是上一些功能如notably multithreading
,则不会移植。
,则不会移植。
Android 与Linux有着相同的系统调用,静态二进制文件完全兼容。
除了bionic之外Android还包含了一些其他重要运行时的库来支持Dalvik,frameworks和系统进程。
system / core中的库通常提供内核Androidisms的包装,或实现 用户模式中的附加功能,包括:
看到这个zipfile的时候感觉这些库都可以来fuzz下 看能不能找出些问题
frameworks/ provide 为Android框架提供本机支持服务。
这些都是病毒常注入的系统库 如libandroid_runtime.so
额外的本地库
Android有150多个额外的本地库一旦部署在设备上,外部库与很大程度上无法区分与AOSP的区别 他们都在system/lib目录下(有些也在/verndor/lib)
硬件抽象层(Hardware Abstraction Layer)
由于Android要运行在各种不同的设备上,底层的硬件规范件差距肯呢个很大,所以android定义了(HAL)统一标准来提供给硬件提供商自由的创造他们在内核模式下的驱动程序
他只需要一个二进制文件放置与system / lib / hw目录下 libhareware.so会主动加载他们(我们编译安卓系统刷机时也会需要下载对应设备的驱动放于指定的目录下)
硬件抽象层自然是Android的一个非常重要的方面 - 都是
因为它代表了与Linux的分歧,并且因为它有助于支持
大量Android设备。
The Linux kernel
Linux内核由于其开放源代码和免费许可证性质,提供了极好的性能Android *基板。
从Linus Torvalds的初始版本开始内核继续以惊人的速度发展,每个星期或几个月增加新功能。
Android自己的内核的性能受到显着影响,并且显着的例子被压缩RAM和64位支持。它将内核版本3.10作为Lollipop的最低版本:内核从3.7开始正式支持ARM64(AArch64)。
Android内核的编译方式与Linux的配置文件略有不同通过合并Android的基础和推荐的配置模板来生成那些默认的内核分发版本(如source.android.com网站内核所示)
部)
Android将自己的特质或Androidisms引入到核心。这些内核中的一些内核由#ifdef语句为条件守护编译,其余的在drivers / staging / android目录下。
匿名共享内存,binder,Logger,IO内存分配器,低内存清除,
RAM控制台(内核panic就找他,存放着dmsg的log),驱动同步,定时输出,睡眠锁(电源管理)