日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android卷一全文 第一章 阅读前的准备工作

發布時間:2023/12/9 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android卷一全文 第一章 阅读前的准备工作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本章主要內容

  • 本章簡單介紹Android系統架構、編譯環境的搭建以及一些工具的使用。

1.1 ?系統架構

1.1.1 ?Android系統架構

Android是Google公司推出的一款手機開發平臺。該平臺本身是基于Linux內核的,圖1-1展示了這個系統的架構:


圖1-1? Android系統架構

從上圖中可以看出,Android系統大體可分為四層,從下往上依次是:

  • Linux內核層,目前Android2.2(代號為Froyo)基于Linux內核2.6版本。
  • Libraries層,這一層提供動態庫(也叫共享庫)、Android運行時庫、Dalvik虛擬機等。從編程語言上來說,這一層大部分都是用C或C++寫的,所以也可以簡單地把它看成是Native層。
  • Libraries層之上是Framework層,這一層大部分用Java語言編寫。它是Android平臺上Java世界的基石。
  • Framework層之上就是Applications層了,和用戶直接交互的就是這些應用程序,它們都是用Java開發的。

從上面的介紹可看出,Android最大的特點之一,恐怕就是搭建了一個被廣大Java開發者熱捧的Java世界了。但該世界并不是空中樓閣,它的運轉依賴另一個被Google極力隱藏的Native世界。兩個世界的交互關系可用圖1-2來表示:


圖1-2? Java世界和Native世界交互

從上圖可知:

  • Java雖具有和平臺無關的特性,但Java和具體平臺之間的隔離卻是由JNI層來做到的。Java是通過JNI層調用Linux OS中的系統調用來完成對應的功能的。例如創建一個文件、創建一個Socket等。
  • 除了Java世界外,還有一個核心的Native世界,它為整個系統高效和平穩的運行提供了強有力的支持。一般而言,Java世界經由JNI層通過IPC方式和Native世界交互。而Android平臺上最為神秘的IPC方法就是Binder了。在第六章將詳細介紹Binder。除此之外,Socket也是常用的IPC方式。這些內容在后面的代碼分析中都會見到。

1.1.2? 本書的架構

本書所分析的模塊也將遵循Android系統架構,如圖1-3所示:

圖1-3? 本書的架構圖

從上圖可知,本書所分析的各個模塊除未涉及Kernel外,其他三層均有所涉足,它們分別是:

  • Native層包括init、Audio系統(包括AudioTrack、AudioFlinger和AudioPolicyService)、Surface系統(包括Surface和SurfaceFlinger)、常用類(包括RefBase、sp、wp等)、Vold和Rild。
  • Java Framework層包括Zygote、System_server以及Java中的常用類(包括Handler、Looper等)。
  • Java Application層,包括MediaProvider和Phone。

?

1.2 ?搭建開發環境

本節,將介紹如何搭建Android源碼開發環境。

首先,需要一個Linux系統,我本人推薦安裝Ubuntu10.04(32位版本)。讀者可從網上下載該版本的系統。Windows用戶可使用VMWare或VirtualBox作為虛擬機,來安裝Ubuntu10.04。我本人推薦VMWare,因為它的功能太強大了!

如果要使用VMWare,那么在安裝完Ubuntu之后,一定要把VMWare Tools也安裝上,因為這個工具會提供很多非常實用的功能。這里還有一個小建議,如果Linux系統只是個人使用,則建議用root賬戶登錄系統。在工作中,曾發現很多用非root賬戶登錄的同事整天都在sudo,輸入密碼,這樣做就浪費了不少零碎的時間片。

假設讀者已經安裝好了Ubuntu 10.04(32位版本),并且以root賬戶登錄到系統上了,接下來的工作是:

1.2.1 下載源碼

Android源碼采用Git①做版本管理工具,這個工具由Linux之父LinusTorvalds采用純C開發。關于Git為什么使用C語言開發的問題,還引發了一場關于C和C++孰好孰壞的大討論,不過Linus Torvalds顯然沒樹起“居廟堂之高,則憂其民”的形象。對于普通碼農而言,用最合適的工具、最實用的辦法來完成好工作才是最重要的。所以C、C++、Java、Python等都僅僅是工具而已。

下面介紹如何下載源碼。

1. 設置軟件源

下載Android源碼前,有些下載工具需要從Ubuntu軟件源上下載。可以為Ubuntu系統指定一個軟件源。有些軟件源上有這些工具,有些卻沒有,而且各個軟件源的下載速度也不同,所以應首先找到一個合適的軟件源。Ubuntu軟件源的設置界面如圖1-3所示:


圖1-3? Ubuntu軟件源設置

從上圖中可發現,將軟件源地址設置成了http://mirror.bjtu.edu.cn/ubuntu。每個人可根據自己的情況選擇合適的軟件源。

2. 下載Android源碼

下面開始下載Android源碼,工序比較簡單,可一氣呵成。

  • apt-get install git-core curl?? #先下載這兩個工具
  • mkdir –p ~/android/froyo??????????? #在登錄用戶的目錄下新建android和froyo兩個目錄
  • cd ~/android/froyo?????????????? #進入這個目錄
  • curl http://Android.git.kernel.org/repo > ./repo? #從源碼網站下載repo腳本,該腳本是Google為了方便源碼下載而提供的。通過該腳本可下載整套源碼。
  • chmod a+x repo???? #設置該腳本為可執行
  • ?./repo init -u git://Android.git.kernel.org/platform/manifest.git –bfroyo?????? #初始化git庫
  • ?./repo sync????? #下載源碼,大小為2個多GB,網速快估計得要2個多小時。

下載完后,該目錄中的內容如圖1-4所示:


圖1-4? 源碼下載結果

注意,Kernel的代碼必須要單獨下載,下載方法如下:

git clone git://android.git.kernel.org/kernel/common.gitkernel

1.2.2 ?編譯源碼

1. 部署JDK

Froyo的編譯依賴JDK1.5,所以首先要做的就是下載JDK1.5。下載網址是http://www.oracle.com/technetwork/java/javase/downloads/index-jdk5-jsp-142662.html。下載得到的文件為jdk-1_5_0_22-linux-i586.bin。把它放到一個目錄中,比如我本人,就將它放在了/develop中,然后在這個目錄中執行:

./jdk-1_5_0_22-linux-i586.bin? #執行這個文件

這個命令其實就是解壓,解壓后的結果在/develop/jdk1.5.0_22目錄中。現有了JDK,再按照下面的步驟部署它即可:

  • 在~/.bashrc文件的末尾添加以下幾句話:

exportJAVA_HOME=/develop/jdk1.5.0_22 #設置為剛才解壓的目錄

exportJRE_HOME=JAVA_HOME/jre

exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

  • 重新登錄系統,這樣,JDK資源就能被正確找到了。

2. 編譯源碼

Android的編譯有自己的一套規則,主要利用的就是mk文件。網上有太多關于它的解說了,這里不再贅述,只簡單介紹其編譯工序:

進入源碼目錄(以我的開發環境為例),也就是 cd /develop/download_froyo

  • 執行 . build/envsetup.sh,這個腳本用來設置Android的編譯環境。
  • 執行choosecombo命令,這個命令用來選擇編譯目標(如目標硬件平臺、eng還是user等)。一般而言,手機廠商會設置自己特有的編譯選項。

執行完上面幾個步驟后,就可以編譯系統了。Android平臺提供了三個命令用于編譯,它們分別是make、mmm和mm,這三個命令的使用方法及其優劣如下:

  • make:不帶任何參數,它用于編譯整個系統,時間較長,我本人不推薦這種做法,除非讀者想編譯整個系統。
  • make MediaProvider :下面幾個例子都以編譯MediaProvider為例。這種方式對應于單個模塊編譯。它的優點是,會把該模塊依賴的其他模塊也一起編譯。例如 make libmedia,就會把libmedia依賴的庫全編譯好。其缺點也很明顯,它需要搜索整個源碼來定義MediaProvider模塊所使用的Android.mk文件,并且還要判斷該模塊所依賴的其他模塊是否有修改。整體編譯時間較長。
  • mmm packages/providers/MediaProvider :該命令將編譯指定目錄下的目標模塊,而不編譯它所依賴的模塊。所以如果讀者是初次編譯,采用這種方式編譯一個模塊往往會報錯。錯誤的原因是因為它依賴的模塊沒有被編譯。
  • mm :這種方式需要先cdpackages/providers/MediaProvider目錄,然后mm。該命令會編譯當前目錄下的模塊。它和mmm一樣,只編譯目標模塊。mm和mmm命令編譯的速度都很快。

從使用的角度來看,我本人有如下建議:

  • 如果只知道目標模塊名,則應使用make 模塊名的方式來編譯目標模塊。例如編譯libmedia,則直接使用make libmedia即可。另外,初次編譯時也要采用這種方法。
  • 如果不知道目標模塊名,而知道目標模塊所處的目錄,則可使用mmm或mm命令來編譯。當然,初次編譯還必須使用make命令。而以后的編譯就可使用mmm或mm了,這樣會節約不少時間。

一般的編譯方式都使用增量編譯,即只編譯發生變化的目標文件。但有時則需重新編譯所有目標文件,那么就可使用make命令的-B選項。例如 make –B 模塊名,或者mm –B、mmm –B 。mm和mmm內部,也是調用make命令的,而make的-B選項將強制編譯所有目標文件。

Android的編譯工序比較簡單,難點主要在Android.mk文件的編寫。讀者可上網搜索與此相關的學習資料。

3.本書各模塊的編譯目標

本書各模塊的編譯目標如表1-1所示,這里僅列出幾個有代表性的模塊:

表1-1? 本書各模塊編譯目標

目標模塊

make命令

mmm命令

init

make init

mmm system/core/init

zygote

make app_process

mmm frameworks/base/cmds/app_process

system_server

make services

mmm frameworks/base/services/java

RefBase等

make libutils

mmm frameworks/base/libs/utils

Looper等

make framework

mmm frameworks/base

AudioTrack

make libmedia

mmm frameworks/base/media/libmedia

AudioFlinger

make libaudioflinger

mmm frameworks/base/libs/audioflinger

AudioPolicyService

make libaudiopolicy

mmm hardware/msm7k/libaudio-qsd8k (示例)

SurfaceFlinger

make libsurfaceflinger

mmm frameworks/base/libs/surfaceflinger

Vold

make vold

mmm system/vold/

Rild

make rild

mmm hardware/ril/rild/

MediaProvider

make MediaProvider

mmm packages/providers/MediaProvider

Phone

make Phone

mmm packages/apps/Phone/

假設make framework,那么編譯完的結果則如圖1-5所示:


圖1-5? make framework的結果

從上圖可看出,make命令編譯了framework-res.apk以及framework.jar兩個模塊。它們編譯的結果在out/target/product/generic/system/framework下。讀者利用adb 命令把這兩個文件push到手機的system/framework目錄,即可替換舊的文件。如想測試這個新模塊,則需要先殺掉所有使用該模塊的進程,進程重啟后會重新加載模塊,這時就能使用新的文件了。例如,想測試剛修改的libaudioflinger模塊,adb push上去后,先殺掉mediaserver進程,因為libaudioflinger庫目前只有該進程使用。當mediaserver重啟后,就會加載新push上來的libaudioflinger庫了。

系統服務被殺掉后一般都會自動重啟(由init控制,在第三章中可見到)。

1.3 ?工具介紹

本節介紹Android開發和源碼研究過程中兩件比較實用的工具。

1.3.1? Source Insight介紹

Source Insight是閱讀源碼的必備工具,是一個Windows下的軟件,在Linux平臺上可通過wine安裝。這里,就不講述如何安裝Source Insight了,相信讀者都會。下面介紹一下在Source Insight使用上的小技巧。

1. Source Insight工作減負

使用Source Insight時,需要新建一個源碼工程,通過菜單項Project→New Project,可指定源碼的目錄。在工作中發現,很多同事常一股腦把Android所有源代碼都加到工程中,從而導致了Source Insight運行速度非常慢。實際上,只需要將當前分析的源碼目錄加到工程即可。例如,新建一個Source Insight工程后,只把源碼/framework/base目錄加進去了。另外,當一個目錄下的源碼分析完后,可以通過Project→Add and Remove Project Files選項把無須再分析的目錄從工程中去掉。如圖1-6所示:


圖1-6? 添加或刪除工程中的目錄

從圖中的框線我們可以發現:

  • Source Insight支持動態添加或刪除目錄。通過這種方式可極大減少Source Insight的工作負擔。

一般首先把framework/base下的目錄加到工程,以后如有需要,再把其他目錄加進來。

2. 調節字體

Source Insight默認的字體比較小,看著很費眼。怎么辦?

選擇工具欄上Options→Document options菜單,彈出Document Options對話框,其中左上部分有個Screen Fonts,然后會彈出一個字體對話框,在那里可選擇大字體,例如四號,五號字體等。如圖1-7所示:


圖1-7? 字體調節

3. 快速定位文件

工程建立好后,須通過Project→Rebuild Project選項來解析源碼。另外,在研究源碼時常常會只記得源碼文件名,而不記得是在哪個目錄下。沒關系,Source Insight支持在源碼中快速定位文件。使用方法如圖1-8所示:


圖1-8? 快速定位文件

使用方法是:

  • 先選擇圖1-8中左下角的那個按鈕。
  • 然后在左上角那個輸入框中輸入源碼文件名,例如app_process。然后結果欄中就會把對應文件列出。

???????????????????

1.3.3???Busybox的使用

Busybox,號稱Linux平臺上的“瑞士軍刀”,它提供了很多常用的工具,例如grep、find等。這些工具在標準Linux上都有,但Android系統卻去掉了其中的大多數工具。這導致了我們在調試程序、研究Android系統時步履維艱,所以就需要在手機上安裝Busybox。

1. 下載Busybox

我們可從下面這個網站中下載已編譯好的Busybox,如圖1-9所示:

http://www.busybox.net/downloads/binaries/1.18.4/


圖1-9? Busybox下載

注意該網站已經根據不同平臺編譯好了對應的Busybox,我們可根據自己手機的情況下載對應的文件。例如HTC G7的CPU支持armv7l,所以我下載了最接近的busybox-armv6l。

小知識:arm v7表示的是ARM指令集為v7,目前ARM Cortex-A8/A9系列的CPU支持該指令集。

2. 安裝和使用Busybox

下載完busybox后,需將它push到手機上。如:

adb push busybox /system/xbin #為了避免沖突,我push到了/system/xbin目錄下了。

cd /system/xbin?????#進入對應目錄

chmod 755 busybox??#更改busybox權限為可執行

busybox –-install??#安裝busybox

grep? #執行busybox提供的grep命令,或者busybox xxx執行xxx命令也行

Busybox安裝完了,如執行busybox命令,就會打印如圖1-10的輸出。


圖1-10? busybox提供的工具

從上圖中可看出,busybox提供了不少的工具,這樣,我們在研究Android系統時就如虎添翼了。

給手機安裝busybox須有root權限,為學好Android,大家最好還是購買那種能被破解的手機吧。

1.4? 本章小結

本章對Android系統、源碼搭建、研究工具等做了部分介紹,相信讀者現在已是迫不及待,躍躍欲試了吧?馬上開始我們的源碼征程!


總結

以上是生活随笔為你收集整理的Android卷一全文 第一章 阅读前的准备工作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。