Android主要有6部分
Applications (java)
--------------------------------
FrameWork (java)
=====================================
| Core Libraries
external Lib | --------------
| dalvik (jvm)
|
-----------------------------------
HAL
====================================
Linux Kernel
第一部分 : Kernel
先把kernel的代碼拉下來
1 git clone git://android.git.kernel.org/kernel/common.git
git clone git://android.git.kernel.org/kernel/common.git -o eclair
git clone git://android.git.kernel.org/kernel/common.git -o v2.6.29
怎麼kernel的版本總是2.6.27呢?我要的kernel版本是2.6.29,因為從2.6.29以後,kernel以及支援S3C6410了
(雖然支援S3C6410 ,但是大部分S3C6410的驅動沒有) 而在2.6.27中沒有 。
solution : git branch -a
git checkout v2.6.29/android-2.6.29
如果修改了Makefile,則出現:
error: You have local changes to 'Makefile'; cannot switch branches.
先把Makefile 重新checkout
git checkout Makefile
然後 git checkout v2.6.29/android-2.6.29
2 make menuconfig ACRH=arm
然後編譯
an
In file included from arch/arm/plat-s3c/include/plat/cpu-freq.h:14,
from arch/arm/mach-s3c6410/cpu.c:32:
include/linux/cpufreq.h:258:31: error: macro parameters must be comma-separated
make[1]: *** [arch/arm/mach-s3c6410/cpu.o] 錯誤 1
solution :
#define cpufreq_exit_idle(int cpu, unsigned long ticks) do {} while (0)
修改為:
#define cpufreq_exit_idle( cpu, ticks) do {} while (0)
3 Android對kernel 主要有哪些改動呢?
1) 採用了Yaffs2
在檔案系統 fs/yaffs2
2) 增加了Alarm,Ashmem,Binder,Power Management,Logger, Kernel Debugger,Low Memory Killer
其中Binder,Logger等在driver/staging/android下面
alarm 在 driver/rtc/alarm.c
Binder 為Application IPC所用,而 Power Managerment 為 android.os.PowerManager 所調用
從linux官方網站下載了一個2.6.29版本,和android的2.6.29進行比較,發現不同之處還很多。
所以,對於移植,最好還是在android的2.6.29的基礎上,把一些相關的驅動移植上去,而不是把android的東西移植到linux 2.6.29之上。
4 kernel 的 GPS driver 在哪裡 ?
在android中,定義了gps.h,需要自己按照 gps.h去實現GPS driver
5 android為了支援emulator ,增加了goldfish
在kernel的源碼目錄下:
git checkout origin/android-goldfish-2.6.29
cp ./arch/arm/configs/goldfish_defconfig .config
修改Makefile ,用arm-2008q3編譯器,然後make ARCH=arm 將產生zImage
此image可以在emulator下跑
第二部分 HAL
HAL 在hardware 目錄下 ,它不是驅動,它其實是屬於user space ,而不屬於Kernel層。
也就是用HAL把上層的應用,服務 和下層的系統分開,在Android的早期版本中,沒有這一層,1.0之後HAL層就比較明顯了。
比如 背光的設定,我們可以實現一個lights.default.so動態庫,這個庫實現了介面 set_light ,而set_light會開啟Kernel的
device,然後進行操作(通過IO Control ,或者寫等)來調節背光。
HAL中有一個 RIL (Radio Interface Layer),主要是為了電話功能
第三部分 external Libs
這部分在external下面
1 它不是用glibc ,而用bionic
bionic 更快 更小 ,但不完全支援POSIX標準,比如C++ exceptions,wide char
這樣其他的toolchain不能用於編譯Android
個人認為,其實系統的快慢和glibc沒有多大的關係,android的慢是因為平台的原因,而非glibc ,
所以android把glibc換成bionic,非明智之舉,這樣需要開發自己的編譯器toolchain, bionic ,還不如把這個精力放在平台開發上
難道是為了繞開 GPL?
2 採用opencore 而非mplayer
支援hardware / software codec plug-ins
3 採用了sqlite 而非db4o
這樣對於很多java人員,資料庫方面的操作要修改,除非把db4o移植到android上(db4o可以無縫的運行在Android平台)
第四部分 Dalvik虛擬機器
這部分是android的核心。在目錄dalvik下,編譯後產生dalvikvm
它和標準JVM的區別有
1)dalvik基於寄存器,而JVM基於stack
2) 效能上優與標準的JVM
它屬於J2SE的一個子集,但是沒有通過JAVA標準認證,支援Swing. 而J2ME的標準介面類就是lcdui包中的類,不支援swing.
參見 : http://www.mcuol.com/Tech/122/29755.htm
第五部分 Framework
這部分在framework下面。包括
. Activity manager
• Telephony manager
• Window Manager
• Power Manager
• Resource manager
• Notification Manager
它提供一個給應用調用的介面。
第六部分 Applications
這部分Google提供了很多應用,這部分在packages目錄下面。比如packages/apps下面就有很多應用。
這些應用也是用Java寫的,包括Google地圖,瀏覽器,Google商店等
除了以上的6部分外,android還提供了一套toolchain,在prebuilt/linux-x86/toolchain/下有arm交叉編譯器. 對於Native應用程式,必須要用android toolchain編譯,用其他的toolchain編譯的程式在android平台上用不了,因為其他的不是bionic.而對於kernel ,uboot可以用其他的toolchain編譯,因為kernel,uboot是一個獨立的,沒有用到glibc .
由於toolchain已支援arm v5以上。所以如果要移植android ,假如cpu為arm V4 如S3C2440,則除了移植kernel外,還必須移植toolchain .
不過,很奇怪的是,我用android的toolchain編譯kernel,出現錯誤,而用arm2008-q3卻沒問題???
fs/binfmt_aout.c: In function 'load_aout_binary':
fs/binfmt_aout.c:270: error: 'SEGMENT_SIZE' undeclared (first use in this function)
fs/binfmt_aout.c:270: error: (Each undeclared identifier is reported only once
fs/binfmt_aout.c:270: error: for each function it appears in.)
解決辦法是:
Userspace binary formats --->
Kernel support for a.out and ECOFF binaries 這項去掉 就可以了