1. 程式人生 > >android作業系統詳細目錄結構

android作業系統詳細目錄結構

\system\app 
這個裡面主要存放的是常規下載的應用程式,可以看到都是以APK格式結尾的檔案。在這個資料夾下的程式為系統預設的元件,自己安裝的軟體將不會出現在這裡,而是\data\資料夾中。下面是詳細的介紹:
\system\app\AlarmClock.apk 鬧鐘
\system\app\AlarmClock.odex
\system\app\Browser.apk 瀏覽器
\system\app\Browser.odex
\system\app\Bugreport.apk Bug報告
\system\app\Bugreport.odex
\system\app\Calculator.apk 計算器
\system\app\Calculator.odex
\system\app\Calendar.apk 日曆
\system\app\Calendar.odex
\system\app\CalendarProvider.apk 日曆提供
\system\app\CalendarProvider.odex
\system\app\Camera.apk 照相機
\system\app\Camera.odex
\system\app\com.amazon.mp3.apk 亞馬遜音樂
\system\app\Contacts.apk 聯絡人
\system\app\Contacts.odex
\system\app\DownloadProvider.apk 下載提供
\system\app\DownloadProvider.odex
\system\app\DrmProvider.apk DRM數字版權提供
\system\app\DrmProvider.odex
\system\app\Email.apk 電子郵件客戶端
\system\app\Email.odex
\system\app\FieldTest.apk 測試程式
\system\app\FieldTest.odex
\system\app\GDataFeedsProvider.apk GoogleData提供
\system\app\GDataFeedsProvider.odex
\system\app\Gmail.apk Gmail電子郵件
\system\app\Gmail.odex
\system\app\GmailProvider.apk Gmail提供
\system\app\GmailProvider.odex
\system\app\GoogleApps.apk 谷歌程式包
\system\app\GoogleApps.odex
\system\app\GoogleSearch.apk 搜尋工具
\system\app\GoogleSearch.odex
\system\app\gtalkservice.apk GTalk服務
\system\app\gtalkservice.odex
\system\app\HTMLViewer.apk HTML檢視器
\system\app\HTMLViewer.odex
\system\app\IM.apk 即使通訊元件包含MSN、yahoo通
\system\app\ImCredentialProvider.apk
\system\app\ImProvider.apk
\system\app\ImProvider.odex
\system\app\Launcher.apk 啟動載入器
\system\app\Launcher.odex
\system\app\Maps.apk 電子地圖
\system\app\Maps.odex
\system\app\MediaProvider.apk 多媒體播放提供
\system\app\MediaProvider.odex
\system\app\Mms.apk 簡訊、彩信
\system\app\Mms.odex
\system\app\Music.apk 音樂播放器
\system\app\Music.odex
\system\app\MyFaves.apk T-Mobile MyFaves程式
\system\app\MyFaves.odex
\system\app\PackageInstaller.apk apk安裝程式
\system\app\PackageInstaller.odex
\system\app\Phone.apk 電話撥號器
\system\app\Phone.odex
\system\app\Settings.apk 系統設定
\system\app\Settings.odex
\system\app\SettingsProvider.apk 設定提供
\system\app\SettingsProvider.odex
\system\app\SetupWizard.apk 設定嚮導
\system\app\SetupWizard.odex
\system\app\SoundRecorder.apk 錄音工具
\system\app\SoundRecorder.odex
\system\app\Street.apk 街景地圖
\system\app\Street.odex
\system\app\Sync.apk 同步程式
\system\app\Sync.odex
\system\app\Talk.apk 語音程式
\system\app\Talk.odex
\system\app\TelephonyProvider.apk 電話提供
\system\app\TelephonyProvider.odex
\system\app\Updater.apk 更新程式
\system\app\Updater.odex
\system\app\Vending.apk 製造商資訊
\system\app\Vending.odex
\system\app\VoiceDialer.apk 語音撥號器
\system\app\VoiceDialer.odex
\system\app\YouTube.apk Youtube視訊
\system\app\YouTube.odex

\system\bin
這個目錄下的檔案都是系統的本地程式,從bin資料夾名稱可以看出是binary二進位制的程式,裡面主要是Linux系統自帶的元件,
主要檔案簡單的分析介紹:
\system\bin\akmd
\system\bin\am
\system\bin\app_process 系統程序
\system\bin\dalvikvm Dalvik虛擬機器宿主
\system\bin\dbus-daemon 系統BUS匯流排監控
\system\bin\debuggerd 偵錯程式
\system\bin\debug_tool 除錯工具
\system\bin\dexopt DEX選項
\system\bin\dhcpcd DHCP伺服器
\system\bin\dumpstate 狀態抓取器
\system\bin\dumpsys 系統抓取器
\system\bin\dvz
\system\bin\fillup
\system\bin\flash_image 快閃記憶體映像
\system\bin\hciattach
\system\bin\hcid HCID核心
\system\bin\hostapd
\system\bin\hostapd_cli
\system\bin\htclogkernel
\system\bin\input
\system\bin\installd
\system\bin\itr
\system\bin\linker
\system\bin\logcat Logcat日誌列印
\system\bin\logwrapper
\system\bin\mediaserver
\system\bin\monkey
\system\bin\mountd 儲存掛載器
\system\bin\netcfg 網路設定
\system\bin\ping Ping程式
\system\bin\playmp3 MP3播放器
\system\bin\pm 包管理器
\system\bin\qemud QEMU虛擬機器
\system\bin\radiooptions 無線選項
\system\bin\rild RIL元件
\system\bin\sdptool
\system\bin\sdutil
\system\bin\service 
\system\bin\servicemanager 服務管理器
\system\bin\sh
\system\bin\ssltest SSL測試
\system\bin\surfaceflinger 觸控感應驅動
\system\bin\svc 服務
\system\bin\system_server
\system\bin\telnetd Telnet元件
\system\bin\toolbox
\system\bin\wlan_loader
\system\bin\wpa_cli
\system\bin\wpa_supplicant


\system\etc
從資料夾名稱來看儲存的都是系統的配置檔案,比如APN接入點設定等核心配置。

\system\etc\apns-conf.xml APN接入點配置檔案
\system\etc\AudioFilter.csv 音訊過濾器配置檔案
\system\etc\AudioPara4.csv
\system\etc\bookmarks.xml 書籤資料庫
\system\etc\dbus.conf 匯流排監視配置檔案
\system\etc\dhcpcd
\system\etc\event-log-tags
\system\etc\favorites.xml 收藏夾
\system\etc\firmware 韌體資訊
\system\etc\gps.conf GPS設定檔案
\system\etc\hcid.conf  核心HCID配置檔案
\system\etc\hosts 網路DNS快取
\system\etc\init.goldfish.sh
\system\etc\location 定位相關
\system\etc\mountd.conf 儲存掛載配置檔案
\system\etc\NOTICE.html 提示網頁
\system\etc\permissions.xml 許可權許可
\system\etc\pvplayer.conf 
\system\etc\security 
\system\etc\wifi WLAN相關元件
\system\etc\dhcpcd\dhcpcd-hooks
\system\etc\dhcpcd\dhcpcd-run-hooks
\system\etc\dhcpcd\dhcpcd.conf
\system\etc\dhcpcd\dhcpcd-hooks\01-test
\system\etc\dhcpcd\dhcpcd-hooks\20-dns.conf
\system\etc\dhcpcd\dhcpcd-hooks\95-configured
\system\etc\firmware\brf6300.bin
\system\etc\location\gps
[page_break] 
\system\etc\location\gps\location 定位相關
\system\etc\location\gps\nmea GPS資料解析
\system\etc\location\gps\properties
\system\etc\security\cacerts.bks
\system\etc\security\otacerts.zip OTA下載驗證
\system\etc\wifi\Fw1251r1c.bin
\system\etc\wifi\tiwlan.ini
\system\etc\wifi\wpa_supplicant.conf WPA驗證元件


\system\fonts
字型資料夾,除了標準字型和粗體、斜體外可以看到檔案體積最大的可能是中文字型檔,或一些unicode字型檔,
從T-Mobile G1上可以清楚的看到顯示簡體中文正常,其中DroidSansFallback.ttf檔案大小
\system\fonts\DroidSans-Bold.ttf
\system\fonts\DroidSans.ttf
\system\fonts\DroidSansFallback.ttf
\system\fonts\DroidSansMono.ttf
\system\fonts\DroidSerif-Bold.ttf
\system\fonts\DroidSerif-BoldItalic.ttf
\system\fonts\DroidSerif-Italic.ttf
\system\fonts\DroidSerif-Regular.ttf
\system\framework
framework主要是一些核心的檔案,從字尾名為jar可以看出是是系統平臺框架。
\system\framework\am.jar
\system\framework\am.odex
\system\framework\android.awt.jar AWT庫
\system\framework\android.awt.odex
\system\framework\android.policy.jar 
\system\framework\android.policy.odex
\system\framework\android.test.runner.jar
\system\framework\android.test.runner.odex
\system\framework\com.google.android.gtalkservice.jar GTalk服務
\system\framework\com.google.android.gtalkservice.odex
\system\framework\com.google.android.maps.jar 電子地相簿
\system\framework\com.google.android.maps.odex
\system\framework\core.jar 核心庫,啟動桌面時首先載入這個
\system\framework\core.odex
\system\framework\ext.jar
\system\framework\ext.odex
\system\framework\framework-res.apk
\system\framework\framework-tests.jar
\system\framework\framework-tests.odex
\system\framework\framework.jar
\system\framework\framework.odex
\system\framework\input.jar 輸入庫
\system\framework\input.odex
\system\framework\itr.jar
\system\framework\itr.odex
\system\framework\monkey.jar
\system\framework\monkey.odex
\system\framework\pm.jar 包管理庫
\system\framework\pm.odex
\system\framework\services.jar
\system\framework\services.odex
\system\framework\ssltest.jar
\system\framework\ssltest.odex
\system\framework\svc.jar 系統服務
\system\framework\svc.odex

\system\lib

lib目錄中存放的主要是系統底層庫,如平臺執行時庫。
\system\lib\libaes.so 
\system\lib\libagl.so
\system\lib\libandroid_runtime.so Android執行時庫
\system\lib\libandroid_servers.so 系統服務元件
\system\lib\libaudio.so 音訊處理
\system\lib\libaudioeq.so EQ均衡器
\system\lib\libaudioflinger.so 音訊過濾器
\system\lib\libbluetooth.so 藍芽元件
\system\lib\libc.so
\system\lib\libcamera.so 超相機元件
\system\lib\libcameraservice.so
\system\lib\libcorecg.so
\system\lib\libcrypto.so 加密元件
\system\lib\libctest.so
\system\lib\libcutils.so
\system\lib\libdbus.so
\system\lib\libdl.so
\system\lib\libdrm1.so DRM解析庫
\system\lib\libdrm1_jni.so
\system\lib\libdvm.so
\system\lib\libexif.so
\system\lib\libexpat.so
\system\lib\libFFTEm.so
\system\lib\libGLES_CM.so
\system\lib\libgps.so
\system\lib\libhardware.so
\system\lib\libhgl.so
\system\lib\libhtc_ril.so
\system\lib\libicudata.so
\system\lib\libicui18n.so
\system\lib\libicuuc.so
\system\lib\liblog.so
\system\lib\libm.so
\system\lib\libmedia.so
\system\lib\libmediaplayerservice.so
\system\lib\libmedia_jni.so
\system\lib\libnativehelper.so
\system\lib\libnetutils.so
\system\lib\libOmxCore.so
\system\lib\libOmxH264Dec.so
\system\lib\libpixelflinger.so
\system\lib\libpvasf.so
\system\lib\libpvasfreg.so
\system\lib\libpvauthor.so
\system\lib\libpvcommon.so
\system\lib\libpvdownload.so
\system\lib\libpvdownloadreg.so
\system\lib\libpvmp4.so
\system\lib\libpvmp4reg.so
\system\lib\libpvnet_support.so
\system\lib\libpvplayer.so
\system\lib\libpvrtsp.so
\system\lib\libpvrtspreg.so
\system\lib\libqcamera.so
\system\lib\libreference-ril.so
\system\lib\libril.so
\system\lib\librpc.so
\system\lib\libsgl.so
\system\lib\libsonivox.so
\system\lib\libsoundpool.so
\system\lib\libsqlite.so
\system\lib\libssl.so
\system\lib\libstdc++.so
\system\lib\libsurfaceflinger.so
\system\lib\libsystem_server.so
\system\lib\libthread_db.so
\system\lib\libUAPI_jni.so
\system\lib\libui.so
\system\lib\libutils.so
\system\lib\libvorbisidec.so
\system\lib\libwbxml.so
\system\lib\libwbxml_jni.so
\system\lib\libwebcore.so
\system\lib\libwpa_client.so
\system\lib\libxml2wbxml.so
\system\lib\libz.so
\system\lib\modules
\system\lib\modules\wlan.ko


\system\media
鈴聲音樂資料夾,除了常規的鈴聲外還有一些系統提示事件音

\system\media\audio
\system\media\audio\alarms 鬧鈴音
\system\media\audio\notifications 提示音
\system\media\audio\ringtones 鈴聲
\system\media\audio\ui 介面操作事件音
\system\media\audio\alarms\Alarm_Beep_01.ogg
\system\media\audio\alarms\Alarm_Beep_02.ogg
\system\media\audio\alarms\Alarm_Beep_03.ogg
\system\media\audio\alarms\Alarm_Buzzer.ogg
\system\media\audio\alarms\Alarm_Classic.ogg
\system\media\audio\alarms\Alarm_Rooster_02.ogg
\system\media\audio\notifications\Beat_Box_Android.ogg
\system\media\audio\notifications\CaffeineSnake.ogg
\system\media\audio\notifications\DearDeer.ogg
\system\media\audio\notifications\DontPanic.ogg
\system\media\audio\notifications\F1_MissedCall.ogg
\system\media\audio\notifications\F1_New_MMS.ogg
\system\media\audio\notifications\F1_New_SMS.ogg
\system\media\audio\notifications\Heaven.ogg
\system\media\audio\notifications\Highwire.ogg
\system\media\audio\notifications\KzurbSonar.ogg
\system\media\audio\notifications\OnTheHunt.ogg
\system\media\audio\notifications\TaDa.ogg
\system\media\audio\notifications\Tinkerbell.ogg
\system\media\audio\notifications\Voila.ogg
\system\media\audio\ringtones\BeatPlucker.ogg
\system\media\audio\ringtones\BentleyDubs.ogg
\system\media\audio\ringtones\BirdLoop.ogg
\system\media\audio\ringtones\CaribbeanIce.ogg
\system\media\audio\ringtones\CrazyDream.ogg
\system\media\audio\ringtones\CurveBall.ogg
\system\media\audio\ringtones\DreamTheme.ogg
\system\media\audio\ringtones\EtherShake.ogg
\system\media\audio\ringtones\FriendlyGhost.ogg
\system\media\audio\ringtones\GameOverGuitar.ogg
\system\media\audio\ringtones\Growl.ogg
\system\media\audio\ringtones\InsertCoin.ogg
\system\media\audio\ringtones\LoopyLounge.ogg
\system\media\audio\ringtones\LoveFlute.ogg
\system\media\audio\ringtones\MidEvilJaunt.ogg
\system\media\audio\ringtones\MildlyAlarming.ogg
\system\media\audio\ringtones\NewPlayer.ogg
\system\media\audio\ringtones\Noises1.ogg
\system\media\audio\ringtones\Noises2.ogg
\system\media\audio\ringtones\Noises3.ogg
\system\media\audio\ringtones\OrganDub.ogg
\system\media\audio\ringtones\Ring_Classic_02.ogg
\system\media\audio\ringtones\Ring_Digital_02.ogg
\system\media\audio\ringtones\Ring_Synth_02.ogg
\system\media\audio\ringtones\Ring_Synth_04.ogg
\system\media\audio\ringtones\RomancingTheTone.ogg
\system\media\audio\ringtones\SitarVsSitar.ogg
\system\media\audio\ringtones\SpringyJalopy.ogg
\system\media\audio\ringtones\T-Jingle.ogg
\system\media\audio\ringtones\Terminated.ogg
\system\media\audio\ringtones\TwirlAway.ogg
\system\media\audio\ringtones\VeryAlarmed.ogg
\system\media\audio\ringtones\World.ogg
\system\media\audio\ui\Effect_Tick.ogg


\system\sounds
預設的音樂測試檔案,僅有一個test.mid檔案,用於播放測試的檔案。

\system\sounds\test.mid


\system\usr
使用者資料夾,包含共享、鍵盤佈局、時間區域檔案等。

\system\usr\keychars
\system\usr\keylayout
\system\usr\share
\system\usr\srec
\system\usr\keychars\qwerty.kcm.bin
\system\usr\keychars\qwerty2.kcm.bin
\system\usr\keychars\trout-keypad-qwertz.kcm.bin
\system\usr\keychars\trout-keypad-v2.kcm.bin
\system\usr\keychars\trout-keypad-v3.kcm.bin
\system\usr\keychars\trout-keypad.kcm.bin
\system\usr\keylayout\h2w_headset.kl
\system\usr\keylayout\qwerty.kl
\system\usr\keylayout\trout-keypad-qwertz.kl
\system\usr\keylayout\trout-keypad-v2.kl
\system\usr\keylayout\trout-keypad-v3.kl
\system\usr\keylayout\trout-keypad.kl
\system\usr\share\bsk
\system\usr\share\zoneinfo
\system\usr\share\bsk\V_FD_speed_101.bsk
\system\usr\share\bsk\V_FD_std_101.bsk
\system\usr\share\zoneinfo\zoneinfo.dat
\system\usr\share\zoneinfo\zoneinfo.idx
\system\usr\srec\config
\system\usr\srec\config\en.us
\system\usr\srec\config\en.us\baseline.par
\system\usr\srec\config\en.us\baseline11k.par
\system\usr\srec\config\en.us\baseline8k.par
\system\usr\srec\config\en.us\dictionary
\system\usr\srec\config\en.us\g2p
\system\usr\srec\config\en.us\grammars
\system\usr\srec\config\en.us\models
\system\usr\srec\config\en.us\dictionary\basic.ok
\system\usr\srec\config\en.us\dictionary\cmu6plus.ok.zip
\system\usr\srec\config\en.us\dictionary\enroll.ok
\system\usr\srec\config\en.us\g2p\en-US-ttp.data
\system\usr\srec\config\en.us\grammars\VoiceDialer.g2g
\system\usr\srec\config\en.us\models\generic.swiarb
\system\usr\srec\config\en.us\models\generic11.lda
\system\usr\srec\config\en.us\models\generic11_f.swimdl
\system\usr\srec\config\en.us\models\generic11_m.swimdl
\system\usr\srec\config\en.us\models\generic8.lda
\system\usr\srec\config\en.us\models\generic8_f.swimdl
\system\usr\srec\config\en.us\models\generic8_m.swimdl


整個Android平臺的檔案不止是這麼多,部分檔案在/data資料夾中都是使用者資料夾,這裡就不介紹了。

/system/framework 
這會放 Android 系統的核心程式庫。
像是 core.jar, framework-res.apk, com.google.android.gtalkservice.jar,...等等。疑,1.0r1 不是已經將 gtalk 等相關 APIs 移除了嗎?怎麼他的程式庫還在?雖然許多程式庫都是以 jar 結尾的,不過裡面 Java classes 還是以 dex 格式存在著。


/system/app 放的是系統預載的應用程式執行檔。而這裡放的是使用者自己安裝的應用程式執行檔 (*.apk)。/data/data/<app-package-name> 
當你在程式中用 Context.openFileOutput() 所建立的檔案,都放在這個目錄下的 files 子目錄內。而用 Context.getSharedPreferences() 所建立的 preferences 檔 (*.xml) ,則是放在 shared_pref 這個子目錄中。/data/location/gps 


下面是一張公開的Android體系結構圖。

android的系統架構和其作業系統一樣,採用了分層的架構。從架構圖看,android分為四個層,從高層到低層分別是應用程式層、應用程式框架層、系統執行庫層和linux核心層。藍色的代表java程式,黃色的程式碼為執行JAVA程式而實現的虛擬機器,綠色部分為C/C++語言編寫的程式庫,紅色的程式碼核心(linux核心+drvier)

1.應用程式

Android會同一系列核心應用程式包一起釋出,該應用程式包包括email客戶端,SMS短訊息程式,日曆,地圖,瀏覽器,聯絡人管理程式等。所有的應用程式都是使用JAVA語言編寫的。

2.應用程式框架

開發人員也可以完全訪問核心應用程式所使用的API框架。該應用程式的架構設計簡化了元件的重用;任何一個應用程式都可以釋出它的功能塊並且任何其它的應用程式都可以使用其所釋出的功能塊(不過得遵循框架的安全性限制)。同樣,該應用程式重用機制也使使用者可以方便的替換程式元件。

隱藏在每個應用後面的是一系列的服務和系統, 其中包括;

    * 豐富而又可擴充套件的檢視(Views),可以用來構建應用程式, 它包括列表(lists),網格(grids),文字框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。
    * 內容提供器(Content Providers)使得應用程式可以訪問另一個應用程式的資料(如聯絡人資料庫), 或者共享它們自己的資料
    * 資源管理器(Resource Manager)提供 非程式碼資源的訪問,如本地字串,圖形,和佈局檔案( layout files )。
    * 通知管理器 (Notification Manager) 使得應用程式可以在狀態列中顯示自定義的提示資訊。
    * 活動管理器( Activity Manager) 用來管理應用程式生命週期並提供常用的導航回退功能。

3.系統執行庫

1)程式庫

Android 包含一些C/C++庫,這些庫能被Android系統中不同的元件使用。它們通過 Android 應用程式框架為開發者提供服務。以下是一些核心庫:

    * Bionic系統 C 庫 - 一個從 BSD 繼承來的標準 C 系統函式庫( libc ), 它是專門為基於 embedded linux 的裝置定製的。
    * 媒體庫 - 基於 PacketVideo OpenCORE;該庫支援多種常用的音訊、視訊格式回放和錄製,同時支援靜態影象檔案。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
    * Surface Manager - 對顯示子系統的管理,並且為多個應用程式提 供了2D和3D圖層的無縫融合。這部分程式碼
    * Webkit,LibWebCore - 一個最新的web瀏覽器引擎用,支援Android瀏覽器和一個可嵌入的web檢視。鼎鼎大名的 Apple Safari背後的引擎就是Webkit
    * SGL - 底層的2D圖形引擎
    * 3D libraries - 基於OpenGL ES 1.0 APIs實現;該庫可以使用硬體 3D加速(如果可用)或者使用高度優化的3D軟加速。
    * FreeType -點陣圖(bitmap)和向量(vector)字型顯示。
    * SQLite - 一個對於所有應用程式可用,功能強勁的輕型關係型資料庫引擎。

    *還有部分上面沒有顯示出來的就是硬體抽象層。其實Android並非講所有的裝置驅動都放在linux核心裡面,而是實現在userspace空間,這麼做的主要原因是GPL協議,Linux是遵循該協議來發布的,也就意味著對 linux核心的任何修改,都必須釋出其原始碼。而現在這麼做就可以避開而無需釋出其原始碼,畢竟它是用來賺錢的。而在linux核心中為這些userspace驅動程式碼開一個後門,就可以讓本來userspace驅動不可以直接控制的硬體可以被訪問。而只需要公佈這個後門程式碼即可。一般情況下如果要將Android移植到其他硬體去執行,只需要實現這部分程式碼即可。包括:顯示器驅動,聲音,相機,GPS,GSM等等

2)Android 執行庫

Android 包括了一個核心庫,該核心庫提供了JAVA程式語言核心庫的大多數功能。

每一個Android應用程式都在它自己的程序中執行,都擁有一個獨立的Dalvik虛擬機器例項。Dalvik被設計成一個裝置可以同時高效地執行多個虛擬系統。 Dalvik虛擬機器執行(.dex)的Dalvik可執行檔案,該格式檔案針對小記憶體使用做了優化。同時虛擬機器是基於暫存器的,所有的類都經由JAVA編譯器編譯,然後通過SDK中 的 "dx" 工具轉化成.dex格式由虛擬機器執行。

Dalvik虛擬機器依賴於linux核心的一些功能,比如執行緒機制和底層記憶體管理機制。

4.Linux 核心

Android 的核心繫統服務依賴於 Linux 2.6 核心,如安全性,記憶體管理,程序管理, 網路協議棧和驅動模型。 Linux 核心也同時作為硬體和軟體棧之間的抽象層。其外還對其做了部分修改,主要涉及兩部分修改:

1).Binder (IPC):提供有效的程序間通訊,雖然linux核心本身已經提供了這些功能,但Android系統很多服務都需要用到該功能,為了某種原因其實現了自己的一套。

2).電源管理:主要是為了省電,畢竟是手持裝置嘛,低耗電才是我們的追求。

最後在談談Android所採用的語言,其應用開發採用java語言,我們所說的java一般包含三個部分:

1)java語言:即其語法,其寫程式碼的程式

2).java虛擬機器:為了實現一次編譯到處可以執行的原則,java在編譯連線以後並沒有產生目標機器語言,而是採用了Java bytecode這種Java共用指令,這時就需要一個虛擬機器來執行改指令。

3).庫:跟我們常用的C語言一樣提供一些常用的庫

後兩者結合就是Java Runtime Environment。

Android使用的虛擬機器叫 Dalvik,最初並是不為Java設計的,它並不能執行Java bytecode指令,而是執行叫Dalvik executable,簡稱dx。為此Android提供了dx工具,用來將Java bytecode轉換為dx。

Android原始碼結構:

Google提供的Android包含了原始Android的目標機程式碼,主機編譯工具、模擬環境,程式碼包經過解壓縮後,第一級別的目錄和檔案如下所示:
.
|-- Makefile        (全域性的Makefile)
|-- bionic          (Bionic含義為仿生,這裡面是一些基礎的庫的原始碼)
|-- bootloader      (引導載入器)
|-- build           (build目錄中的內容不是目標所用的程式碼,而是編譯和配置所需要的指令碼和工具)
|-- dalvik          (JAVA虛擬機器)
|-- development     (程式開發所需要的模板和工具)
|-- external        (目標機器使用的一些庫)
|-- frameworks      (應用程式的框架層)
|-- hardware        (與硬體相關的庫)
|-- kernel          (Linux2.6的原始碼)
|-- packages        (Android的各種應用程式)
|-- prebuilt        (Android在各種平臺下編譯的預置指令碼)
|-- recovery        (與目標的恢復功能相關)
`-- system          (Android的底層的一些庫)




bionic目錄展開一個級別的目錄如下所示:
bionic/
|-- Android.mk
|-- libc
|-- libdl
|-- libm
|-- libstdc++
|-- libthread_db
`-- linker



bootloader目錄展開的兩個級別目錄:
bootloader/
`-- legacy
    |-- Android.mk
    |-- README
    |-- arch_armv6
    |-- arch_msm7k
    |-- fastboot_protocol.txt
    |-- include
    |-- libboot
    |-- libc
    |-- nandwrite
    `-- usbloader



build目錄展開的一個級別的目錄如下所示:
build/
|-- buildspec.mk.default
|-- cleanspec.mk
|-- core                       (各種以mk為結尾的檔案,它門是編譯所需要的Makefile)
|-- envsetup.sh
|-- libs
|-- target                     (包含board和product兩個目錄,為目標所需要檔案)
`-- tools                      (編譯過程中主機所需要的工具,一些需要經過編譯生成)



其中,core中的Makefile是整個Android編譯所需要的真正的Makefile,它被頂層目錄的Makefile引用。
envsetup.sh是一個在使用模擬器執行的時候,用於設定環境的指令碼。
dalvik目錄用於提供Android JAVA應用程式執行的基礎————JAVA虛擬機器。
development目錄展開的一個級別的目錄如下所示:
development
|-- apps                       (Android應用程式的模板)
|-- build                      (編譯指令碼模板)
|-- cmds
|-- data
|-- docs
|-- emulator                   (模擬相關)
|-- host                       (包含windows平臺的一些工具)
|-- ide
|-- pdk
|-- samples                    (一些示例程式)
|-- simulator                  (大多是目標機器的一些工具)
`-- tools



在emulator目錄中qemud是使用QEMU模擬時目標機器執行的後臺程式,skins是模擬時手機的介面。
samples中包含了很多Android簡單工程,這些工程為開發者學習開發Android程式提供了很大便利,可以作為模板使用。
external目錄展開的一個級別的目錄如下所示:
external/
|-- aes
|-- apache-http
|-- bluez
|-- clearsilver
|-- dbus
|-- dhcpcd
|-- dropbear
|-- elfcopy
|-- elfutils
|-- emma
|-- esd
|-- expat
|-- fdlibm
|-- freetype
|-- gdata
|-- giflib
|-- googleclient
|-- icu4c
|-- iptables
|-- jdiff
|-- jhead
|-- jpeg
|-- libffi
|-- libpcap
|-- libpng
|-- libxml2
|-- netcat
|-- netperf
|-- neven
|-- opencore
|-- openssl
|-- oprofile
|-- ping
|-- ppp
|-- protobuf
|-- qemu
|-- safe-iop
|-- skia
|-- sonivox
|-- sqlite
|-- srec
|-- strace
|-- tagsoup
|-- tcpdump
|-- tinyxml
|-- tremor
|-- webkit
|-- wpa_supplicant
|-- yaffs2
`-- zlib



在external中,每個目錄表示Android目標系統中的一個模組,可能有一個或者若干個庫構成。其中:
opencore為PV(PacketVideo),它是Android多媒體框架的核心。
webkit是Android網路瀏覽器的核心。
sqlite是Android資料庫系統的核心。
openssl是Secure Socket Layer,一個網路協議層,用於為資料通訊提供安全支援。
frameworks目錄展開的一個級別的目錄如下所示:
frameworks/
|-- base
|-- opt
`-- policies



frameworks是Android應用程式的框架。
hardware是一些與硬體相關的庫
kernel是Linux2.6的原始碼

packages目錄展開的兩個級別的目錄如下所示:
packages/
|-- apps
|   |-- AlarmClock
|   |-- Browser
|   |-- Calculator
|   |-- Calendar
|   |-- Camera
|   |-- Contacts
|   |-- Email
|   |-- GoogleSearch
|   |-- HTMLViewer
|   |-- IM
|   |-- Launcher
|   |-- Mms
|   |-- Music
|   |-- PackageInstaller
|   |-- Phone
|   |-- Settings
|   |-- SoundRecorder
|   |-- Stk
|   |-- Sync
|   |-- Updater
|   `-- VoiceDialer
`-- providers
    |-- CalendarProvider
    |-- ContactsProvider
    |-- DownloadProvider
    |-- DrmProvider
    |-- GoogleContactsProvider
    |-- GoogleSubscribedFeedsProvider
    |-- ImProvider
    |-- MediaProvider
    `-- TelephonyProvider



packages中包含兩個目錄,其中apps中是Android中的各種應用程式,providers是一些內容提供者(在Android中的一個數據源)。
packages中兩個目錄的內容大都是使用JAVA編寫的程式,各個資料夾的層次結構是類似的。
prebuilt目錄展開的一個級別的目錄如下所示:
prebuilt/
|-- Android.mk
|-- android-arm
|-- common
|-- darwin-x86
|-- linux-x86
`-- windows



system目錄展開的兩個級別的目錄如下所示:
system/
|-- bluetooth
|   |-- bluedroid
|   `-- brfpatch
|-- core
|   |-- Android.mk
|   |-- README
|   |-- adb
|   |-- cpio
|   |-- debuggerd
|   |-- fastboot
|   |-- include            (各個庫介面的標頭檔案)
|   |-- init
|   |-- libctest
|   |-- libcutils
|   |-- liblog
|   |-- libmincrypt
|   |-- libnetutils
|   |-- libpixelflinger
|   |-- libzipfile
|   |-- logcat
|   |-- logwrapper
|   |-- mkbootimg
|   |-- mountd
|   |-- netcfg
|   |-- rootdir
|   |-- sh
|   `-- toolbox
|-- extras
|   |-- Android.mk
|   |-- latencytop
|   |-- libpagemap
|   |-- librank
|   |-- procmem
|   |-- procrank
|   |-- showmap
|   |-- showslab
|   |-- sound
|   |-- su
|   |-- tests
|   `-- timeinfo
`-- wlan
    `-- ti

1、android檔案系統的結構
android原始碼編譯後得到system.img,ramdisk.img,userdata.img映像檔案。其中, ramdisk.img是emulator的檔案系統,system.img包括了主要的包、庫等檔案,userdata.img包括了一些使用者資料,emulator載入這3個映像檔案後,會把 system和 userdata分別載入到 ramdisk檔案系統中的system和 userdata目錄下。因此,我們可以把ramdisk.img裡的所有檔案複製出來,system.img和userdata.img分別解壓到 ramdisk檔案系統中的system和 userdata目錄下。


2、分離android檔案系統出來
system.img,ramdisk.img,userdata.img映像檔案是採用cpio打包、gzip壓縮的,可以通過file命令驗證:
file ramdisk.img,輸出: 
ramdisk.img: gzip compressed data, from Unix, last modified: Wed Mar 18 17:16:10 2009 
Android原始碼編譯後除了生成system.img,userdata.img之外還生成system和 userdata資料夾,因此不需要解壓它們。Android原始碼編譯後還生成root資料夾,其實root下的檔案與 ramdisk.img 裡的檔案是一樣的,不過這裡還是介紹怎樣把 ramdisk.img解壓出來:
將ramdisk.img複製一份到任何其他目錄下,將其名稱改為ramdisk.img.gz,並使用命令 
gunzip ramdisk.img.gz 
然後新建一個資料夾,叫ramdisk吧,進入,輸入命令 
cpio -i -F ../ramdisk.img 
這下,你就能看見並操作ramdisk裡面的內容了。 
然後把Android原始碼編譯後生成的system和 userdata裡的檔案複製到 ramdisk/system和 ramdisk/userdata下。這樣就得到一個檔案系統了。


3、使用網路檔案系統方式掛載android檔案系統
因此,我們需要建立/nfsroot目錄,再建立/nfsroot/androidfs目錄,把剛才的android檔案系統改名為androidfs,並連結到/nfsroot/androidfs


4、android核心引導檔案系統
android核心掛載/nfsroot/androidfs之後,根據init.rc,init.goldfish.rc來初始化並裝載系統庫、程式等直到開機完成。init.rc指令碼包括了檔案系統初始化、裝載的許多過程。init.rc的工作主要是:
1)設定一些環境變數
2)建立system、sdcard、data、cache等目錄
3)把一些檔案系統mount到一些目錄去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)設定一些檔案的使用者群組、許可權
5)設定一些執行緒引數
6)設定TCP快取大小