雖然好幾個月沒更新博客了,可是老羅一直有在準備能夠分享的東西的。除了早前在微博分享Android4.2相關技術以外,此次還特地準備了13個PPT,總結以前所研究過的東西。內容從Android組件設計思想,到Android源碼開發和調試環境搭建,再到Android專用驅動和應用程序架構等。能夠做爲《老羅的Android之旅》博客和《Android系統源代碼情景分析》一書的導讀,但願對你們有幫助。css
《Android系統源代碼情景分析》一書正在進擊的程序員網(http://0xcc0xcd.com)中連載,點擊進入!
程序員
廢話就很少說了,直入主題,如下就是這個12個PPT的內容介紹以及下載地址。編程
1. Android組件設計思想安全
Android應用開發的哲學是把一切都看做是組件。把應用程序組件化的好處是下降模塊間的耦合性,同時提升模塊的複用性。Android的組件設計思想與傳統的組件設計思想最大的區別在於,前者不依賴於進程。也就是說,進程即便因爲內存緊張被強行殺掉了,可是運行在裏面的組件仍是存在的。這樣就能夠在組件再次須要使用時,原地滿血復活,就像什麼都沒發生過同樣。這種設計思想很是適合內存較小的移動設備。架構
理解Android組件設計思想,對Android應用程序架構會有更好的認識。這一節講Android組件化設計的背景、理念、原則,以及Android在OS級別上提供的組件化支持,其中還會包含一個實驗來驗證這種組件化設計思想,能夠對Android系統有一個高層次的抽象理解。框架
下載地址:http://download.csdn.net/detail/luoshengyang/6439629
異步
2. Android源代碼開發和調試環境搭建ide
Android源代碼開發環境與SDK開發環境相比,優點是能夠查看和調試系統源代碼,包括Java代碼和C/C++代碼。這對應用開發也是很是有用的,由於在開發中碰到疑難雜症時能夠跟蹤到系統內部去定位問題。對於涉及到C/C++代碼的開發,例如JNI開發和安全相關開發,更加建議在Android源代碼開發環境進行,這樣就能夠利用gdb以及gdbclient工具進行調試。異步編程
這個PPT主要講Android源代碼下載、編譯和運行,以及C/C++、Java代碼的調試。函數
下載地址:http://download.csdn.net/detail/luoshengyang/6439633
3. Android系統架構概述
Android系統 = Linux內核 + Android運行時。
Android系統使用的Linux內核包含了一些專用驅動,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,這些Android專用驅動構成了Android運行時的基石。Android運行時從下到上又包括了HAL層、應用程序框架層和應用程序層。HAL層主要是爲規避GPL而設計的,它將將硬件驅動分紅內核空間和用戶空間兩部分,其中用戶空間兩部分採用的是商業友好的Apache License。應用程序框架層主要包括系統服務,例如組件管理服務、應用程序安裝服務、窗口管理服務、多媒體服務和電信服務等。應用程序框架進一步又分爲C/C++和Java兩個層次,Java代碼運行Dalvik虛擬機之上,而且經過JNI方法和C/C++交互。應用程序層主要就是由四大組件Activity、Service、Broadcast Receiver和Content Provider構成,它們是應用開發的基礎。
這個PPT從一個通用的應用程序架構開始,概述Android系統的專用驅動、HAL、關鍵服務、Dalvik、窗口機制和四大組件等。這個PPT 做爲前面第1個PPT的延續,幫助進一步瞭解Android系統的具體實現。
下載地址:http://download.csdn.net/detail/luoshengyang/6439637
4. Android硬件抽象層
Android硬件抽象層從開發到使用有一個清晰的層次。這個層次剛好對應了Android系統的架構層次,它向下涉及到Linux內核,向上涉及到應用程序框架層的服務,以及應用程序層對它的使用。Android硬件抽象層模塊的開發自己也遵循必定的規範。有了這個規範以後,系統就能夠對它進行自動加載,方便上層的使用。
這個PPT經過一個具體的實例來分析Android硬件抽象層的開發、測試和使用,它在幫助咱們理解Android系統架構的同時,也能教會咱們如何在Android源代碼環境中開發C/C++代碼。
下載地址:http://download.csdn.net/detail/luoshengyang/6440375
5. Android專用驅動
Android專用驅動構成了Android運行時的基石。從技術上來說,Android專用驅動也是整個Android系統的亮點,特別是Binder驅動。Binder是一種進程間通訊機制(IPC),它與傳統的IPC機制對比,最大的特色是高效,由於通訊數據在兩個進程之間只須要執行一次拷貝便可。Binder在Android系統裏面使用得很是普遍以及頻繁。在涉及到比較大的通訊數據時,Binder一般還結合另一個驅動Ashmem來使用。Ashmem是一個共享內存驅動,它與傳統的共享內存相比,最大的特色是它是經過文件描述符來描述的,而且能夠動態地進行分塊管理。動態分塊管理的目的是能夠將部分再也不使用了的內存交回給系統,很是適合內存較小的移動設備使用。另一個專用驅動Logger是一個日誌驅動,它與傳統的日誌系統對比,特色是日誌是記錄在內核空間而非文件中,這樣就能夠提升日誌的讀寫速度。
這個PPT講Logger、Binder和Ashmem三個Android專用驅動的實現原理。因爲這三個驅動在Android源代碼裏面用得很是普遍和頻繁,所以理解它們的實現原理,就能夠掌握Android的精華。這對之後閱讀Android系統的其它代碼,也是很是有幫助的。
下載地址:http://download.csdn.net/detail/luoshengyang/6439643
6. Android應用程序進程管理
Android系統裏面的應用程序進程有一個特色,那就是它們是被系統託管的。也就是說,系統根據須要來建立進程以及回收進程。進程建立發生在組件啓動時,它們是由Zygote進程負責建立。Zygote進程是由系統中的第一個進程init負責啓動。此外,用來運行各類系統服務的System Server進程也是由Zygote進程建立的。進程回收發生在內存緊張時,由Low Memory Killer執行。此外,組件管理服務ActivityManagerService和窗口管理服務WindowManagerService也會在適當的時候主動進行進程回收。每個應用程序進程根據運行狀況被賦予優先級,當須要回收進程的時候,就按照優先級從低到高的順序進行回收。
這個PPT講Android應用程序進程的啓動和回收,主要涉及到Zygote進程、System Server進程,以及組件管理服務ActivityManagerService、窗口服務WindowManagerService,還有專用驅動Low Memory Killer。經過了解Android系統對應用程序進程的管理,咱們就能更清楚應用程序的運行機制。
下載地址:http://download.csdn.net/detail/luoshengyang/6439645
7. Android應用程序消息機制
Android應用程序與傳統的PC應用程序同樣,都是消息驅動的。也就是說,在Android應用程序主線程中,全部函數都是在一個消息循環中執行的。Android應用程序其它線程,也能夠像主線程同樣,擁有消息循環。Android應用程序主線程是一個特殊的線程,由於它同時也是UI線程以及觸摸屏、鍵盤等輸入事件處理線程。主線程對消息循環很敏感,一旦發生阻塞,就會影響UI的流暢度,甚至發生ANR問題。
這個PPT講Android應用程序線程消息循環原理,主要涉及到Handler和Looper兩個類,以及根據消息循環的不一樣使用場景,總結出三種線程使用模型。掌握Android應用程序消息處理機制,有助於咱們熟練地使用同步和異步編程,提升程序的運行性能。
下載地址:http://download.csdn.net/detail/luoshengyang/6439647
8. Android應用程序輸入事件分發和處理機制
在Android應用程序中,有一類特殊的消息,是專門負責與用戶進行交互的,它們就是觸摸屏和鍵盤等輸入事件。觸摸屏和鍵盤事件是統一由系統輸入管理器InputManager進行分發的。也就是說,InputManager負責從硬件接收輸入事件,而後再將接收到的輸入事件分發當前激活的窗口處理。此外,InputManager也能接收模擬的輸入事件,用來模擬用戶觸摸和點擊等事件。當前激活的窗口所運行在的線程接收到InputManager分發過來的輸入事件以後,會將它們封裝成輸入消息,而後交給當前得到焦點的控件處理。
這個PPT講Android應用程序輸入事件的分發和處理過程,主要涉及到輸入管理InputManager、輸入事件監控線程InputReader、輸入事件分發線程InputDispatcher,以及應用程序主線程消息循環。
下載地址:http://download.csdn.net/detail/luoshengyang/6440247
9. Android應用程序UI架構
Android系統採用一種稱爲Surface的UI架構爲應用程序提供用戶界面。在Android應用程序中,每個Activity組件都關聯有一個或者若干個窗口,每個窗口都對應有一個Surface。有了這個Surface以後,應用程序就能夠在上面渲染窗口的UI。最終這些已經繪製好了的Surface都會被統一提交給Surface管理服務SurfaceFlinger進行合成,最後顯示在屏幕上面。不管是應用程序,仍是SurfaceFlinger,均可以利用GPU等硬件來進行UI渲染,以便得到更流暢的UI。在Android應用程序UI架構中,還有一個重要的服務WindowManagerService,它負責統一管理協調系統中的全部窗口,例如管理窗口的大小、位置、打開和關閉等。
這個PPT講Android應用程序的Surface機制,闡述Activity、Window和View的關係,以及應用程序、WindowManagerService和SurfaceFlinger協做完成UI渲染的過程。
下載地址:http://download.csdn.net/detail/luoshengyang/6439651
10. Android應用程序資源管理框架
Android應用程序主要由代碼和資源組成。資源主要就是指那些與UI相關的東西,例如UI佈局、字符串和圖片等。代碼和資源分開可使得應用程序在運行時根據實際須要來組織UI。這樣就可以使得應用程序只須要編譯一次,就能夠支持不一樣的UI佈局。這種特性使得應用程序在運行時能夠適應不一樣的屏幕大小和密度,以及不一樣的國家和語言等。資源在Android應用程序編譯的過程當中,也會被編譯成二進制格式。這是爲了壓縮資源存儲空間,以及加快運行時的資源解析速度。Android應用程序在運行的時候,資源管理器AssetManager和Resources會根據當前的機器設置,即屏幕大小、密度、方向,以及國家、地區語言的信息,查找正確的資源,而且進行解析,最後將它們渲染在UI上。
這個PPT講Android應用程序資源的編譯、打包,以及它們在運行時的查找、解析過程。瞭解Android應用程序資源管理框架,有助於咱們更好地開發出可以適配多種機型的應用程序。
下載地址:http://download.csdn.net/detail/luoshengyang/6439653
11. Dalvik虛擬機
Android應用程序是運行在Dalvik虛擬機裏面的,而且每個應用程序對應有一個單獨的Dalvik虛擬機實例。Android應用程序中的Dalvik虛擬機實例其實是從Zygote進程的地址空間拷貝而來的,這樣就能夠加快Android應用程序的啓動速度。Dalvik虛擬機與Java虛擬機共享有差很少的特性,例如,它們都是解釋執行,而且支持即時編譯(JIT)、垃圾收集(GC)、Java本地方法調用(JNI)和Java遠程調試協議(JDWP)等,差異在於二者執行的指令集是不同的,而且前者的指令集是基本寄存器的,然後者的指令集是基於堆棧的。
這個PPT講Dalvik虛擬機的內存管理、垃圾收集、即時編譯、Java本地調用、進程和線程管理等。理解Dalvik虛擬機的上述實現細節,有助於在運行時修改程序的行爲,例如,攔截Java函數的調用。
下載地址:http://download.csdn.net/detail/luoshengyang/6439657
12. Android安全機制
Android應用程序是運行在一個沙箱中。這個沙箱是基於Linux內核提供的用戶ID(UID)和用戶組ID(GID)來實現的。Android應用程序在安裝的過程當中,安裝服務PackageManagerService會爲它們分配一個惟一的UID和GID,以及根據應用程序所申請的權限,賦予其它的GID。有了這些UID和GID以後,應用程序就只能限訪問特定的文件,通常就是隻能訪問本身建立的文件。此外,Android應用程序在調用敏感的API時,系統檢查它在安裝的時候會沒有申請相應的權限。若是沒有申請的話,那麼訪問也會被拒絕。對於有root權限的應用程序,則不受上述沙箱限制。此外,有root權限的應用程序,還能夠經過Linux的ptrace注入到其它應用程序進程,以及系統進程,進行各類函數調用攔截。
這個PPT的計劃是講代碼加殼、注入和攔截技術的,包括:
(1). SO注入。也就是從一個進程向另一個進程注入一個SO文件,經過該注入的SO文件就能夠實現函數攔截功能。
(2). SO加殼。加殼的目的天然就是加大別人對本身的C/C++代碼進行靜態逆向難度了,這個技術的關鍵是要實現一個能純內存操做的Linker了。也就是說,解密後的SO文件內容是保存在一個內存緩衝區的,而後再針對該內存緩衝區進行解析和連接,最終造成一段可執行的代碼。這個過程不會產生任何文件供別人作靜態分析。
(3). C/C++函數GOT攔截。經過修改SO的GOT項來實現函數攔截。這個技術的特色是簡單和穩定,可是不足之處於它是針對函數的調用方進行攔截的,而不是針對函數自己的實現來進行攔截的。這樣當咱們想對某一個函數進行攔截的時候,就必需要檢查進程內全部的模塊,而後對調用了目標函數的模塊的相關GOT 項進行修改。此外,若是某一個模塊是經過動態SO加載技術(dlopen、dlsym)來調用目標函數的話,GOT攔截就失效了,由於動態SO加載技術不會產生GOT項。
(4). C/C++函數INLINE攔截。這種方法是直接對目標函數的前面幾條指令進行修改,用來實現攔截技術。INLINE攔截沒有上述GOT攔截的缺點,可是它的實現會複雜不少。因爲絕大部分Android設備都是基於ARM架構,所以這裏只討論ARM架構的C/C++函數INLINE攔截。ARMl架構主要分爲ARM和THUMB兩種指令集,也就是在Android設備上運行的C/C++函數分爲ARM和THUMB兩種類型。對於ARM指令集的函數,對它們進行攔截至少須要修改頭8個字節;對於THUMB指令集,對它們進行攔截至少須要修改頭12個字節。不管ARM指令仍是THUMB指令函數,咱們要修改的頭8個字節或者12個字節都很容易碰到跳轉或者PC相對尋址指令,這樣就須要對指令進行重定位。這個重定位工做至關於繁重和麻煩,得實現一個ARM和THUMB指令解析庫才行。不像X86的函數INLINE攔截,只須要函數的頭5個字節便可,並且這5個字節幾乎都是堆棧相關的操做,不會涉及到跳轉或者PC相對尋址指令。
(5). DEX注入。在SO注入的基礎上,要對目標進程進行DEX注入是至關簡單的,經過DexClassLoader便可實現。
(6). DEX加殼。DEX加殼與SO加殼同樣,都要求在解密以後,可以進行純內存操做,中間不要產生任何和DEX或者ODEX文件,不然的話,就會給別提供靜態分析的機會,這樣就失去了加殼的目的。
(7). Java函數攔截。與C/C++函數攔截相對,Java函數攔截要優雅得多,由於全部的Java函數都是經過虛擬機來執行的。Dalvik虛擬機執行的函數分爲Java和Native兩種,它們都是使用Method結構體來描述。當一個Method結構體描述的是一個Java函數時,它有一個成員變量就指向該Java函數的方法區。而當一個Method結構體描述的是一個Native函數,它有一個成員變量指向該Native函數的地址。所以,主要咱們能將一個用來描述Java函數的Method結構體修改成一個指向Native函數的Method結構體,就能夠騙過Dalvik虛擬機來執行咱們所指定的Native函數,從而實現攔截。
以上7個技術點涵蓋了Android安全的攻與防基礎。在這些基礎上不只能夠保護咱們本身的代碼,還能夠對別人的代碼進行攻擊。
下載地址:http://download.csdn.net/detail/luoshengyang/6888251
13. APK防反編譯
咱們的APK實際上就是一個ZIP壓縮文件,裏面包含有一個classes.dex,咱們編譯後生成的程序代碼就所有在那裏了,經過apktool等工具能夠輕鬆地將它們反編譯成smali代碼。有了這些反編譯出來的smali代碼以後,咱們就能夠輕鬆地瞭解別人的APK使用的一些技術或者直接修改別人的APK。因爲這些APK反編譯工具的存在,咱們迫切地但願能有方法去防止別人來反編譯咱們的APK,從而保護本身的商業機密和利益。
這個PPT講了三種APK防反編譯技術:1)添加非法指令;2)隱藏敏感代碼;3)僞APK加密技術。此外,還探討了更高級的Dex和Native加殼技術來防止別人反編譯咱們的APK。