.
.
.
.
.
昨天已經編譯了 Android 4.2.2 的源碼,詳見《Ubuntu 14.04 編譯 Android 4.2.2 for Tiny4412》一文。
今天我們繼續剩下的工作,讓我們的 android 系統可以跑在 Tiny4412 開發板上。
Android 和 Linux 是兩碼事,Android 系統是基於 Linux 內核的。我們編譯的 Android 源碼是 Android 系統本身的源碼,而內核是指通過原生 Linux 源碼移植過來的內核源碼,所以它們需要我們分別編譯。並且 Android 系統的版本號和 Linux 源碼的版本號是沒有嚴格意義上的對應關系的,只要某個版本的 Linux 內核能支撐起某個版本的 Android 系統,那么它們就可以組合使用。
內核就不多說了,它在 Android 中的作用跟在其它 Linux 發行版中的作用沒什么區別,我們簡單介紹一下 Android 文件系統的結構。
Linux 系統的啟動過程:bootloader(GRUB)---->zImage(Kernel)---->ramdisk(臨時根,在內存中)---->rootfs(永久根,在磁盤上)
Android 的啟動過程:bootloader(廠商提供)---->zImage(Kernel)---->ramdisk(永久根,為了提速所以放在內存中)
那么 Android 的 ramdisk 中存放了什么呢,通常分為四個分區:
[fat32] 內置存儲空間。fat32 不是名字,是分區格式。
[system] 系統啟動時掛載到system目錄
[data] 系統啟動時掛載到data目錄
[cache] 相當於swap分區
其中 system 分區和 data 分區是 Android 系統中非常重要的兩個分區,我們簡單介紹一下它們常用的作用。
system:
[app] xxx.apk | 系統自帶的軟件安裝目錄,普通用戶無權卸載。像電話本、撥號器、短信等等系統應用都安裝在這里。還有許多定制版手機被無良廠商預裝了各種無法被卸載的垃圾程序都放在這里。這里的程序都是用 Java 編寫的。
[framework] xxx.jar | 存放用 Java 編寫的庫
[bin] xxx | 存放本地程序,一般都是由 C/C++/asm 編寫
[lib] xxx.so | 存放用 C/C++/asm 編寫的庫
data:
這個目錄在內存中,是android系統的家目錄。系統配置文件都在這個分區中,恢復出廠設置通常就是格式化該分區。
好了,android 的文件系統就先簡單介紹到這了,下面開始今天的正題吧,編譯 Linux 內核源碼。
我手上用的是 Linux 3.5 的內核,並且已經被大神們移植過了,所以我就不再執行 make menuconfig 了,而是直接用大神給做好的配置文件進行編譯了。自己還沒有研究過怎么移植內核,上次折騰到半夜還失敗了,所以這次先老老實實的拿大神移植好的內核做實驗,等過段時間研究好了內核移植再拿出來分享。
既然有了大神移植好的內核,那么編譯起來也就簡單多了,過程當中也沒有遇到什么坑。
[yuhuashi@local android]$ tar xzf linux-3.5-20140422.tgz [yuhuashi@local android]$ cd linux-3.5/ [yuhuashi@local linux-3.5]$ cp tiny4412_linux_defconfig .config [yuhuashi@local linux-3.5]$ make -j4 ......此處省略一萬字 OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready
OK,看到上面這兩句話我們就知道編譯成功了,並且編譯好的內核放在了 arch/arm/boot/zImage 這里。
可以開始燒寫系統到開發板了,雞凍ing...
====================華麗的分割線====================
接下來我們將編譯好的數據拷貝到SD卡上,然后就可以通過SD卡燒寫系統了。
首先將友善之臂(Tiny4412 開發板的制造商)提供的 Superboot(就是個 bootloader) 燒寫到 SD 卡上,使我們的 SD 卡可以引導起來。
1.插入 SD 卡
2.查看 SD 卡對應的設備文件
[yuhuashi@local tools]$ sudo fdisk -l Disk /dev/sdc: 7948 MB, 7948206080 bytes 19 heads, 10 sectors/track, 81704 cylinders, total 15523840 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdc1 155217 15523839 7684311+ b W95 FAT32
可見我的 SD 卡是 /dev/sdc,各位在后面看到我的命令中包含 /dev/sdc 或 /dev/sdc1 時,需要替換成你機器上查詢出來對應的設備文件路徑,千萬不要寫錯了!
====前方高能預警,請無關人員立即撤離,相關人員必須在意識清醒的情況下謹慎操作!!!====
3.將 Superboot 燒寫到 SD 卡上
其實可以自己用 read(2)、write(2) 函數等方式燒寫,我已經有一個現成的工具了,所以直接就拿來用了。各位如果沒有燒寫工具可以自己寫一個,因為我沒有該工具的源碼所以就不貼源碼了,注意別把分區表覆蓋了就行。
另外 bootloader 是燒寫在設備上的(即/dev/sdc),而不是燒寫在分區上的(/dev/sdc1)。
[yuhuashi@local tools]$ ./write4412boot Usage:<./write4412boot> <boot.bin> <dev> [yuhuashi@local tools]$ sudo ./write4412boot ../images_all/Superboot4412.bin /dev/sdc start ........... end ...........
4.將 ramdisk-u.img、system.img、userdata.img 以及 linux 內核 linux-x.x/arch/arm/boot/zImage 以及 Superboot4412.bin 拷貝到SD卡images目錄下。
[yuhuashi@local android-4.2.2_r1]$ mkdir -p /media/yuhuashi/2CAA-71B6/images/Android4.2.2/ [yuhuashi@local android-4.2.2_r1]$ cp ramdisk-u.img system.img userdata-4g.img /media/yuhuashi/2CAA-71B6/images/Android4.2.2/ [yuhuashi@local android-4.2.2_r1]$ cp userdata-16g.img userdata-8g.img userdata.img /media/yuhuashi/2CAA-71B6/images/Android4.2.2/ [yuhuashi@local android-4.2.2_r1]$ cd .. [yuhuashi@local android]$ cd linux-3.5/ [yuhuashi@local linux-3.5]$ cp arch/arm/boot/zImage /media/yuhuashi/2CAA-71B6/images/Android4.2.2/ [yuhuashi@local android-4.2.2_r1]$ cp ~/arm/class_boot/source/images_all/Superboot4412.bin /media/yuhuashi/2CAA-71B6/images/
我們前面已經將 Superboot 燒寫到 SD 卡上了,之所以還要再拷貝 一份到 SD 卡上,是因為之前燒寫 Superboot 是為了讓 SD 卡可以啟動,而現在拷貝到 SD 卡上的這份 Superboot 是為了一會兒燒寫進 eMMC 中在開發板上引導我們的 Android 系統。
注意我拷貝的一個鏡像叫做 userdata-4g.img,昨天說過在 Android 編譯完成后,我們執行 ./gen-img.sh 命令生成了幾個 img 文件,其中包含 userdata-16g.img、userdata-4g.img、userdata-8g.img、userdata.img,這幾個鏡像適用於不同大小的 eMMC 的設備。一般來說使用 userdata.img 就可以了,但是 友善之臂 的開發板有些特殊,4GB eMMC 的板子必須使用 userdata-4g.img 才行。
5.在 SD 卡的 images 文件夾中創建 FriendlyARM.ini 文件
[yuhuashi@local images]$ vim FriendlyARM.ini #This line cannot be removed. by FriendlyARM(www.arm9.net) CheckOneButton=No Action = Install OS = Android LowFormat = No VerifyNandWrite = No LCD-Mode = No CheckCRC32=No StatusType = Beeper | LED ################### Android 4.2.2 #################### Android-BootLoader = Superboot4412.bin Android-Kernel = Android4.2.2/zImage Android-CommandLine = console=ttySAC0,115200n8 androidboot.console=ttySAC0 ctp=2 skipcali=y vmalloc=512m ethmac=1C:6F:65:34:51:7E lcd=S70 uhost=n Android-RamDisk =Android4.2.2/ramdisk-u.img Android-RootFs-InstallImage = Android4.2.2/system.img Android-UserData-4G = Android4.2.2/userdata-4g.img Android-UserData-8G = Android4.2.2/userdata-8g.img Android-UserData-16G = Android4.2.2/userdata-16g.img Android-UserData = Android4.2.2/userdata.img
注意第一行的注釋不要刪掉,不然 Superboot 可能無法引導。
完成后卸載掉 SD 卡,然后將卡插入到開發板的插槽中,將啟動模式開關撥動到 SD 卡啟動。
[yuhuashi@local images]$ cd ~ [yuhuashi@local ~]$ umount /media/yuhuashi/2CAA-71B6
最后請注意:LZ將編譯好的系統燒寫到開發板上死活啟動不了,后來才發現原因是:將 Superboot4412 燒寫到SD卡上的時候必須使用USB接口的讀卡器,不能使用筆記本內置的讀卡器!原因不明,如果有知道原因的童鞋請告訴LZ哈。