porting


porting

.Android內核Porting相關背景知識1.1運行平台Google的Android平台到20020227為止,應用部分還是以二進制的Binary形式發佈的,其编譯的目標平台ARM926EJ-S的CPU是屬於ARMV5T的版本,所以ARMV4架購的CPU平台無法使用其二進制代碼。關於這點,可以参考下面這篇文章,Benno在此做了詳細的理論分析和代碼測試:http://benno.id.au/blog/2007/11/21/android-neo1973.不過依照目前現階段情形除了原本基於ArmV5或以上的架構的平台可以實際運行Android外,亦可在ARMV4上面運行了,詳細操作步驟請參考文章最下面Benno’s的一些連結資訊,他有release一些patch可以供porting實驗之用。

Kernel,emulator,developmenttool等下載點:/p/android/downloads/listAndroidSDK載點:/sdk/1.5_r1/index.html

1.2.1Kernel版本到M5-r14release為止,Android的Kernel是基於Linux2.6.23的內核開發的,主要添加了一個名為Goldfish的虛擬CPU以及Android所需相關特定驅動代碼。你需要一個支持EABI的內核作為你內核Porting的起點(最低版本?不知道,只要EABIOK,應該沒有本質區別,但是,Android的很多驅動依賴於2.6.23的內核API,版本越低的內核,移植修改內核相關代碼的工作量越大)。

有興趣的開發者可以到/去git最新的androidcode來patch或修改成自己平台能跑的kernel.像我就是先git下來後再followbennorelease的patch來編出一個我那塊ARM920T板子可以跑的kernel。

1.2.2ToolchainSDK中的內核使用的是4.2.1版本的GCC。基本上,你需要的是一個支持EABI的工具鏈,比如你可以使用Codesourcery所提供的最新工具鏈,我是直接從/sgpp/lite/arm/portal/release642下載IA32GNU/Linux的toolchainforARMEABI,也可以下載Benno’s所使用的官方toolchain(載點:/pub/android-toolchain-20081019.tar.bz2)

1.2.3其他工具Android的Emulator是一個很好的仿真工具,其底層是基於QEMU來實現的,可以使用SDK中的adb工具來登入Emulator的控制台,並和控制台交換檔案系統等,藉以獲取你所需的檔案。你也可以將已經編好的kernel讓emulator來掛載跑看看。

/group/android-developers2.Porting基本思路2.1所需資源2.1.1硬體首先,當然是需要一個可以用來向上porting的硬件開發板了,對硬件的需求除了上面說的,需要ArmV5 兼容的CPU以外,最低要求基本需要64M 的內存,64M-128M 的FLASH(取決於你加載文件系統的方式,如果可以透過網絡使用NFS-ROOT或者MMC卡等來存放文件系統的話,這個應該就無所謂了)。

2.1.2軟體除了上述kernel和toolchain,為了方便調試,最好有靜態編譯的Busybox和Strace等工具。也可以從Benno的blog上下載到他編譯好的版本。


1.下載官方2.6.24内核。
2.製作Android和2.6.24内核的diff文件。
3.去除diff文件中和Goldfish和QEMU相關的代碼,如果你的系統已經支持YAFFS2,還可以去除這部分代碼去除diff文件中和Goldfish和QEMU相關的代碼,然後將diff文件Patch到你自己的核心上,如果需要,修改内核相關文件代碼使得patch能夠順利完成。將diff文件Patch到你自己的核心上,如果需要,修改內核相關文件代碼使得patch能夠順利完成。(這部分大概是主要的工作量,如果你的核心版本差得比較遠的話)。
4.如果必要,修改你的核心代碼中Framebuffer的驅動,使其Virtual_yres等於兩倍的Yres,並實際分配兩倍分辨率大小的framebuffer記憶體。配置內核,確保下列內容得到配置(forarmv4t):

CONFIG_AEABI=yCONFIG_ARM_THUMB=yCONFIG_ANDROID_BINDER_IPC=yCONFIG_ANDROID_LOGGER=yCONFIG_SHMEM=yCONFIG_ASHMEM=yCONFIG_ANDROID_PARANOID_NETWORK=y

從SDK中獲取Android的文件系統,基本上你只需要Systemetcsbininit這幾個目錄/文件就可以了,其它自建,其中data目錄是有內容的,但是這個目錄的內容可以由Android在啟動時動態的創建出來。可以使用adb工具在EMULATOR先tar包裝,再拷貝出來。M3的release也可以從benno那裡直接拿到他抓出來的文件系統。確保你的dev目錄下有足夠系統啟動的設備節點,如console等,其它的節點Android在啟動過程中會自動創建出來。使用NFSROOT或者chroot等手段Android的文件系统。啟動流程的大致外在表現分階段依次是:

?LCD上出現Android幾個字符?LCD短時間的Blank?LCD上出現一個左右滾動的紅色滾動條(如果有問題,基本上就死在這一步了)?進入主界面目前為止我的狀態是:鍵盤可以工作,觸摸屏有響應但是未校準,位置不對,啟動最後階段以及之後啟動新的程序,出現Vmalloc分配內存Failed問題,導致如Brower等應用程序不能完全啟動。其它網絡等東東還沒開始看呢。
3.一些TIPSAndroid會對文件使用memorymapped的方式進行操作,JFFS2不支持這種操作,所以要使用別的文件系統。當然也有繞過去的辦法,自己搜一下吧。為了方便測試,可以修改/etc/init.rc,註釋掉runtime,dbus-daemon,Xzygote等相關內容,在init啟動以後再手工啟動這些進程:/system/bin/app_process-Xzygote/system/bin–zygote