標籤:sys keychain 預設 重要 kernel splay 量化 sed 二進位
這一章主要是介紹安卓從Linux分支而來卻又具有自己特有特性如Dalvik,framworks,JNI,bionic等。
wiki也有相應的更新 目前android已更新到8.1(注意每個版本代表性的更新特性)https://zh.wikipedia.org/wiki/Android 可以看到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, asdiscussed later in Volume II) as part of theirAndroid distribution. This emulator, (along with afew 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記憶體 Clerk,低記憶體清除,
RAM控制台(核心panic就找他,存放著dmsg的log),驅動同步,定時輸出,睡眠鎖(電源管理)
Android Internals.A第一章