今天,开始学习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:不懂的多找度娘,度娘找不到就找谷哥,基本外国的网站上面这方面的知识还是很多的。(终于可以好好的学习英文了^_^,学好英文真的很重要,看不懂人家的网站会很尴尬的。)