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

你可能感兴趣的:(Android底层)