Android底層開發學習筆記 第一天

今天,開始學習Android底層的開發。(注:我是新手小白,純粹學習筆記,大神們可以直接略過了)

第一部分 編譯運行我的第一個Android system。

準備工作:

下載源碼:包括u-boot源碼,Linux-kernel源碼,Android源碼,

具體的版本對應關係,以及如何下載這些源碼

可以參考這篇博客 http://blog.csdn.net/koozxcv/article/details/49932795 


特別說明:我使用的開發板平臺爲fs210,使用其他平臺的朋友請將fs210換成對應的平臺即可。

開始編譯:

第一步,編譯u-boot

這裏要說明一下,不同版本的的u-boot編譯過程不相同,具體的編譯方法,建議參考對應開發板的參考資料。

我使用的是三星公司s5pv210的開發板。

cd ~/src_210
tar  -xvf  uboot-fs210_V5.tar.bz2


a,設置交叉工具鏈--vim Makefile
150 CROSS_COMPILE = /opt/toolchain/toolchain-4.3.2-farsight/bin/arm-none-linux-gnueabi-
b,選擇一個開發板
george@George-JI:~/src_210/uboot-fs210_V5$ make fs210_nand_config
Configuring for fs210_nand board...


c,編譯
make -j2

生成u-boot.bin

第二步,編譯內核

這裏要說明一下,不同版本的的內核編譯過程不相同,具體的編譯方法,建議參考對應開發板的參考資料。

使用非開發板廠商提供的內核,編譯過程中出問題概率很大,新手慎重。


先解壓源碼:

linux-3.0.8-FS210.tar.bz2

進入源碼目錄

a,設置交叉工具鏈 vim Makefile
195 ARCH            ?= arm
197 CROSS_COMPILE   ?= /opt/toolchain/toolchain-4.5.1-farsight/bin/arm-none-linux-gnueabi-

b,選擇一個soc
cp config_for_FS210_Android_v1.0  .config


修改mac地址:(實際過程是類似於DM9000的網卡驅動的移植)
vim arch/arm/mach-s5pv210/mach-fs210.c

417 static struct dm9000_plat_data fs210_dm9000_platdata = {
418         .flags          = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
419         .dev_addr       = { 0x00, 0xa9, 0xb2, 0xcf, 0xdc, 0xe8 },//改成唯一的
420 };


c,make menuconfig

d,make uImage  -j2 //需要一個mkimage--uboot-fs210_V5/tools$ ls mkimage  ==》 /usr/bin

編譯Linux內核實際大約需要30分鐘到1個小時左右。


第三步 ,編譯Android源碼

首先都是解壓源碼,進入源碼目錄

注:

每次打開一個終端,進入Android源碼目錄都必須要執行一次這兩個命令,後續的HAL,JNI等的編譯都要在這個這個環境下運行。

大家如果覺得麻煩,可以自己寫一個簡單的shell腳本,自動執行這兩個命令。(度娘有寫腳本的方法,建議學一下,很實用的)

a,初始化編譯環境--爲編譯提供的命令--lunch, m, mmm, croot,godir get_build_var...
//每次打開一個新的終端都要執行一次,或者 . build/envsetup.sh 
george@George-JI:~/src_210/android4.0-fs210_v2$ source build/envsetup.sh 
including device/farsight/fs210/vendorsetup.sh
including device/moto/stingray/vendorsetup.sh
including device/moto/wingray/vendorsetup.sh
including sdk/bash_completion/adb.bash



b,選擇一個產品--產品名爲fs210
george@George-JI:~/src_210/android4.0-fs210_v2$ lunch full_fs210-eng


============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full_fs210
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76I
============================================
或者
george@George-JI:~/src_210/android4.0-fs210_v2$ lunch


You're building on Linux


Lunch menu... pick a combo:
1. full-eng
2. full_x86-eng
3. vbox_x86-eng
4. full_fs210-userdebug
5. full_fs210-eng
6. full_stingray-userdebug
7. full_wingray-userdebug


Which would you like? [full-eng] 5
或者:lunch 5



c,編譯
george@George-JI:~/src_210/android4.0-fs210_v2$ make  
// 如果從頭編譯需要花很長--大概一個晚上

大概兩個小時左右的時候,會有一個錯誤缺乏XXX庫的支持之類的錯誤,只要百度就可以解決的,問題不大,

解決以後繼續編譯,回去睡一覺,早上應該就好了 。ps:我自己編譯Android源碼大概花了14個小時,大家參考一下。


第四步,製作根文件系統 

  Android底層開發也是使用掛載NFS的條件下進行的,所以必須要建立一個根文件系統,將文件傳輸到開發板上。

下面是關於Android的根文件系統的目錄的作用簡單的介紹:


android根文件系統目錄結構:
data: //應用程序安裝目錄,已經存放內部文件數據目錄
//  /data/data/包/files database...   

dev            
proc
sys
sbin

init  //android祖先進程,類似於linuxrc
 //  set bootargs init=/init
init.rc  //啓動腳本,類似於/etc/init.d/rcS
init.fs210.rc
init.fs210.usb.rc 
init.goldfish.rc  

default.prop  // 屬性文件--用於進程間通信
  
ueventd.rc // 用於自動創建設備節點,類似之前講的mdev
ueventd.fs210.rc  
ueventd.goldfish.rc

system
|
app :內置的apk,開機的時候自動安裝


bin
etc
lib
usr
xbin

build.prop // 屬性文件--用於進程間通信   
fonts  //字體庫
framework // framework層的java代碼最終會編譯成二進制文件  
//android系統的核心代碼,在開機的時候會自動加載運行
media // 多媒體文件,開機的聲音,動畫
tts  //語言包--支持國際化  
vendor  //廠商提供的二進制文件,將不願意開源的代碼封裝成so,bin文件


基本核心的製作根文件系統:

首先建立一個目錄androidrootfs

關注out/target/product/fs210
cp -raf out/target/product/fs210/data/   androidrootfs/
cp -raf out/target/product/fs210/root/*  androidrootfs/                                              
cp -raf out/target/product/fs210/system  androidrootfs/


實際製作根文件系統的時候:

修改fs210_build.sh
33 #       make -j$CPU_JOB_NUM
80         chmod -R 777 rootfs_dir/system/vendor

然後執行:./fs210_build.sh
結果:
out/target/product/fs210/rootfs_dir

將生成的根文件系統拷貝到nfs的路徑下面就可以了

到這裏,就可以在開發板上面運行Android系統了;

運行android系統
u-boot.bin
uImage
rootfs_dir

tftp + nfs方式運行android系統:

1,uImage, u-boot.bin ==>  /tftpboot
cp -raf u-boot.bin  /tftpboot/
cp -raf arch/arm/boot/uImage  /tftpboot/


2,配置nfs:
george@George-JI:~/src_210/android4.0-fs210_v2$ cp -raf out/target/product/fs210/rootfs_dir/  /opt/



sudo vim /etc/exports
/opt/rootfs_dir           *(subtree_check,rw,no_root_squash,async)


重啓nfs服務器:
sudo service nfs-kernel-server restart


3,在開發板中:
燒錄uboot:
FS210 # tftp 0x40008000 u-boot.bin
FS210 # nand erase 0x0 0x100000
FS210 # nand write 0x40008000 0x0 0x100000


啓動內核:
FS210 # set serverip 192.168.7.5
FS210 # set ipaddr 192.168.7.7
FS210 # set bootcmd tftp 0x40008000 uImage \; bootm 0x40008000
掛載rootfs:
FS210 # set bootargs console=ttySAC0,115200 init=/init root=/dev/nfs nfsroot=192.168.7.5:/opt/rootfs_dir ip=192.168.7.7


如果開發板沒有配置有顯示屏,或者還沒移植顯示屏驅動,可以用androidvncserver軟件看到Android界面,用usb鼠標控制Android系統的方法來調試軟件。

ps:不懂的多找度娘,度娘找不到就翻牆找谷哥,基本外國的網站上面這方面的知識還是很多的。(終於可以好好的學習英文了^_^,學好英文真的很重要,看不懂人家的網站會很尷尬的。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章