2014年12月24日 星期三
2014年12月10日 星期三
[轉] 使用handler.obtainMessage() 時要注意的問題
handler.obtainMessage() 的作用是從當前的Handler中獲取指定的Message以供再次使用
尤其是在監測線程中 如果不斷的new Message() 可能出現錯誤 (錯誤信息已經忘了 沒有記錄 =.=)
有5個重載的方法
- public final Message obtainMessage ()
- public final Message obtainMessage (int what)
- public final Message obtainMessage (int what, Object obj)
- public final Message obtainMessage (int what, int arg1, int arg2)
- public final Message obtainMessage (int what, int arg1, int arg2, Object obj)
what arg1 arg2 obj分別對應Message中的相應成員變量
並且這樣獲得的Message不用再重新定義相應的值 十分好用
一般來講 what是用來switch不同的操作 而其他3個參數都是定義屬性
要注意的是 具有兩個參數的方法只有一個 且第二個參數是Object 而不是arg1
並且如果在2個參數的方法中 將第二個參數填寫為本應該設置為arg1的值(int)時候 也不會報錯 因為:
1. arg1有缺省值0
2. int型可以被自動轉化為Integer
但是arg1的值卻被賦給了msg,obj 所以在Handler中的arg1值就為0了
[轉] Android 的消息隊列模型
Android 的消息隊列模型
Android是參考Windows的消息循環機制來實現Android自身的消息循環的。
Android通過Looper、Handler來實現消息循環機制,Android消息循環是針對線程的(每個線程都可以有自己的消息隊列和消息循環)。
Android系統中,Looper負責管理線程的消息隊列和消息循環。我們可以通過Loop.myLooper()得到當前線程的Looper對象,通過Loop.getMainLooper()可以獲得當前進程的主線程的Looper對象。
一個線程可以存在(當然也可以不存在)一個消息隊列和一個消息循環(Looper)。
Activity是一個UI線程,運行於主線程中,Android系統在啟動的時候會為Activity創建一個消息隊列和消息循環(Looper)。
Handler的作用是把消息加入特定的(Looper)消息隊列中,並分發和處理該消息隊列中的消息。構造Handler的時候可以指定一個Looper對象,如果不指定則利用當前線程的Looper創建。
Activity、Looper、Handler,Thread的關係如下圖所示:
Android通過Looper、Handler來實現消息循環機制,Android消息循環是針對線程的(每個線程都可以有自己的消息隊列和消息循環)。
Android系統中,Looper負責管理線程的消息隊列和消息循環。我們可以通過Loop.myLooper()得到當前線程的Looper對象,通過Loop.getMainLooper()可以獲得當前進程的主線程的Looper對象。
一個線程可以存在(當然也可以不存在)一個消息隊列和一個消息循環(Looper)。
Activity是一個UI線程,運行於主線程中,Android系統在啟動的時候會為Activity創建一個消息隊列和消息循環(Looper)。
Handler的作用是把消息加入特定的(Looper)消息隊列中,並分發和處理該消息隊列中的消息。構造Handler的時候可以指定一個Looper對象,如果不指定則利用當前線程的Looper創建。
Activity、Looper、Handler,Thread的關係如下圖所示:
一個Activity中可以創建多個工作線程或者其他的組件,如果這些線程或者組件把他們的消息放入Activity的主線程消息隊列,那麼該消息就會在主線程中處理了。
因為主線程一般負責界面的更新操作,並且Android系統中的widget不是線程安全的,所以這種方式可以很好的實現Android界面更新。在Android系統中這種方式有著廣泛的運用。
那麼一個線程怎樣把消息放入主線程的消息隊列呢?答案是通過Handle對象,只要Handler對象以主線程的Looper創建,那麼調用Handler的sendMessage等接口,將會把消息放入隊列都將是放入主線程的消息隊列。並且將會在Handler主線程中調用該handler的handleMessage接口來處理消息。
更多Android消息隊列的信息請參看: http://my.unix-center.net/~Simon_fu/?p=652
下面這個圖從另外一個角度描述了他們的關係:
2014年12月2日 星期二
2014年11月25日 星期二
[轉] kernel build system探索
vmlinux是如何煉成的-- kernel makefile
引子
kernel的makefile包含的內容還真是多,我就是想看看要是我自己添加一個目錄編譯到內核裡,要怎麼做。
就是這麼個不起眼的實驗,引發了一堆的故事。
最簡單的例子
添加 一個目錄,叫test, 添加了test.c 和 Makefile。
文件內容很簡單,如下。
cat Makefile
#
# Makefile for the linux kernel makefile experiment.
#
# Makefile for the linux kernel makefile experiment.
#
obj-y := test.o
cat test.c
#include <linux/export.h>
int test_global = 0;
然後在主 Makefile中 添加
-core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
+core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ test/
+core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ test/
最後 make test
make[1]: Nothing to be done for `all'.
HOSTCC arch/x86/tools/relocs
CHK include/linux/version.h
CHK include/generated/utsrelease.h
CC kernel/bounds.s
GEN include/generated/bounds.h
CC arch/x86/kernel/asm-offsets.s
GEN include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
CC test/test.o
LD test/built-in.o
HOSTCC arch
CHK incl
CHK incl
CC kernel/bounds.s
GEN incl
CC arch
GEN incl
CALL scri
CC test/test.o
LD test/built-in.o
恩,不錯,可以了。
vmlinux是如何煉成的-- kernel makefile
人總是不知足的,我又開始好奇,這個 build的過程究竟是怎麼個回事。
好吧,我們知道 make後,最終的結果叫 vmlinux,那我們就找找這個神奇的東西是怎麼
產生的吧。
vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
$(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
ifdef CONFIG_HEADERS_CHECK
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
ifdef CONFIG_SAMPLES
$(Q)$(MAKE) $(build)=samples
endif
ifdef CONFIG_BUILD_DOCSRC
$(Q)$(MAKE) $(build)=Documentation
endif
+$(call if_changed,link-vmlinux)
vmlinx 基於上面三個目標, 而vmlinux-deps又基於 $(vmlinux-dirs)。 恩,好複雜。
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
ifdef CONFIG_SAMPLES
$(Q)$(MAKE) $(build)=samples
endif
ifdef CONFIG_BUILD_DOCSRC
$(Q)$(MAKE) $(bu
endif
+$(call if_c
vmlinx 基於上面三個目標, 而vmlinux-deps又基於 $(vmlinux-dirs)。 恩,好複雜。
那來看看 vmlinux-dirs都包含什麼吧。
在主Makefile中看到下面的內容。
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ test/
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
$(net-y) $(net-m) $(libs-y) $(libs-m)))
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
$(net-y) $(net-m) $(libs-y) $(libs-m)))
$(vmlinux-dirs): prepare scripts
$(Q)$(MAKE) $(build)=$@
$(Q)$(MAKE) $(build)=$@
恩, 我們把 vmlinux-dirs的東東打印出來看看。
vmlinux-dris: init usr arch/x86 kernel mm fs ipc security crypto block test drivers sound firmware arch/x86/pci arch/x86/power arch/x86/video arch/x86/oprofile net lib arch/x86/lib
這樣,你是不是明白點了呢。 這些都是 kernel源代碼中子目錄。也就是 kernel將要挨個的
進入每個子目錄,編譯~。
那最後這個 vmlinux是怎麼生成的呢? 怎麼樣將每個目錄下生成的模塊鏈接成一個 vmlinux的文件的呢?
看到上面 vmlinux目標中,最後一個命令:
+$(call if_changed,link-vmlinux)
哦,原來是調用了 cmd_link-vmlinux。這個命令就定義在主 Makefile中。
cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
打出來看看,長這樣。
/bin/bash $< ld -m elf_i386 --emit-relocs --build-id
$< 表示第一個以來目標,那麼在 vmlinux目標中,第一個目標是 scripts/link-vmlinux.sh, 展開後就成為。
/bin/bash scripts/link-vmlinux.sh ld -m elf_i386 --emit-relocs --build-id
額,原來是又調用了一個腳本。。。 好吧, 再進去看看。 發現這麼個東東
info LD vmlinux
vmlinux_link "${kallsymso}" vmlinux
vmlinux_link "${kallsymso}" vmlinux
vmlinux_link()
{
local lds="${objtree}/${KBUILD_LDS}"
if [ "${SRCARCH}" != "um" ]; then
${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \
-T ${lds} ${KBUILD_VMLINUX_INIT} \
--start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1}
else
${CC} ${CFLAGS_vmlinux} -o ${2} \
-Wl,-T,${lds} ${KBUILD_VMLINUX_INIT} \
-Wl,--start-group \
${KBUILD_VMLINUX_MAIN} \
-Wl,--end-group \
-lutil ${1}
rm -f linux
fi
}
local lds=
if [ "${SRCARCH}" != "um" ]; then
${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}
-T ${lds} ${KB
--start-group ${KB
else
${CC} ${CFLAGS_vmlinux} -o ${2}
-Wl,-T,${lds} ${KB
-Wl
${KB
-Wl
-lutil ${1}
rm -f linux
fi
}
好吧,原來是調用了這個函數。。。 打出來看看吧。
ld -m elf_i386 --emit-relocs --build-id -o vmlinux -T arch/x86/kernel/head_32.o arch/x86/kernel/head32.o arch/x86/kernel/head.o init/built-in.o --start-group usr/built-in.o arch/x86/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o test/built-in.o lib/lib.a arch/x86/lib/lib.a lib/built-in.o arch/x86/lib/built-in.o drivers/built-in.o sound/built-in.o firmware/built-in.o arch/x86/pci/built-in.o arch/x86/power/built-in.o arch/x86/video/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o
恩,原來真相是這樣的。 最後把這麼多東西鏈接起來成為 vmlinux。 看到我們添加的 test目錄了麼,它也生成了一個 built-in.o,最後鏈接到了 vmlinux中。
$ nm vmlinux | grep test_global
c198d284 B test_global
啊哦,還真有這個symbol!
啊哦,還真有這個symbol!
神秘的built-in.o
在最後的鏈接過程中,我們可以看到,幾乎所有的依賴條件中,都會生成一個 built-in.o的文件。 那這個文件,是怎麼生成的呢?
$(vmlinux-dirs): prepare scripts
$(Q)$(MAKE) $(build)=$@
$(Q)$(MAKE) $(build)=$@
從這個規則中可以看到, vmlinux-dir目標是通過下面的 make來生成的。展開一下看看。 這個 build在scripts/Kbuild.include中。
make -f scripts/Makefile.build obj=$@
對應到test目錄 那就是
make -f scripts/Makefile.build obj=test
這麼看來,就要進到 scripts/Makefile.build文件了。
PHONY := __build
__build:
__build:
__build: $(if $(KBUILD_BUILTIN),$(builtin-target ) $(lib-target) $(extra-y)) \
$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
$(subdir-ym) $(always)
@:
$(subdir-ym) $(always)
@:
__build是這個 makefile的第一個目標,也是默認的目標。 這裡面藏著一個 builtin-target,看著很像,再搜搜。
ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(subdir-m) $(lib-target)),)
builtin-target := $(obj)/built-in.o
endif
endif
恩 原來這個就是這麼多叫 built-in.o的原因。但是要生成 buit-in.o,必須要以上的這些變量不能全部為空。
那再來看看編譯這個 built-in.o的規則是什麼
quiet_cmd_link_o_target = LD $@
# If the list of objects to link is empty, just create an empty built-in.o
cmd_link_o_target = $(if $(strip $(obj-y)),\
$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
$(cmd_secanalysis),\
rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)
$(builtin-target): $(obj-y) FORCE
$(call if_changed,link_o_target)
targets += $(builtin-target)
# If the list of objects to link is empty, just create an empty built-in.o
cmd_link_o_target = $(if $(strip $(obj-y)),\
$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
$(cm
rm -f $@; $(AR) rcs$
$(builtin-target): $(obj-y) FORCE
$(call if_c
targets += $(builtin-target)
恩,基本明白了,就是當 obj-y的內容不為空,那麼就用 ld來鏈接成一個 built-in.o。
但是我試了一下,如果沒有 obj-y那麼,也會生成一個 built-in.o,但是用的是別的命令。
如在i386下,用的是
rm -f test/built-in.o; ar rcsD test/built-in.o
不知道這個是什麼高級玩意。
好了,到此為止,基本上一個最上層的框架有了一個概念。 那就先休息一下~
一切盡在掌握 -- kconfig 配置系統
kconfig是個強大的工具,如果說 makefile制定了完美的編譯依賴關系,那麼 kconfig制定了完美的模塊的依賴關係。
源頭
在根目錄下有個 Kconfig文件,這就是一切故事的起源。
整個文件就沒幾行,打出來看一眼。
#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"
config SRCARCH
string
option env="SRCARCH"
# see Docu
#
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"
config SRCARCH
string
option env="SRCARCH"
source "arch/$SRCARCH/Kconfig"
第一行就是輸出個內核版本號。
第二行應該是配置一個環境變量? 不知道,以後再來看。
第三行很重要,這個是包含了一個 arch目錄下的 Kconfig文件。
當你打開
我們運行make menuconfig, 你可以看到,這個文件就是make menuconfig中顯示的東西。
一切都變得明朗起來,你是否有種太極生兩儀,兩儀生四象,四象生八卦的神奇感覺
剪不斷,理還亂
kernel中這麼多的模塊之間的依賴關係,簡直就是 剪不斷,理還亂。
幸好在 Kconfig文件中,我們可以找到一點蛛絲馬跡。
依賴 depends on
這個關鍵字表示了在某些配置選中後,本配置項才會顯示。
在 driver/pci/Kconfig文件中有,
config PCI_MSI
bool "Message Signaled Interrupts (MSI and MSI-X)"
depends on PCI
depends on ARCH_SUPPORTS_MSI
可以發現,要配置 MSI必須要先支持 PCI。 恩這個道理咱都懂, 連PCI都沒有,哪裡來的MSI啊。
bool "Message Signaled Interrupts (MSI and MSI-X)"
depends on PCI
depends on ARCH_SUPPORTS_MSI
可以發現
反向依賴 select
這個關鍵字表示了當本配置項選中後,其他的配置項也需要選中。
在 arch/x86/Kconfig文件中有:
config HIGHMEM64G
bool "64GB"
depends on !M386 && !M486
select X86_PAE
---help---
Select this if you have a 32-bit processor and more than 4
gigabytes of physical RAM.
其實這個我也不懂,看上去就是說要支持更多的物理內存,那麼在 x86的平台上,就要選中 X86_PAE。
bool "64GB"
depends on !M386 && !M486
select X86_PAE
---help---
Select this if you have a 32-bit processor and more than 4
gigabytes of physical RAM.
其實這個
看上去是這麼回事兒。
革命尚未成功,同志仍需努力
好了,我要記錄的東西就到這裡了。突然這麼嘎然而止,估計大家一定意猶未盡。
但是事實就是這樣,基本的 kconfig語法大家可以在 Document/kbuild/kconfig-language.txt中找到。
就不用我在這裡搬出來照抄了。
kernel模塊之間的關聯又怎能是我這樣的初學者所能理解,不能理解又豈能講得清楚。
這裡只是給大家一個入口,讓大家能夠進一步的在 kernel的海洋中探索。話說,授之以魚不如授之以漁嘛。
要讓linux kernel更好的發揮作用,讓更多的人參與這個項目,幫助更多的人,還有很長的路要走。
革命尚未成功,同志仍需努力。
MTK代碼目錄結構
1、android
|-- a、bionic - bionic C庫
|-- b、bootable - 啟動引導相關代碼
|-- c、build - 存放系統編譯規則及generic等基礎開發包配置
|-- d、cts - Android兼容性測試套件標準
|-- e、dalvik - dalvik JAVA虛擬機
|-- f、development - 應用程序開發相關
|-- g、external - android使用的一些開源的模組
|-- h、frameworks - 核心框架——java及C++語言
|-- i、hardware - 主要保護硬解適配層HAL代碼
|-- j、out - 編譯完成後的代碼輸出於此目錄
|-- k、packages - 應用程序包
|-- l、prebuilt - x86和arm框架下預編譯的一些資源
|-- m、sdk - sdk及模擬器
|-- n、system - 文件系統庫,應用及組件——C語言
|-- o、vendor - 廠家定製代碼
2、bionic目錄
|-- (1)、libc - C庫
| |-- a、arch-arm - ARM框架,包含系統調用彙編實現
| |-- b、arch-sh -
| |-- c、arch-x86 - x86框架,包含系統調用彙編實現
| |-- d、bionic - 由C實現的功能,框架無關
| |-- e、docs - 文檔
| |-- f、include - 頭文件
| |-- g、inet -
| |-- h、kernel - Linux內核中的一些頭文件
| |-- i、netbsd -
| |-- j、private - 一些私有的頭文件
| |-- k、regex -
| |-- l、stdio - stdio實現
| |-- m、stdlib - stdlib實現
| |-- n、string - string函數實現
| |-- o、tools - 幾個工具
| |-- p、tzcode - 區時相關代碼
| |-- q、unistd - unistd 實現
| |-- r、wchar -
| |-- s、zoneinfo - 區時信息
|-- (2)、libdl - libdl實現,dl是動態鏈接,提供訪問動態鏈接庫的功能
| |-- a、arch-sh -
|-- (3)、libm - libm數學庫的實現
| |-- a、alpha - alpha框架
| |-- b、amd64 - amd64框架
| |-- c、arm - arm框架
| |-- d、bsdsrc - bsd的源碼
| |-- e、i386 - i386框架
| |-- f、i387 - i387框架
| |-- g、ia64 - ia64框架
| |-- h、include - 頭文件
| |-- i、man - 數學函數,後綴名為.3,一些為freeBSD的庫文件
| |-- j、powerpc - powerpc框架
| |-- k、sh -
| |-- l、sparc64 - spare64框架
| |-- m、src - 源代碼
|-- (4)、libstdc++ - libstdc++ C++實現庫
| |-- a、include - 頭文件
| |-- b、src - 源代碼
|-- (5)、libthread_db - 多線程程序的調試器庫
| |-- a、inckude - 頭文件
|-- (5)、linker- 動態連接器
| |-- a、arch - 支持arm和x86兩種框架
3、bootable目錄
|-- (1)、bootloader - 適合各種bootlader的通用代碼
| |-- a、legacy - 估計不能直接使用,可以參考
| |-- arch_armv6 - V6框架,幾個簡單的彙編文件
| |-- arch_msm7k - 高通7k處理器框架的幾個基本驅動
| |-- include - 通用頭文件和高通7k框架頭文件
| |-- libboot - 奇洞窟,都寫得很簡單
| |-- libc - 一些常用的C函數
| |-- nandwrite - nandwrite函數實現
| |-- usbloader - usbloader實現
| |-- b、uboot -
|-- (2)、diskinstaller - android鏡像打包器,x86可生產iso
| |-- a、deitdisklbl -
| |-- b、libdiskconfig -
|-- (3)、recovery - 系統恢複相關
| |-- a、applypatch -
| |-- b、edify - 升級腳本使用的edify腳本語言
| |-- c、etc - init.rc回覆腳本
| |-- d、minui - 一個簡單的UI
| |-- e、minzip - 一個簡單的壓縮工具
| |-- f、mtdutils - mtd工具
| |-- g、res - 資源
| |-- images - 一些圖片
| |-- h、sec -
| |-- i、testdata -
| |-- j、tools - 工具
| |-- ota - OTA Over The Air Updates升級工具
| |-- k、updater - 升級器
4、build目錄
|-- (1)、core - 核心編譯規則
|-- (2)、libs -
| |-- a、host - 主機端庫,有android「cp」功能替換
|-- (3)、target - 目標機編譯對象
| |-- a、board - 開發平台
| |-- generic_x86 - 通用
| |-- mt6516_evb[QVGA] -
| |-- sim -
| |-- b、product - 開發平台對應的編譯規則
| |-- security - 密鑰相關
|-- (4)、toools - 編譯中主機使用的工具及腳本
| |-- a、acp - Acdroid「acp」Command
| |-- b、apicheck - api檢查工具
| |-- c、apriori - 預鏈接工具
| |-- d、atree - tree工具
| |-- e、bin2asm - bin轉換為asm工具
| |-- f、check_prereq - 檢查編譯時間戳工具
| |-- g、droiddoc -
| |--h、fs_config -
| |-- i、fs_get_stats - 獲取文件系統狀態
| |-- j、iself - 判斷是否ELF格式
| |-- k、isprelinked - 判斷是否prelinked
| |-- l、kcm - 按鍵相關
| |-- m、lsd - List symbol dependencies
| |-- n、releasetools - 生成鏡像的工具及腳本
| |-- o、rgb2565 - rgb轉換為565
| |-- p、singapk - apk簽名工具
| |-- q、soslim - strip工具
| |-- r、zipalign - zip archibe alignment tool
5、dalvik目錄 dalvik虛擬機
|-- (1)、dalvikvm - main.c的目錄
|-- (2)、dexdump - dex反彙編
|-- (3)、dexlist - List all methods in all concrete classes in a DEX file
|-- (4)、dexopt - 預驗證與優化
|-- (5)、docs - 文檔
|-- (6)、dvz - 和zygote相關的一個命令
|-- (7)、dx - dx工具,將多個java轉換為dex
|-- (8)、hit - java語言寫成
|-- (9)、libdex - dex的庫
|-- (10)、libnativehelper -
|-- (11)、tests - 測試代碼
|-- (12)、tools - 工具
|-- (13)、vm -虛擬機實現
6、development目錄 (開發需要的一些例程及工具)
|-- (1)、apps - 一些核心應用程序
| |-- a、BluetoothDebug - 藍牙調試程序
| |-- b、BuildWidget -
| |-- c、CustomLocale - 自定義區域設置
| |-- d、Development - 開發
| |-- e、Fallback - 和語言相關的一個程序
| |-- f、FontLab - 字庫
| |-- g、GestureBuilder - 手勢運動
| |-- h、GraphicsLab -
| |-- i、launchperf -
| |-- j、NinePatchLab -
| |-- k、OBJViewer - OBJ查看器
| |-- l、SdkSetup - SDK安裝器
| |-- m、SpareParts - 高級設置
| |-- n、Term - 遠程登錄
|-- (2)、build - 編譯腳本模板
|-- (3)、cmds - 有個monkey工具
|-- (4)、data - 配置數據
|-- (5)、docs - 文檔
|-- (6)、host - 主機端SUB驅動等
|-- (7)、ide - 集成開發環境
|-- (8)、ndk - 本地開發套件 ——C語言開發套件
|-- (9)、pdk - Plug Development Kit
|-- (10)、samples - 例程
| |-- a、AccelermoeterPlay -
| |-- b、AccessibilityService -
| |-- c、Alarm -
| |-- d、AliasActivity -
| |-- e、ApiDemos - API掩飾程序
| |-- f、BackupRestore -
| |-- g、BasicGLSurfaceView -
| |-- h、BluetoothChat - 藍牙聊天
| |-- i、BrowserPlugin - 瀏覽器插件
| |-- j、BusinessCard - 商業卡
| |-- k、Compass - 指南針
| |-- l、ContactManager - 了聯繫人管理器
| |-- m、CrossCompatibility -
| |-- n、CubeLiveWallpaper - 動態壁紙的一個簡單例程
| |-- o、FixedGridLayout - 佈局
| |-- p、GlobalTime - 全球時間
| |-- q、HeavyWeight -
| |-- r、HelloActivity - hello
| |-- s、Home - Home
| |-- t、JetBoy - jetBoy遊戲
| |-- u、LunarLander -
| |-- v、MailSync - 右鍵同步
| |-- w、MultiResolution -多分辨路
| |-- x、MySampleRss - RSS
| |-- y、NFCDemo -
| |-- z、Obb -
| |-- aa、RSSReader - RSS閱讀器
| |-- bb、SampleSyncAdapter -
| |-- cc、SearchableDictionary - 目錄搜索
| |-- dd、SimpleJNI - JNI例程
| |-- ee、SipDemo -
| |-- ff、SkeletonApp - 空殼APP
| |-- gg、Snake - Snake程序
| |-- hh、SoftKeyboard - 軟鍵盤
| |-- ii、Spinner -
| |-- jj、SpinnerTest -
| |-- kk、TicTacToeLib -
| |-- ll、TicTacToeMain -
| |-- mm、VoiceRecognitionService -
| |-- nn、Wiktionary -
| |-- oo、WiktionarySimple -
|-- (11)、scripts - 腳本
|-- (12)、sdk - sdk配置
|-- (13)、sdk_overlay -
|-- (14)、simulator -
|-- (15)、testrunner -
|-- (16)、tools - 工具
|-- (17)、tutorials -
7、external目錄
|-- (1)、apache-http - 網頁服務器
|-- (1)、astl - a slimmed-down vesion of the regular C++ STL
|-- (1)、bison - 自動生成語法分析器
|-- (2)、blisrc -
|-- (3)、blktrace -
|-- (4)、bluetooth - 藍牙相關,協議棧
|-- (5)、bouncycastle -
|-- (6)、bsdiff - diff工具
|-- (7)、bzip2 - 壓縮工具
|-- (8)、chromium -
|-- (9)、clearsilver - html模板系統
|-- (10)、dbus - 低延時,低開銷,高可用性的IPC機制
|-- (11)、dhcpcd -DHCP服務
|-- (12)、dnsmasq -
|-- (13)、e2fsprogs - EXT2文件系統工具
|-- (14)、easymock -
|-- (15)、elfcopy - 複製ELF的工具
|-- (16)、elfutils - ELF工具
|-- (17)、embunit - Embedded Unit Project
|-- (18)、emma - java代碼覆蓋統計工具
|-- (19)、esd - Enlightended Sound Daemon,將多種音頻流混合在一個設備上播放
|-- (20)、expat -
|-- (21)、fdlibm - Freely Distributable LIBM
|-- (22)、freetype - 字體
|-- (23)、fsck_msdos - dos文件系統檢查工具
|-- (24)、genext2fs -
|-- (25)、giflib - gif庫
|-- (26)、grub - GNU GRUB,the GRand Unified Bootloader
|-- (27)、gtest - Google C++ Testing Framework
|-- (28)、guava -
|-- (29)、icu4c - ICU(International Component for )
|-- (30)、iproute2 -
|-- (31)、ipsec-tools - this package provides a way to use the native IPsec functionality
|-- (32)、iptables - 防火牆
|-- (33)、jdiff - generate a re[ort describing the difference between two public Java APIs
|-- (34)、jhead - jpeg頭部信息工具
|-- (35)、jpeg - jpeg庫
|-- (36)、jsr305 -
|-- (37)、junit - JUnit是一個java元以內的單元測試框架
|-- (38)、kernel-headers - 內核的一些頭文件
|-- (39)、libffi - a foreign function interface library
|-- (40)、libgsm -
|-- (41)、libnfc-nxp -
|-- (42)、libpcap - 網絡數據包獲取函數
|-- (43)、libpng - png庫
|-- (44)、libvpx -
|-- (45)、libxml2 - xml解析庫
|-- (46)、mtpd - 命令
|-- (47)、netcat - simple Unix utility which reads and writes dataacross network connections
|-- (48)、netperf - 網絡性能測試工具
|-- (49)、nenen - 看代碼和JNI相關
|-- (50)、nist-sip -
|-- (1)、oauth -
|-- (1)、opencore - 多媒體框架
|-- (51)、openssl - SSL加密相關
|-- (52)、oprofile - Linux內核支持的一種性能分析機制
|-- (53)、ping - ping命令
|-- (54)、ppp - ppps撥號命令
|-- (55)、proguard - Java class fileshrinker,optimizer,obfuscator,and preverfier
|-- (56)、protobuf - a flexible,efficient,automated mechanism for serializing structured data
|-- (57)、qemu - arm模擬器
|-- (58)、quake -
|-- (59)、safe-iop - functions for performing sage integer operations
|-- (60)、skia - skia圖形引擎
|-- (61)、skia_asm -
|-- (62)、sonivox - sole MIDI solution for Google Android Mobile Phone Platform
|-- (63)、speex - Speex編/解碼API的使用(libspeex)
|-- (64)、srec - Nuance公司提供的開源連續非特定人語音識別
|-- (65)、stlport -
|-- (66)、strace - trace工具
|-- (67)、svox - Embedded Text-to-Speech
|-- (68)、tagsoup - 一個Java開發符合SAX的HTML解析器
|-- (69)、tcpdump - 抓TCP包的軟件
|-- (70)、tinyxml - a simple,small,C++ XML parser
|-- (71)、v8 -
|-- (72)、webkit - 瀏覽器核心
|-- (73)、wpa_supplicant - 無限網卡管理
|-- (74)、wpa_supplicant_6 -
|-- (75)、xmlwriter - XML編輯工具
|-- (76)、yaffs2 - yaffs文件系統
|-- (77)、zlib - a general purpose data compression library
|-- a、bionic - bionic C庫
|-- b、bootable - 啟動引導相關代碼
|-- c、build - 存放系統編譯規則及generic等基礎開發包配置
|-- d、cts - Android兼容性測試套件標準
|-- e、dalvik - dalvik JAVA虛擬機
|-- f、development - 應用程序開發相關
|-- g、external - android使用的一些開源的模組
|-- h、frameworks - 核心框架——java及C++語言
|-- i、hardware - 主要保護硬解適配層HAL代碼
|-- j、out - 編譯完成後的代碼輸出於此目錄
|-- k、packages - 應用程序包
|-- l、prebuilt - x86和arm框架下預編譯的一些資源
|-- m、sdk - sdk及模擬器
|-- n、system - 文件系統庫,應用及組件——C語言
|-- o、vendor - 廠家定製代碼
2、bionic目錄
|-- (1)、libc - C庫
| |-- a、arch-arm - ARM框架,包含系統調用彙編實現
| |-- b、arch-sh -
| |-- c、arch-x86 - x86框架,包含系統調用彙編實現
| |-- d、bionic - 由C實現的功能,框架無關
| |-- e、docs - 文檔
| |-- f、include - 頭文件
| |-- g、inet -
| |-- h、kernel - Linux內核中的一些頭文件
| |-- i、netbsd -
| |-- j、private - 一些私有的頭文件
| |-- k、regex -
| |-- l、stdio - stdio實現
| |-- m、stdlib - stdlib實現
| |-- n、string - string函數實現
| |-- o、tools - 幾個工具
| |-- p、tzcode - 區時相關代碼
| |-- q、unistd - unistd 實現
| |-- r、wchar -
| |-- s、zoneinfo - 區時信息
|-- (2)、libdl - libdl實現,dl是動態鏈接,提供訪問動態鏈接庫的功能
| |-- a、arch-sh -
|-- (3)、libm - libm數學庫的實現
| |-- a、alpha - alpha框架
| |-- b、amd64 - amd64框架
| |-- c、arm - arm框架
| |-- d、bsdsrc - bsd的源碼
| |-- e、i386 - i386框架
| |-- f、i387 - i387框架
| |-- g、ia64 - ia64框架
| |-- h、include - 頭文件
| |-- i、man - 數學函數,後綴名為.3,一些為freeBSD的庫文件
| |-- j、powerpc - powerpc框架
| |-- k、sh -
| |-- l、sparc64 - spare64框架
| |-- m、src - 源代碼
|-- (4)、libstdc++ - libstdc++ C++實現庫
| |-- a、include - 頭文件
| |-- b、src - 源代碼
|-- (5)、libthread_db - 多線程程序的調試器庫
| |-- a、inckude - 頭文件
|-- (5)、linker- 動態連接器
| |-- a、arch - 支持arm和x86兩種框架
3、bootable目錄
|-- (1)、bootloader - 適合各種bootlader的通用代碼
| |-- a、legacy - 估計不能直接使用,可以參考
| |-- arch_armv6 - V6框架,幾個簡單的彙編文件
| |-- arch_msm7k - 高通7k處理器框架的幾個基本驅動
| |-- include - 通用頭文件和高通7k框架頭文件
| |-- libboot - 奇洞窟,都寫得很簡單
| |-- libc - 一些常用的C函數
| |-- nandwrite - nandwrite函數實現
| |-- usbloader - usbloader實現
| |-- b、uboot -
|-- (2)、diskinstaller - android鏡像打包器,x86可生產iso
| |-- a、deitdisklbl -
| |-- b、libdiskconfig -
|-- (3)、recovery - 系統恢複相關
| |-- a、applypatch -
| |-- b、edify - 升級腳本使用的edify腳本語言
| |-- c、etc - init.rc回覆腳本
| |-- d、minui - 一個簡單的UI
| |-- e、minzip - 一個簡單的壓縮工具
| |-- f、mtdutils - mtd工具
| |-- g、res - 資源
| |-- images - 一些圖片
| |-- h、sec -
| |-- i、testdata -
| |-- j、tools - 工具
| |-- ota - OTA Over The Air Updates升級工具
| |-- k、updater - 升級器
4、build目錄
|-- (1)、core - 核心編譯規則
|-- (2)、libs -
| |-- a、host - 主機端庫,有android「cp」功能替換
|-- (3)、target - 目標機編譯對象
| |-- a、board - 開發平台
| |-- generic_x86 - 通用
| |-- mt6516_evb[QVGA] -
| |-- sim -
| |-- b、product - 開發平台對應的編譯規則
| |-- security - 密鑰相關
|-- (4)、toools - 編譯中主機使用的工具及腳本
| |-- a、acp - Acdroid「acp」Command
| |-- b、apicheck - api檢查工具
| |-- c、apriori - 預鏈接工具
| |-- d、atree - tree工具
| |-- e、bin2asm - bin轉換為asm工具
| |-- f、check_prereq - 檢查編譯時間戳工具
| |-- g、droiddoc -
| |--h、fs_config -
| |-- i、fs_get_stats - 獲取文件系統狀態
| |-- j、iself - 判斷是否ELF格式
| |-- k、isprelinked - 判斷是否prelinked
| |-- l、kcm - 按鍵相關
| |-- m、lsd - List symbol dependencies
| |-- n、releasetools - 生成鏡像的工具及腳本
| |-- o、rgb2565 - rgb轉換為565
| |-- p、singapk - apk簽名工具
| |-- q、soslim - strip工具
| |-- r、zipalign - zip archibe alignment tool
5、dalvik目錄 dalvik虛擬機
|-- (1)、dalvikvm - main.c的目錄
|-- (2)、dexdump - dex反彙編
|-- (3)、dexlist - List all methods in all concrete classes in a DEX file
|-- (4)、dexopt - 預驗證與優化
|-- (5)、docs - 文檔
|-- (6)、dvz - 和zygote相關的一個命令
|-- (7)、dx - dx工具,將多個java轉換為dex
|-- (8)、hit - java語言寫成
|-- (9)、libdex - dex的庫
|-- (10)、libnativehelper -
|-- (11)、tests - 測試代碼
|-- (12)、tools - 工具
|-- (13)、vm -虛擬機實現
6、development目錄 (開發需要的一些例程及工具)
|-- (1)、apps - 一些核心應用程序
| |-- a、BluetoothDebug - 藍牙調試程序
| |-- b、BuildWidget -
| |-- c、CustomLocale - 自定義區域設置
| |-- d、Development - 開發
| |-- e、Fallback - 和語言相關的一個程序
| |-- f、FontLab - 字庫
| |-- g、GestureBuilder - 手勢運動
| |-- h、GraphicsLab -
| |-- i、launchperf -
| |-- j、NinePatchLab -
| |-- k、OBJViewer - OBJ查看器
| |-- l、SdkSetup - SDK安裝器
| |-- m、SpareParts - 高級設置
| |-- n、Term - 遠程登錄
|-- (2)、build - 編譯腳本模板
|-- (3)、cmds - 有個monkey工具
|-- (4)、data - 配置數據
|-- (5)、docs - 文檔
|-- (6)、host - 主機端SUB驅動等
|-- (7)、ide - 集成開發環境
|-- (8)、ndk - 本地開發套件 ——C語言開發套件
|-- (9)、pdk - Plug Development Kit
|-- (10)、samples - 例程
| |-- a、AccelermoeterPlay -
| |-- b、AccessibilityService -
| |-- c、Alarm -
| |-- d、AliasActivity -
| |-- e、ApiDemos - API掩飾程序
| |-- f、BackupRestore -
| |-- g、BasicGLSurfaceView -
| |-- h、BluetoothChat - 藍牙聊天
| |-- i、BrowserPlugin - 瀏覽器插件
| |-- j、BusinessCard - 商業卡
| |-- k、Compass - 指南針
| |-- l、ContactManager - 了聯繫人管理器
| |-- m、CrossCompatibility -
| |-- n、CubeLiveWallpaper - 動態壁紙的一個簡單例程
| |-- o、FixedGridLayout - 佈局
| |-- p、GlobalTime - 全球時間
| |-- q、HeavyWeight -
| |-- r、HelloActivity - hello
| |-- s、Home - Home
| |-- t、JetBoy - jetBoy遊戲
| |-- u、LunarLander -
| |-- v、MailSync - 右鍵同步
| |-- w、MultiResolution -多分辨路
| |-- x、MySampleRss - RSS
| |-- y、NFCDemo -
| |-- z、Obb -
| |-- aa、RSSReader - RSS閱讀器
| |-- bb、SampleSyncAdapter -
| |-- cc、SearchableDictionary - 目錄搜索
| |-- dd、SimpleJNI - JNI例程
| |-- ee、SipDemo -
| |-- ff、SkeletonApp - 空殼APP
| |-- gg、Snake - Snake程序
| |-- hh、SoftKeyboard - 軟鍵盤
| |-- ii、Spinner -
| |-- jj、SpinnerTest -
| |-- kk、TicTacToeLib -
| |-- ll、TicTacToeMain -
| |-- mm、VoiceRecognitionService -
| |-- nn、Wiktionary -
| |-- oo、WiktionarySimple -
|-- (11)、scripts - 腳本
|-- (12)、sdk - sdk配置
|-- (13)、sdk_overlay -
|-- (14)、simulator -
|-- (15)、testrunner -
|-- (16)、tools - 工具
|-- (17)、tutorials -
7、external目錄
|-- (1)、apache-http - 網頁服務器
|-- (1)、astl - a slimmed-down vesion of the regular C++ STL
|-- (1)、bison - 自動生成語法分析器
|-- (2)、blisrc -
|-- (3)、blktrace -
|-- (4)、bluetooth - 藍牙相關,協議棧
|-- (5)、bouncycastle -
|-- (6)、bsdiff - diff工具
|-- (7)、bzip2 - 壓縮工具
|-- (8)、chromium -
|-- (9)、clearsilver - html模板系統
|-- (10)、dbus - 低延時,低開銷,高可用性的IPC機制
|-- (11)、dhcpcd -DHCP服務
|-- (12)、dnsmasq -
|-- (13)、e2fsprogs - EXT2文件系統工具
|-- (14)、easymock -
|-- (15)、elfcopy - 複製ELF的工具
|-- (16)、elfutils - ELF工具
|-- (17)、embunit - Embedded Unit Project
|-- (18)、emma - java代碼覆蓋統計工具
|-- (19)、esd - Enlightended Sound Daemon,將多種音頻流混合在一個設備上播放
|-- (20)、expat -
|-- (21)、fdlibm - Freely Distributable LIBM
|-- (22)、freetype - 字體
|-- (23)、fsck_msdos - dos文件系統檢查工具
|-- (24)、genext2fs -
|-- (25)、giflib - gif庫
|-- (26)、grub - GNU GRUB,the GRand Unified Bootloader
|-- (27)、gtest - Google C++ Testing Framework
|-- (28)、guava -
|-- (29)、icu4c - ICU(International Component for )
|-- (30)、iproute2 -
|-- (31)、ipsec-tools - this package provides a way to use the native IPsec functionality
|-- (32)、iptables - 防火牆
|-- (33)、jdiff - generate a re[ort describing the difference between two public Java APIs
|-- (34)、jhead - jpeg頭部信息工具
|-- (35)、jpeg - jpeg庫
|-- (36)、jsr305 -
|-- (37)、junit - JUnit是一個java元以內的單元測試框架
|-- (38)、kernel-headers - 內核的一些頭文件
|-- (39)、libffi - a foreign function interface library
|-- (40)、libgsm -
|-- (41)、libnfc-nxp -
|-- (42)、libpcap - 網絡數據包獲取函數
|-- (43)、libpng - png庫
|-- (44)、libvpx -
|-- (45)、libxml2 - xml解析庫
|-- (46)、mtpd - 命令
|-- (47)、netcat - simple Unix utility which reads and writes dataacross network connections
|-- (48)、netperf - 網絡性能測試工具
|-- (49)、nenen - 看代碼和JNI相關
|-- (50)、nist-sip -
|-- (1)、oauth -
|-- (1)、opencore - 多媒體框架
|-- (51)、openssl - SSL加密相關
|-- (52)、oprofile - Linux內核支持的一種性能分析機制
|-- (53)、ping - ping命令
|-- (54)、ppp - ppps撥號命令
|-- (55)、proguard - Java class fileshrinker,optimizer,obfuscator,and preverfier
|-- (56)、protobuf - a flexible,efficient,automated mechanism for serializing structured data
|-- (57)、qemu - arm模擬器
|-- (58)、quake -
|-- (59)、safe-iop - functions for performing sage integer operations
|-- (60)、skia - skia圖形引擎
|-- (61)、skia_asm -
|-- (62)、sonivox - sole MIDI solution for Google Android Mobile Phone Platform
|-- (63)、speex - Speex編/解碼API的使用(libspeex)
|-- (64)、srec - Nuance公司提供的開源連續非特定人語音識別
|-- (65)、stlport -
|-- (66)、strace - trace工具
|-- (67)、svox - Embedded Text-to-Speech
|-- (68)、tagsoup - 一個Java開發符合SAX的HTML解析器
|-- (69)、tcpdump - 抓TCP包的軟件
|-- (70)、tinyxml - a simple,small,C++ XML parser
|-- (71)、v8 -
|-- (72)、webkit - 瀏覽器核心
|-- (73)、wpa_supplicant - 無限網卡管理
|-- (74)、wpa_supplicant_6 -
|-- (75)、xmlwriter - XML編輯工具
|-- (76)、yaffs2 - yaffs文件系統
|-- (77)、zlib - a general purpose data compression library
訂閱:
文章 (Atom)