1、android文件系統(tǒng)的結(jié)構(gòu)
6、系統(tǒng)目錄
/system/app當(dāng)你的應(yīng)用程式發(fā)生ANR (Application is Not Responding) 錯誤時,Android 會自動將問題點的code stack list 寫在這個檔案內(nèi),你直接用cat 命令就可以看他的內(nèi)容。
adb pull <remote> <local> - copy file/dir from device
7、常規(guī)系統(tǒng)默認(rèn)應(yīng)用程序目錄
這個里面主要存放的是常規(guī)下載的應(yīng)用程序,可以看到都是以APK格式結(jié)尾的文件。在這個文件夾下的程序為系統(tǒng)默認(rèn)的組件,自己安裝的軟件將不會出現(xiàn)在這里,而是\data\文件夾中。下面是詳細(xì)的介紹:
\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 照相機(jī)
\system\app\Camera.odex
\system\app\com.amazon.mp3.apk 亞馬遜音樂
\system\app\Contacts.apk 聯(lián)系人
\system\app\Contacts.odex
\system\app\DownloadProvider.apk 下載提供
\system\app\DownloadProvider.odex
\system\app\DrmProvider.apk DRM數(shù)字版權(quán)提供
\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服務(wù)
\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 系統(tǒng)設(shè)置
\system\app\Settings.odex
\system\app\SettingsProvider.apk 設(shè)置提供
\system\app\SettingsProvider.odex
\system\app\SetupWizard.apk 設(shè)置向?qū)?/span>
\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
-
8、系統(tǒng)本地程序目錄
\system\bin
這個目錄下的文件都是系統(tǒng)的本地程序,從bin文件夾名稱可以看出是binary二進(jìn)制的程序,里面主要是Linux系統(tǒng)自帶的組件,Android手機(jī)網(wǎng)就主要文件做下簡單的分析介紹:
\system\bin\akmd
\system\bin\am
\system\bin\app_process 系統(tǒng)進(jìn)程
\system\bin\dalvikvm Dalvik虛擬機(jī)宿主
\system\bin\dbus-daemon 系統(tǒng)BUS總線監(jiān)控
\system\bin\debuggerd 調(diào)試器
\system\bin\debug_tool 調(diào)試工具
\system\bin\dexopt DEX選項
\system\bin\dhcpcd DHCP服務(wù)器
\system\bin\dumpstate 狀態(tài)抓取器
\system\bin\dumpsys 系統(tǒng)抓取器
\system\bin\dvz
\system\bin\fillup
\system\bin\flash_image 閃存映像
\system\bin\hciattach
\system\bin\hcid HCID內(nèi)核
\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 網(wǎng)絡(luò)設(shè)置
\system\bin\ping Ping程序
\system\bin\playmp3 MP3播放器
\system\bin\pm 包管理器
\system\bin\qemud QEMU虛擬機(jī)
\system\bin\radiooptions 無線選項
\system\bin\rild RIL組件
\system\bin\sdptool
\system\bin\sdutil
\system\bin\service
\system\bin\servicemanager 服務(wù)管理器
\system\bin\sh
\system\bin\ssltest SSL測試
\system\bin\surfaceflinger 觸摸感應(yīng)驅(qū)動
\system\bin\svc 服務(wù)
\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
從文件夾名稱來看保存的都是系統(tǒng)的配置文件,比如APN接入點設(shè)置等核心配置。
\system\etc\apns-conf.xml APN接入點配置文件
\system\etc\AudioFilter.csv 音頻過濾器配置文件
\system\etc\AudioPara4.csv
\system\etc\bookmarks.xml 書簽數(shù)據(jù)庫
\system\etc\dbus.conf 總線監(jiān)視配置文件
\system\etc\dhcpcd
\system\etc\event-log-tags
\system\etc\favorites.xml 收藏夾
\system\etc\firmware 固件信息
\system\etc\gps.conf GPS設(shè)置文件
\system\etc\hcid.conf 內(nèi)核HCID配置文件
\system\etc\hosts 網(wǎng)絡(luò)DNS緩存
\system\etc\init.goldfish.sh
\system\etc\location 定位相關(guān)
\system\etc\mountd.conf 存儲掛載配置文件
\system\etc\NOTICE.html 提示網(wǎng)頁
\system\etc\permissions.xml 權(quán)限許可
\system\etc\pvplayer.conf
\system\etc\security
\system\etc\wifi WLAN相關(guān)組件
\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 定位相關(guān)
\system\etc\location\gps\nmea GPS數(shù)據(jù)解析
\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
字體文件夾,除了標(biāo)準(zhǔn)字體和粗體、斜體外可以看到文件體積最大的可能是中文字庫,或一些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可以看出是是系統(tǒng)平臺框架。
\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服務(wù)
\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 系統(tǒng)服務(wù)
\system\framework\svc.odex
\system\lib
lib目錄中存放的主要是系統(tǒng)底層庫,如平臺運行時庫。
\system\lib\libaes.so
\system\lib\libagl.so
\system\lib\libandroid_runtime.so Android運行時庫
\system\lib\libandroid_servers.so 系統(tǒng)服務(wù)組件
\system\lib\libaudio.so 音頻處理
\system\lib\libaudioeq.so EQ均衡器
\system\lib\libaudioflinger.so 音頻過濾器
\system\lib\libbluetooth.so 藍(lán)牙組件
\system\lib\libc.so
\system\lib\libcamera.so 超相機(jī)組件
\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
[page_break]
鈴聲音樂文件夾,除了常規(guī)的鈴聲外還有一些系統(tǒng)提示事件音
\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
默認(rèn)的音樂測試文件,僅有一個test.mid文件,用于播放測試的文件。
\system\sounds\test.mid
\system\usr
用戶文件夾,包含共享、鍵盤布局、時間區(qū)域文件等。
\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文件夾中都是用戶文件夾,這里就不介紹了。
9、核心目錄
Android Internal - system directories
您應(yīng)該已經(jīng)知道,Android 的核心作業(yè)系統(tǒng)是 Linux (現(xiàn)在用的版本是 2.6.25)。因此內(nèi)部的文件系統(tǒng),與系統(tǒng)目錄等,也和 Linux 脫不了關(guān)系。要如何觀察這些系統(tǒng)目錄,到底藏了什么秘密呢?
在 Eclipse 環(huán)境中,你可以用 DDMS 來觀察。不過這個DDMS 在我的電腦上的執(zhí)行速度,是在太慢了。我個人的偏好是,直接用 adb shell 來觀察。啟動adb shell 的用法如下:
1. 在 Windows 中,假期一個命令列視窗 (或執(zhí)行 cmd.exe 這個程式)
2. cd <android-sdk-install_path>/tools
3. adb shell
當(dāng)你看到 # 提示字元時,就表示你已經(jīng)進(jìn)入模擬器的系統(tǒng)。接下來,你就可以用 Linux 上的指令來瀏覽這些目錄。像是 cd, ls, pwd, cat, rm 等等。
這里面,有幾個目錄是和 Android 相關(guān)的,我特地將他整理下來,供你參考。
/system/app
預(yù)載入應(yīng)用程序執(zhí)行 (*.apk),都是放在這里。像是 Alarm Clock, Browser, Contacts, Maps,... 等等。
用 DDMS 觀察的話,目錄內(nèi)的內(nèi)容,就像下面這樣:
/system/framework
這會放 Android 系統(tǒng)的和新程序庫。像是 core.jar, framework-res.apk, com.google.android.gtalkservice.jar,...等等。1.0r1 不是已經(jīng)將 gtalk 等相關(guān) APIs 移除了嗎?怎么他的程式庫還在?雖然許多程序庫都是以 jar 結(jié)尾的,不過里面的 Java classes還是以 dex 格式存在著。
/system/media/audio/(notification, alarms, ringtones, ui)
這里放系統(tǒng)的聲音,像是鬧鈴聲,來電鈴聲等等。這些聲音,多是 ogg 格式。
/data/anr/traces.txt
當(dāng)你的應(yīng)用程序發(fā)生 ANR (Application is Not Responding) 錯誤,Android 會自動將問題點的 code stack list 寫在這個檔案內(nèi),你直接用 cat 命令就可以看他的內(nèi)容。
/data/app
/system/app
放的是系統(tǒng)預(yù)載的應(yīng)用程序執(zhí)行庫。而這里放的是使用者自己安裝的應(yīng)用程序 (*.apk)。
/data/data/<app-package-name>
當(dāng)你在程式中用 Context.openFileOutput() 所建立的檔案,都放在這個目錄下的 files 子目錄內(nèi)。而用 Context.getSharedPreferences() 所建立的 preferences (*.xml) ,則是是放在 shared_pref 這個子目錄中。
/data/location/gps
這里看起來,應(yīng)該是給 GPS location provider 用的。其中的 properties 文件的內(nèi)容如下:
requiresNetwork false
requiresSatellite false
requiresCell false
hasMonetaryCost false
supportsAltitude true
supportsBearing true
supportsSpeed true
repeat true
accuracy 100
powerRequirement 1
沒猜錯的話,這應(yīng)該是用來描述 GPS location provider 有那些功能的。
/data/system/location/location.gps
這個文件也是個一般的文字文件。主要是記錄最后的經(jīng)緯度坐標(biāo)。
LocationManager.getLastKnownLocation() 就在這里抓值的。
/data/property/persist.sys.timezone
這個文件也是個一般的文字文件。主要是記錄目前系統(tǒng)所使用的時區(qū)。在我的模擬器上,它記錄著 Asia/Taipei 這個字符串。
最后,下面這兩個指令,也很好用。他可以幫你將外部文件,復(fù)制到模擬器的系統(tǒng)目錄內(nèi),也可以將模擬期內(nèi)的文件,復(fù)制到外部系統(tǒng)上。
adb push <local> <remote> - copy file/dir to device
adb pull <remote> <local> - copy file/dir from device
10、Android架構(gòu)綜述
Android是google公司針對手機(jī)開發(fā)的一個平臺,并公布了其中大部分代碼,其大部分應(yīng)用程序都是用JAVA開發(fā)的,畢竟它是商業(yè)性的產(chǎn)品嘛,有所保留也是理所當(dāng)然的。對于搞嵌入式linux開發(fā)的人來說我們可以從中學(xué)習(xí)其長處,也算得上是未來的一個發(fā)展方向和趨勢吧。
我們先來看看Android它的體系結(jié)構(gòu)吧。下面是一張公開的Android體系結(jié)構(gòu)圖。
android的系統(tǒng)架構(gòu)和其操作系統(tǒng)一樣,采用了分層的架構(gòu)。從架構(gòu)圖看,android分為四個層,從高層到低層分別是應(yīng)用程序?qū)印?yīng)用程序框架層、系統(tǒng)運行庫層和linux核心層。藍(lán)色的代表java程序,黃色的代碼為運行JAVA程序而實現(xiàn)的虛擬機(jī),綠色部分為C/C++語言編寫的程序庫,紅色的代碼內(nèi)核(linux內(nèi)核+drvier)
1.應(yīng)用程序
Android會同一系列核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括email客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯(lián)系人管理程序等。所有的應(yīng)用程序都是使用JAVA語言編寫的。
2.應(yīng)用程序框架
開發(fā)人員也可以完全訪問核心應(yīng)用程序所使用的API框架。該應(yīng)用程序的架構(gòu)設(shè)計簡化了組件的重用;任何一個應(yīng)用程序都可以發(fā)布它的功能塊并且任何其 它的應(yīng)用程序都可以使用其所發(fā)布的功能塊(不過得遵循框架的安全性限制)。同樣,該應(yīng)用程序重用機(jī)制也使用戶可以方便的替換程序組件。
隱藏在每個應(yīng)用后面的是一系列的服務(wù)和系統(tǒng), 其中包括;
* 豐富而又可擴(kuò)展的視圖(Views),可以用來構(gòu)建應(yīng)用程序, 它包括列表(lists),網(wǎng)格(grids),文本框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。
* 內(nèi)容提供器(Content Providers)使得應(yīng)用程序可以訪問另一個應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人數(shù)據(jù)庫), 或者共享它們自己的數(shù)據(jù)
* 資源管理器(Resource Manager)提供 非代碼資源的訪問,如本地字符串,圖形,和布局文件( layout files )。
* 通知管理器 (Notification Manager) 使得應(yīng)用程序可以在狀態(tài)欄中顯示自定義的提示信息。
* 活動管理器( Activity Manager) 用來管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能。
有關(guān)更多的細(xì)節(jié)和怎樣從頭寫一個應(yīng)用程序,請參考 如何編寫一個 Android 應(yīng)用程序.
3.系統(tǒng)運行庫
1)程序庫
Android 包含一些C/C++庫,這些庫能被Android系統(tǒng)中不同的組件使用。它們通過 Android 應(yīng)用程序框架為開發(fā)者提供服務(wù)。以下是一些核心庫:
* Bionic系統(tǒng) C 庫 - 一個從 BSD 繼承來的標(biāo)準(zhǔn) C 系統(tǒng)函數(shù)庫( libc ), 它是專門為基于 embedded linux 的設(shè)備定制的。
* 媒體庫 - 基于 PacketVideo OpenCORE;該庫支持多種常用的音頻、視頻格式回放和錄制,同時支持靜態(tài)圖像文件。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
* Surface Manager - 對顯示子系統(tǒng)的管理,并且為多個應(yīng)用程序提 供了2D和3D圖層的無縫融合。這部分代碼
* Webkit,LibWebCore - 一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。鼎鼎大名的 Apple Safari背后的引擎就是Webkit
* SGL - 底層的2D圖形引擎
* 3D libraries - 基于OpenGL ES 1.0 APIs實現(xiàn);該庫可以使用硬件 3D加速(如果可用)或者使用高度優(yōu)化的3D軟加速。
* FreeType -位圖(bitmap)和矢量(vector)字體顯示。
* SQLite - 一個對于所有應(yīng)用程序可用,功能強勁的輕型關(guān)系型數(shù)據(jù)庫引擎。
*還有部分上面沒有顯示出來的就是硬件抽象層。其實Android并非講所有的設(shè)備驅(qū)動都放在linux內(nèi)核里面,而是實現(xiàn)在userspace空間,這么做的主要原因是GPL協(xié)議,Linux是遵循該協(xié)議來發(fā)布的,也就意味著對 linux內(nèi)核的任何修改,都必須發(fā)布其源代碼。而現(xiàn)在這么做就可以避開而無需發(fā)布其源代碼,畢竟它是用來賺錢的。而在linux內(nèi)核中為這些userspace驅(qū)動代碼開一個后門,就可以讓本來userspace驅(qū)動不可以直接控制的硬件可以被訪問。而只需要公布這個后門代碼即可。一般情況下如果要將Android移植到其他硬件去運行,只需要實現(xiàn)這部分代碼即可。包括:顯示器驅(qū)動,聲音,相機(jī),GPS,GSM等等
2)Android 運行庫
Android 包括了一個核心庫,該核心庫提供了JAVA編程語言核心庫的大多數(shù)功能。
每一個Android應(yīng)用程序都在它自己的進(jìn)程中運行,都擁有一個獨立的Dalvik虛擬 機(jī)實例。Dalvik被設(shè)計成一個設(shè)備可以同時高效地運行多個虛擬系統(tǒng)。 Dalvik虛擬機(jī)執(zhí)行(.dex)的Dalvik可執(zhí)行文件,該格式文件針對小內(nèi)存使用做了 優(yōu)化。同時虛擬機(jī)是基于寄存器的,所有的類都經(jīng)由JAVA編譯器編譯,然后通過SDK中 的 "dx" 工具轉(zhuǎn)化成.dex格式由虛擬機(jī)執(zhí)行。
Dalvik虛擬機(jī)依賴于linux內(nèi)核的一些功能,比如線程機(jī)制和底層內(nèi)存管理機(jī)制。
4.Linux 內(nèi)核
Android 的核心系統(tǒng)服務(wù)依賴于 Linux 2.6 內(nèi)核,如安全性,內(nèi)存管理,進(jìn)程管理, 網(wǎng)絡(luò)協(xié)議棧和驅(qū)動模型。 Linux 內(nèi)核也同時作為硬件和軟件棧之間的抽象層。其外還對其做了部分修改,主要涉及兩部分修改:
1).Binder (IPC):提供有效的進(jìn)程間通信,雖然linux內(nèi)核本身已經(jīng)提供了這些功能,但Android系統(tǒng)很多服務(wù)都需要用到該功能,為了某種原因其實現(xiàn)了自己的一套。
2).電源管理:主要是為了省電,畢竟是手持設(shè)備嘛,低耗電才是我們的追求。
最后在談?wù)凙ndroid所采用的語言,其應(yīng)用開發(fā)采用java語言,我們所說的java一般包含三個部分:
1)java語言:即其語法,其寫代碼的程式
2).java虛擬機(jī):為了實現(xiàn)一次編譯到處可以運行的原則,java在編譯連接以后并沒有產(chǎn)生目標(biāo)機(jī)器語言,而是采用了Java bytecode這種Java共用指令,這時就需要一個虛擬機(jī)來執(zhí)行改指令。
3).庫:跟我們常用的C語言一樣提供一些常用的庫
后兩者結(jié)合就是Java Runtime Environment。
Android使用的虛擬機(jī)叫 Dalvik,最初并是不為Java設(shè)計的,它并不能運行Java bytecode指令,而是運行叫Dalvik executable,簡稱dx。為此Android提供了dx工具,用來將Java bytecode轉(zhuǎn)換為dx。
11、Android源代碼結(jié)構(gòu):
Google提供的Android包含了原始Android的目標(biāo)機(jī)代碼,主機(jī)編譯工具、仿真環(huán)境,代碼包經(jīng)過解壓縮后,第一級別的目錄和文件如下所示:
.
|-- Makefile (全局的Makefile)
|-- bionic (Bionic含義為仿生,這里面是一些基礎(chǔ)的庫的源代碼)
|-- bootloader (引導(dǎo)加載器)
|-- build (build目錄中的內(nèi)容不是目標(biāo)所用的代碼,而是編譯和配置所需要的腳本和工具)
|-- dalvik (JAVA虛擬機(jī))
|-- development (程序開發(fā)所需要的模板和工具)
|-- external (目標(biāo)機(jī)器使用的一些庫)
|-- frameworks (應(yīng)用程序的框架層)
|-- hardware (與硬件相關(guān)的庫)
|-- kernel (Linux2.6的源代碼)
|-- packages (Android的各種應(yīng)用程序)
|-- prebuilt (Android在各種平臺下編譯的預(yù)置腳本)
|-- recovery (與目標(biāo)的恢復(fù)功能相關(guān))
`-- 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為結(jié)尾的文件,它門是編譯所需要的Makefile)
|-- envsetup.sh
|-- libs
|-- target (包含board和product兩個目錄,為目標(biāo)所需要文件)
`-- tools (編譯過程中主機(jī)所需要的工具,一些需要經(jīng)過編譯生成)
其中,core中的Makefile是整個Android編譯所需要的真正的Makefile,它被頂層目錄的Makefile引用。
envsetup.sh是一個在使用仿真器運行的時候,用于設(shè)置環(huán)境的腳本。
dalvik目錄用于提供Android JAVA應(yīng)用程序運行的基礎(chǔ)————JAVA虛擬機(jī)。
development目錄展開的一個級別的目錄如下所示:
development
|-- apps (Android應(yīng)用程序的模板)
|-- build (編譯腳本模板)
|-- cmds
|-- data
|-- docs
|-- emulator (仿真相關(guān))
|-- host (包含windows平臺的一些工具)
|-- ide
|-- pdk
|-- samples (一些示例程序)
|-- simulator (大多是目標(biāo)機(jī)器的一些工具)
`-- tools
在emulator目錄中qemud是使用QEMU仿真時目標(biāo)機(jī)器運行的后臺程序,skins是仿真時手機(jī)的界面。
samples中包含了很多Android簡單工程,這些工程為開發(fā)者學(xué)習(xí)開發(fā)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目標(biāo)系統(tǒng)中的一個模塊,可能有一個或者若干個庫構(gòu)成。其中:
opencore為PV(PacketVideo),它是Android多媒體框架的核心。
webkit是Android網(wǎng)絡(luò)瀏覽器的核心。
sqlite是Android數(shù)據(jù)庫系統(tǒng)的核心。
openssl是Secure Socket Layer,一個網(wǎng)絡(luò)協(xié)議層,用于為數(shù)據(jù)通訊提供安全支持。
frameworks目錄展開的一個級別的目錄如下所示:
frameworks/
|-- base
|-- opt
`-- policies
frameworks是Android應(yīng)用程序的框架。
hardware是一些與硬件相關(guān)的庫
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中的各種應(yīng)用程序,providers是一些內(nèi)容提供者(在Android中的一個數(shù)據(jù)源)。
packages中兩個目錄的內(nèi)容大都是使用JAVA編寫的程序,各個文件夾的層次結(jié)構(gòu)是類似的。
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
本文由技術(shù)論壇中相關(guān)知識整理書寫,后續(xù)更新繼續(xù)補充。。。
聯(lián)系客服