標籤:
http://blog.csdn.net/shagoo/article/details/6709430
> 開發環境
1、安裝 Eclipse 和 android-sdk 並解壓安裝
2、Eclipse 安裝 AVD 外掛程式 https://dl-ssl.google.com/android/eclipse/ 並配置 SDK Location
3、開啟 SDK Manager 安裝 android packages 並配置 Virtual device(比如名為:Android_2.2)
4、啟動 Virtual device,執行:emulator.exe -avd Android_2.2,或者直接從 Eclipse 啟動
> 安裝程式
1、安裝:adb install xxx.apk
2、重裝:adb install -r xxx.apk
3、卸載:adb uninstall com.android.xxx
程式安裝位置為:/data/app/,設定檔在/data/data下
> 系統磁碟分割
# adb shell
# mount
rootfs / rootfs ro 0 0
tmpfs /dev tmpfs rw,mode=755 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
none /acct cgroup rw,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,cpu 0 0
/dev/block/mtdblock0 /system yaffs2 ro 0 0
/dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
/dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0
/dev/block/vold/179:0 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/179:0 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
tmpfs /mnt/sdcard/.android_secure tmpfs ro,size=0k,mode=000 0 0
以上就是 Android 系統的分區結構,可見其掛載方式和 Linux 非常類似,熟悉 Linux 的朋友應該能很容易的看出這些分區的作用大概是什麼。其中需要說明一下的可能是 /dev/block/mtdblock* 這幾個核心分區(寫入 ROM 的),他們都是使用 yaffs2 檔案系統(基於 FLASH 儲存),其中是 /system 這個分區只有特殊的 ro 唯讀許可權,由此可見 Android 在安全性設計方面所下的一些功夫。另外 /dev/block/vold 據說是設計來替代 udev 的功能,主要用於支援一些熱插拔裝置。
> 目錄概覽
# ls -l
dr-x------ root root 2011-08-18 10:36 config
drwxrwx--- system cache 2011-06-21 05:32 cache
lrwxrwxrwx root root 2011-08-18 10:36 sdcard -> /mnt/sdcard
drwxr-xr-x root root 2011-08-18 10:36 acct
drwxrwxr-x root system 2011-08-18 10:36 mnt
lrwxrwxrwx root root 2011-08-18 10:36 d -> /sys/kernel/debug
lrwxrwxrwx root root 2011-08-18 10:36 etc -> /system/etc
drwxr-xr-x root root 2010-06-30 21:06 system
drwxr-xr-x root root 1970-01-01 00:00 sys
drwxr-x--- root root 1970-01-01 00:00 sbin
dr-xr-xr-x root root 1970-01-01 00:00 proc
-rwxr-x--- root root 12995 1970-01-01 00:00 init.rc
-rwxr-x--- root root 1677 1970-01-01 00:00 init.goldfish.rc
-rwxr-x--- root root 107412 1970-01-01 00:00 init
-rw-r--r-- root root 118 1970-01-01 00:00 default.prop
drwxrwx--x system system 2011-08-12 06:54 data
drwx------ root root 2010-01-28 00:59 root
drwxr-xr-x root root 2011-08-18 10:36 dev
以上是 Android 根目錄下檔案目錄,根據之前的分區結構可以大致看出每個目錄的所處位置和大致功能,以下是幾個重要目錄/檔案的說明:
1、mnt 掛載點目錄
2、etc 系統主要設定檔
3、system Android 系統檔案
4、sys Linux 核心檔案
5、proc 運行時檔案
6、init.rc 啟動指令碼
7、default.prop 系統屬性設定檔
8、data 使用者程式目錄
9、dev 裝置檔案
# ls -l /system
drwxr-xr-x root root 2010-06-30 21:03 usr
drwxr-xr-x root root 2010-06-30 21:07 app
drwxr-xr-x root root 2010-06-30 21:05 lib
drwxr-xr-x root root 2010-06-30 21:07 etc
drwxr-xr-x root root 2010-06-30 21:06 framework
-rw-r--r-- root root 1532 2010-06-30 20:58 build.prop
drwxr-xr-x root shell 2010-06-30 21:04 xbin
drwxr-xr-x root root 2010-06-30 21:00 tts
drwxr-xr-x root root 2010-06-30 21:00 media
drwxr-xr-x root root 2010-06-30 21:00 fonts
drwxr-xr-x root shell 2010-06-30 21:04 bin
drw-rw-rw- root root 2011-08-18 10:36 lost+found
以上是 system 目錄下面的主要檔案目錄下面也簡單介紹一下:
1、usr 使用者檔案夾,包含共用、鍵盤配置、時間地區檔案等
2、app 常規下載的應用程式,這些 apk 包都是受保護的哦
3、lib 系統底層庫,如平台執行階段程式庫等
4、etc 系統的設定檔,比如APN存取點設定等核心配置等
5、framework Android 系統平台核心 framework 的檔案
6、build.prop Android 系統屬性設定檔
7、xbin 常用開發工具,比如 tcpdump/sqlite3 等
8、bin 系統工具,比如 ps/cp/pm 等
# ls -l /data
drwx------ root root 2011-06-22 02:32 property
drwxrwx--t system misc 2011-06-21 05:32 misc
drwxrwx--x shell shell 2011-06-21 05:32 local
drwxrwx--x system system 2011-06-21 05:32 app-private
drwx------ system system 2011-06-21 05:33 backup
drwxrwxr-x system system 2011-08-12 06:54 anr
drwxrwx--x system system 2011-08-20 06:50 app
drwxrwx--x system system 2011-08-20 06:50 data
drwxr-x--- root log 2011-06-21 05:32 dontpanic
drwxrwx--x system system 2011-08-20 06:50 dalvik-cache
drwxrwxr-x system system 2011-08-22 06:40 system
drwxrwx--- root root 2011-06-21 05:32 lost+found
可以看到 /data 目錄下結構都和應用有關,這裡我們不做細究了,大家知道一下我們平時安裝的使用者應用/遊戲程式都被安裝在 /data/app 下就可以了。
# set
ANDROID_ASSETS=/system/app
ANDROID_BOOTLOGO=1
ANDROID_DATA=/data
ANDROID_PROPERTY_WORKSPACE=9,32768
ANDROID_ROOT=/system
ASEC_MOUNTPOINT=/mnt/asec
BOOTCLASSPATH=/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar
EXTERNAL_STORAGE=/mnt/sdcard
IFS=‘
‘
LD_LIBRARY_PATH=/system/lib
OPTIND=1
PATH=/sbin:/system/sbin:/system/bin:/system/xbin
PS1=‘# ‘
PS2=‘> ‘
PS4=‘+ ‘
PWD=/
_=/system/xbin
從系統變數我們也可以看到一些系統使用中的重要目錄。
> 進程分析
# ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 312 220 c009b74c 0000ca4c S /init
root 2 0 0 0 c004e72c 00000000 S kthreadd
root 3 2 0 0 c003fdc8 00000000 S ksoftirqd/0
root 4 2 0 0 c004b2c4 00000000 S events/0
... ...
root 27 1 740 196 c0158eb0 afd0d8ac S /system/bin/sh
system 28 1 808 204 c01a94a4 afd0db4c S /system/bin/servicemanager
root 29 1 3736 372 ffffffff afd0e1bc S /system/bin/vold
root 30 1 3716 336 ffffffff afd0e1bc S /system/bin/netd
... ...
system 59 33 183396 25580 ffffffff afd0db4c S system_server
app_0 108 33 134184 14876 ffffffff afd0eb08 S com.android.inputmethod.pinyin
radio 112 33 147300 15804 ffffffff afd0eb08 S com.android.phone
app_25 122 33 149408 19932 ffffffff afd0eb08 S com.android.launcher
system 124 33 136708 13172 ffffffff afd0eb08 S com.android.settings
app_0 148 33 148892 18044 ffffffff afd0eb08 S android.process.acore
... ...
從這裡我們可以看出和 Linux 一樣所有進程的入口都是 init,接下來的系統進程也和 Linux 類似,再接下來就是一些系統的精靈(Native Service),最後是系統重要的應用程式。通過這個列表大家也可以看出 Android 啟動過程的一些端倪。
> 核心對比
Android 核心和標準的 Linux 核心一樣,主要實現記憶體管理、進程調度、處理序間通訊等功能。就最新的 Android 核心代碼版本 cupcake(其中Linux核心版本為2.6.27)的核心源碼樹的根目錄結構看,Android 核心源碼與標準 Linux 核心並無不同,但是經過與標準 Linux 核心原始碼進行詳細對比,可以發現,Android核心與標準Linux核心在檔案系統、處理序間通訊機制、記憶體管理等方面存在不同。
1、檔案系統:
不同於案頭系統與伺服器,行動裝置大多採用的不是硬碟而是採用 Flash 作為儲存介質。因此,Android 核心中增加了標準 Linux 專用於 Flash 的檔案系統 YAFFS2。對 NAND/Flash 晶片有著良好的支援。YAFFS2 是日誌結構的檔案系統,提供了損耗平衡和掉電保護,可以有效地避免意外斷電對檔案系統一致性和完整性的影響。YAFFS2按階層設計,分為檔案管理介面、內部實現層和NAND,簡化了其本身與系統的接 EI 設計,能更方便地整合到系統當中。經過測試證明,YAFFS2 效能比支援 NOR 型快閃記憶體的 JFFS2 檔案系統更加優秀。
2、處理序間通訊機制:
Android 增加了一種進程間的通訊機制 IPC Binder。Binder 通過守護進程 Service Manager 管理系統中的服務,負責進程問的資料交換。各進程通過 Binder 訪問同一塊共用記憶體,以達到資料通訊的機制。從應用程式層的角度看,進程通過訪問資料守護進程擷取用於資料交換的程式架構介面,調用並通過介面共用資料,而其他進程要訪問資料,也只需與程式架構介面進行互動,方便了程式員開發需要互動資料的應用程式。
3、記憶體管理:
在記憶體管理模組,Android 核心採用了一種不同於標準 Linux 核心的低記憶體管理原則。在標準Linux核心當中,使用一種叫做 OOM(Out of Memory) 的低記憶體管理原則;當記憶體不足時,系統檢查所有的進程,並對進程進行限制評分,獲得最高分的進程將被關閉(核心進程除外),而 Android 系統採用的則是一種叫作 LMK(Low Memory Killer) 的機制,這種機制將進程按照重要性進行分級、分組,記憶體不足時,將處於最低層級組的進程關閉。例如,在行動裝置當中,UI介面處於最進階別,所以該進程永遠不會被中止。這樣,在終端使用者看來,系統是穩定啟動並執行。同時,Android 新增加了一種記憶體共用的處理方式 Ashmem(Anonymous Shared Memory 匿名共用記憶體)。通過Ashmem,進程間可以匿名自由共用具名的記憶體塊,這種共用方式在標準 Linux 當中也是不被支援的。
4、電源管理:
由於 Android 主要用於行動裝置,電源管理就顯得尤為重要。因此,在Android核心當中增加了一種新的電源管理策略。目前,Android 採用的是一種較為簡單的電源管理策略,通過開關螢幕、開關螢幕背光、開關鍵盤背光、開關按鈕背光和調整螢幕亮度來實現電源管理,並沒有實現休眠和待機功能。目前有三種途徑判斷調整電源管理策略:RPC調用、電池狀態改變和電源設定。它通過廣播 Intent 或直接調用 API 的方式來與其他模組進行聯絡,電源管理策略同時還有自動關機機制,當電力低於最低可接受程度時,系統將自動關機。另外,Android 的電源管理模組還會根據使用者行為,自動調整螢幕亮度。
5、驅動及其他:
相對於標準核心,Android 核心還添加了字元輸出裝置、映像顯示裝置、鍵盤輸入裝置、RTC 裝置、USBDevice 裝置等相關裝置驅動,增加了日誌(Logger)系統,使應用程式可以訪問日誌訊息,使開發人員獲得更大的自由。
Android 系統開發學習雜記(轉)