2014年12月10日 星期三

[轉] 使用handler.obtainMessage() 時要注意的問題

handler.obtainMessage() 的作用是從當前的Handler中獲取指定的Message以供再次使用
尤其是在監測線程中 如果不斷的new Message() 可能出現錯誤 (錯誤信息已經忘了 沒有記錄 =.=)
有5個重載的方法
[java] view plaincopy
  1. public final Message obtainMessage ()   
  2. public final Message obtainMessage (int what)  
  3. public final Message obtainMessage (int what, Object obj)  
  4. public final Message obtainMessage (int what, int arg1, int arg2)  
  5. 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的關係如下圖所示:
image
一個Activity中可以創建多個工作線程或者其他的組件,如果這些線程或者組件把他們的消息放入Activity的主線程消息隊列,那麼該消息就會在主線程中處理了。
因為主線程一般負責界面的更新操作,並且Android系統中的widget不是線程安全的,所以這種方式可以很好的實現Android界面更新。在Android系統中這種方式有著廣泛的運用。
那麼一個線程怎樣把消息放入主線程的消息隊列呢?答案是通過Handle對象,只要Handler對象以主線程的Looper創建,那麼調用Handler的sendMessage等接口,將會把消息放入隊列都將是放入主線程的消息隊列。並且將會在Handler主線程中調用該handler的handleMessage接口來處理消息。
更多Android消息隊列的信息請參看: http://my.unix-center.net/~Simon_fu/?p=652
下面這個圖從另外一個角度描述了他們的關係:
image

2014年11月25日 星期二

[轉] kernel build system探索

vmlinux是如何煉成的-- kernel makefile

引子
kernelmakefile包含的內容還真是多,我就是想看看要是我自己添加一個目錄編譯到內核裡,要怎麼做
就是這麼個不起眼的實驗,引發了一堆的故事

最簡單的例子
添加 一個目錄,叫test, 添加了test.c 和 Makefile
文件內容很簡單,如下。
cat Makefile
#
# 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/
最後 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
恩,不錯,可以了。

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)。 恩,好複雜。
那來看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): prepare scripts
    $(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()
{
    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
}
好吧,原來是調用了這個函數。。。 打出來看看吧。
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

神秘的built-in.o
在最後的鏈接過程中,我們可以看到,幾乎所有的依賴條件中,都會生成built-in.o的文件。 那這個文件,是怎麼生成的呢?
$(vmlinux-dirs): prepare scripts
    $(Q)$(MAKE) $(build)=$@
從這個規則中可以看到vmlinux-dir目標是通過下面make來生成的。展開一下看看。 這buildscripts/Kbuild.include
make -f scripts/Makefile.build obj=$@
對應到test目錄 那就是
make -f scripts/Makefile.build obj=test
這麼看來,就要進scripts/Makefile.build文件了
PHONY := __build
__build:
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
     $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
     $(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
恩 原來這個就是這麼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)
恩,基本明白了,就是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"
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啊。
反向依賴 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
看上去是這麼回事兒。

革命尚未成功,同志仍需努力
好了,我要記錄的東西就到這裡了。突然這麼嘎然而止,估計大家一定意猶未盡
但是事實就是這樣,基本kconfig語法大家可以在 Document/kbuild/kconfig-language.txt中找到
就不用我在這裡搬出來照抄了。

kernel模塊之間的關聯又怎能是我這樣的初學者所能理解,不能理解又豈能講得清楚
這裡只是給大家一個入口,讓大家能夠進一步kernel的海洋中探索。話說,授之以魚不如授之以漁嘛
要讓linux kernel更好的發揮作用,讓更多的人參與這個項目,幫助更多的人,還有很長的路要走
革命尚未成功,同志仍需努力。

[轉] MTK6577+Android編譯之preloader

http://blog.csdn.net/loongembedded/article/details/38706537

[轉] MTK6577+Android編譯之kernel

http://blog.csdn.net/loongembedded/article/details/38778731

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