標籤:
第一章 Android系統的編譯和移植執行個體
這一章節主要介紹了Android系統的編譯和移植技術,作為建立在Linux核心的基礎上的Android作業系統,它的編譯和移植不論在過程還是技術方面都和嵌入式Linux非常相似。
首先要準備一套可以正常運行Linux系統的一套開發版,需要在其移植Android系統,並能夠正常運行。
移植的主要過程為:
1.下載Android Linux 核心
2.安裝交叉工具鏈
3.移植Android Linux 核心支援的平台
4.安裝Android SDK
5.獲得Android 根檔案系統
6.設定系統內容,完成Android 正常啟動
具體步驟如下:
7.(1)移植boot-loader和linux2.6核心到目標平台上,讓linux核心可以啟動起來,基本的驅動允許正常。 此過程完全是嵌入式linux的開發,這裡直接跳過。需要注意的是,由於android已經被linux官方開除,因此從 網站上(如http://www.kernel.org/)下載的最新linux核心原始碼已經不包含android的專有驅動,因此建議 從google網上下下載Linux核心,android原始碼瀏覽網站如下: http://android.git.kernel.org/ 從該網站上發現核心相關的包如下: kernel/common.git 通用android核心項目 kernel/experimental.git 實驗性核心項目 kernel/linux-2.6.git 這個是標準的Linux核心,沒有android的驅動 kernel/lk.git 微核心項目 kernel/msm.git 這個是高通msm7xxx系列晶片所用核心 kernel/omap.git kernel/tegra.git NVIDIA Tegra系列晶片所用核心 下載核心代碼的方法如下: git clone git://android.git.kernel.org/kernel/common.git 下載完後用git branch -a查看所有git分支,結果如下: android-2.6.27 origin/HEAD origin/android-2.6.25 origin/android-2.6.27 origin/android-2.6.29 origin/android-2.6.32 origin/android-2.6.35 origin/android-2.6.36 origin/android-goldfish-2.6.27 origin/android-goldfish-2.6.29 然後切換到最新分支git checkout origin/android-2.6.36 (2)修改核心設定檔,開啟Android必須的驅動(日誌和BINDER)如下: CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_LOGGER=y 此部分的代碼在核心drivers/staging/android目錄下。 (3)為了提高啟動速度,採用ramdisk,將android檔案系統的部分內容壓縮到核心中。 首先開啟核心驅動: CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="root" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 然後在android原始碼編譯出來的out/target/product/merlin/root目錄複寫到核心目錄下。 (4)根據android檔案系統的要求對nand flash進行重新分區,舉例如下: 將nand flash分區以下8個分區 NTIM OBM U-boot Kernel System UserData Mass Storage BBT (5)根據分區表修改核心啟動參數如下: CONFIG_CMDLINE="ubi.mtd=4 ubi.mtd=5 ubi.mtd=6 root=ubi0_0 rootfstype=ubifs console=ttyS1,115200 uart_dma init=/init" 參數的意思是:載入的檔案系統部分有3個分區,分別為nand flash的第4,5,6分區(從0編號),檔案系統採用ubifs格式,控制台裝置為ttyS1,傳輸速率為115200 啟動的第一個應用程式是/init (6)確保控制台的設定和硬體保持一致,如:硬體上串口用的是UART1,則核心啟動參數中設定有console=ttyS1,而且android的啟動過程中設要設定正確,修改 部分位於android原始碼system/core/init/init.c檔案中,將 static char *console_name = "/dev/console"; 修改成 static char *console_name = "/dev/ttyS1"; (7)修改android原始碼system/core/rootdir目錄下的init.rc檔案,作如下修改(android預設yaffs2檔案系統): 首先將android檔案系統修改成可讀寫,將 mount rootfs rootfs / ro remount 修改成 mount rootfs rootfs / rw remount 然後修改掛載system和userdata部分的代碼,將 # Mount /system rw first to give the filesystem a chance to save a checkpoint mount yaffs2 [email protected] /system mount yaffs2 [email protected] /system ro remount # We chown/chmod /data again so because mount is run as root + defaults mount yaffs2 [email protected] /data nosuid nodev chown system system /data chmod 0771 /data 改成 # Mount /system rw first to give the filesystem a chance to save a checkpoint mount ubifs ubi0_0 /system ro # We chown/chmod /data again so because mount is run as root + defaults mount ubifs ubi1_0 /data nosuid nodev chown system system /data chmod 0771 /data (8)完成後編譯核心,可以開機檔案系統,控制台可用,但是沒有顯示啟動log,而且不停的重啟。 (9)系統不停的重啟,因此控制台已經可用了,自然而然的想到看到logcat日誌,一看,發現logcat裝置居然沒起來,設定檔裡面都定義了 居然沒起來,查看了下核心drivers/staging/android目錄,沒有.o檔案,證明是沒編譯到,在看核心目錄下的.config檔案,發現居然沒有了 logcat和binder的宏定義,設定檔裡面有定義而.config檔案中無定義,肯定是相關Kconfig檔案的問題,通過分析drivers/staging目錄下的 Kconfig檔案發現是因為STAGING_EXCLUDE_BUILD宏預設是y,在設定檔中否定此宏即可,在設定檔中CONFIG_STAGING定義後加上即可,如下: CONFIG_STAGING=y # CONFIG_STAGING_EXCLUDE_BUILD is not set 修改後重新編譯發現系統完成正常啟動,啟動過程中啟動log也顯示正常。
第一章介紹了移植Android系統到一套EZ6410(基於S3C6410)硬體系統上的典型過程,雖然步驟比較簡單,但是涉及的知識比較多,所以應該將上學期的所學知識好好複習一下。
http://www.cnblogs.com/Rain2017/
第一章 Android系統的編譯和移植執行個體