Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 1-開發環境--android文件系統的結構

1-開發環境--android文件系統的結構

編輯:關於Android編程

0. 搭建Android APP開發環境需要工具:

JDK(Java Development Kit) IDE環境:Eclipse或者AndroidStudio Android SDK(Softer Development Kit) ADT(Android Development Tools)

=======================分割線=========================
下面的內容是來源於網絡上某位大神整理的,不知道什麼時候存在雲筆記中了,也忘記標明出處了。在下在原文基礎之上稍微做了些排版,希望大神如果看到,提示我一定增加原文鏈接。
:D

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緩存大小

5、操作android的一些方法

您應該已經知道,Android 的核心作業系統是Linux (現在用的版本是2.6.25)。因此內部的檔案系統,與系統目錄等,也和Linux 脫不了關系。要如何觀察這些系統目錄,到底藏了什麼秘密呢?
在Eclipse 環境中,你可以用DDMS 來觀察。不過這個DDMS 在我的電腦上的執行速度,實在太慢了。我個人的偏好是,直接用adb shell 來觀察。

啟動adb shell 的用法如下:
1). 在Windows 中,開啟一個命令列視窗(或執行cmd.exe 這個程式)
2). cd /tools
3). adb shell

當你看到這個# 提示字元時,就表示你已經進入模擬器的系統。接下來,你就可以用Linux 上的指令來浏覽這些目錄。像是 cd, ls, pwd, cat, rm 等等。
這裡面,有幾個目錄是和Android 相關的,特地將他整理下來,供你參考。

6、系統目錄

/system/app

預載入應用程式執行檔(*.apk),都是放在這。像是Alarm Clock, Browser, Contacts, Maps,… 等等。

/system/framework

這裡放 Android 系統的核心程式庫。像是core.jar, framework-res.apk, com.google.android.gtalkservice.jar,…等等。
雖然許多程式庫都是以jar 結尾的,不過裡面Java classes 還是以dex 格式存在著。

/system/media/audio/(notification, alarms, ringtones, ui)

這裡放系統的聲音檔,像是鬧鈴聲,來電鈴聲等等。這些聲音檔,多是 ogg 格式。

/data/anr/traces.txt

當你的應用程式發生ANR (Application is Not Responding) 錯誤時,Android 會自動將問題點的code stack list 寫在這個檔案內,你直接用cat 命令就可以看他的內容。

/data/app
/system/app

放的是系統預載的應用程式執行檔。而這裡放的是使用者自己安裝的應用程式執行檔(*.apk)。

/data/data/

當你在程式中用Context.openFileOutput() 所建立的檔案,都放在這個目錄下的files 子目錄內。而用Context.getSharedPreferences() 所建立的preferences 檔(*.xml) ,則是放在shared_pref 這個子目錄中。

/data/location/gps

這裡看起來,應該是給GPS location provider 用的。其中的 properties 檔案的內容如下:

requiresNetwork false
requiresSatellite false
requiresCell false
hasMonetaryCost false
supportsAltitude true
supportsBearing true
supportsSpeed true
repeat true
accuracy 100
powerRequirement 1

沒猜錯的話,這應該是用來描述GPS location provider 有那些功能的。

/data/system/location/location.gps

這個檔案也是個一般文字檔。主要是記錄最後的經緯度座標。 LocationManager.getLastKnownLocation() 就在來這抓值的。

/data/property/persist.sys.timezone
這個檔案也是個一般文字檔。主要是記錄目前系統所使用的時區。在我的模擬器上,他記錄著Asia/Taipei 這個字串。

最後,下面這兩個指令,也很好用。他可以幫你將外部檔案,復制到模擬器的系統檔案目錄內,也可以將模擬器內的檔案,復制到外部系統上。

adb push - copy file/dir to device
adb pull - copy file/dir from device

7、常規系統默認應用程序目錄

這個裡面主要存放的是常規下載的應用程序,可以看到都是以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

8、系統本地程序目錄

\system\bin
這個目錄下的文件都是系統的本地程序,從bin文件夾名稱可以看出是binary二進制的程序,裡面主要是Linux系統自帶的組件,Android手機網就主要文件做下簡單的分析介紹:

\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
[page_break]

鈴聲音樂文件夾,除了常規的鈴聲外還有一些系統提示事件音

\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文件夾中都是用戶文件夾,這裡就不介紹了。

9、核心目錄

Android Internal - system directories
您應該已經知道,Android 的核心作業系統是 Linux (現在用的版本是 2.6.25)。因此內部的文件系統,與系統目錄等,也和 Linux 脫不了關系。要如何觀察這些系統目錄,到底藏了什麼秘密呢?
在 Eclipse 環境中,你可以用 DDMS 來觀察。不過這個DDMS 在我的電腦上的執行速度,是在太慢了。我個人的偏好是,直接用 adb shell 來觀察。啟動adb shell 的用法如下:
1. 在 Windows 中,假期一個命令列視窗 (或執行 cmd.exe 這個程式)
2. cd /tools
3. adb shell
當你看到 # 提示字元時,就表示你已經進入模擬器的系統。接下來,你就可以用 Linux 上的指令來浏覽這些目錄。像是 cd, ls, pwd, cat, rm 等等。
這裡面,有幾個目錄是和 Android 相關的,我特地將他整理下來,供你參考。

/system/app
預載入應用程序執行 (*.apk),都是放在這裡。像是 Alarm Clock, Browser, Contacts, Maps,… 等等。

用 DDMS 觀察的話,目錄內的內容,就像下面這樣:

/system/framework
這會放 Android 系統的和新程序庫。像是 core.jar, framework-res.apk, com.google.android.gtalkservice.jar,…等等。1.0r1 不是已經將 gtalk 等相關 APIs 移除了嗎?怎麼他的程式庫還在?雖然許多程序庫都是以 jar 結尾的,不過裡面的 Java classes還是以 dex 格式存在著。
/system/media/audio/(notification, alarms, ringtones, ui)
這裡放系統的聲音,像是鬧鈴聲,來電鈴聲等等。這些聲音,多是 ogg 格式。
/data/anr/traces.txt

當你的應用程序發生 ANR (Application is Not Responding) 錯誤,Android 會自動將問題點的 code stack list 寫在這個檔案內,你直接用 cat 命令就可以看他的內容。

/data/app
/system/app

放的是系統預載的應用程序執行庫。而這裡放的是使用者自己安裝的應用程序 (*.apk)。

/data/data/

當你在程式中用 Context.openFileOutput() 所建立的檔案,都放在這個目錄下的 files 子目錄內。而用 Context.getSharedPreferences() 所建立的 preferences (*.xml) ,則是是放在 shared_pref 這個子目錄中。
/data/location/gps
這裡看起來,應該是給 GPS location provider 用的。其中的 properties 文件的內容如下:

requiresNetwork false
requiresSatellite false
requiresCell false
hasMonetaryCost false
supportsAltitude true
supportsBearing true
supportsSpeed true
repeat true
accuracy 100
powerRequirement 1

沒猜錯的話,這應該是用來描述 GPS location provider 有那些功能的。

/data/system/location/location.gps
這個文件也是個一般的文字文件。主要是記錄最後的經緯度坐標。
LocationManager.getLastKnownLocation() 就在這裡抓值的。
/data/property/persist.sys.timezone

這個文件也是個一般的文字文件。主要是記錄目前系統所使用的時區。在我的模擬器上,它記錄著 Asia/Taipei 這個字符串。
最後,下面這兩個指令,也很好用。他可以幫你將外部文件,復制到模擬器的系統目錄內,也可以將模擬期內的文件,復制到外部系統上。

adb push - copy file/dir to device
adb pull - copy file/dir from device

10、Android架構綜述

Android是google公司針對手機開發的一個平台,並公布了其中大部分代碼,其大部分應用程序都是用JAVA開發的,畢竟它是商業性的產品嘛,有所保留也是理所當然的。對於搞嵌入式linux開發的人來說我們可以從中學習其長處,也算得上是未來的一個發展方向和趨勢吧。
我們先來看看Android它的體系結構吧。下面是一張公開的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) 用來管理應用程序生命周期並提供常用的導航回退功能。

有關更多的細節和怎樣從頭寫一個應用程序,請參考 如何編寫一個 Android 應用程序.

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。

11、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. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved