Android深度探索(卷1)HAL与驱动开发学习笔记(4)
第四章 源代码的下载与编译
一、源代码配置Android源代码下载环境
1.建一个用于存放下载脚本文件(repo)的目录
# mkdir ~/bin
# PATH=~、bin:$PATH
2.下载repo脚本文件
# curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
#chmod a+x ~/bin/repo
3.创建用于存放Android源代码的目录
# mkdir android_reource
# cd android_source
4.初始化
# repo init -u https://android.googlesource.com/platform/manifest
//下载master分支
#repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_rl
//下载其他分支
5.开始下载Android源代码
# repo sync
下载一部分Android源代码
方法1 使用repo sync命令
# repo sync platform/bootable/recovery
方法2 使用git clone 命令
# git clone http://android.googlesourse.com/<project name>
二、安卓源代码目录结构解析
除了Makefile文件外,其余都为目录
|-- Makefile
|-- abi (应用程序二进制接口)
|-- bionic (bionic C库)
|-- bootable (启动引导相关代码)
|-- build (存放系统编译规则及generic等基础开发包配置)
|-- cts (Android兼容性测试套件标准)
|-- dalvik (dalvik Java虚拟机)
|-- development (应用程序开发相关)
|-- external (android使用的一些开源的模组)
|-- frameworks (核心框架——java及C++语言)
|-- hardware (主要保护硬解适配层HAL代码)
|-- libcore (JAVA核心库)
|-- ndk (NDK相关源代码)
|-- device (设备相关代码)
|-- out (编译完成后的代码输出与此目录)
|-- packages (应用程序包)
|-- prebuilt (x86和arm架构下预编译的一些资源)
|-- sdk (sdk及模拟器)
|-- system (文件系统库、应用及组件——C语言)
|-- vendor (厂商定制代码)
三、编译Android源代码
1.初始化编译环境
# source build/envsetup.sh
或
# . build/envsetup.sh //主要用来初始化一些编译命令
2.选择目标
# lunch full-eng //表示对所有的移动设备,Android模拟器有效并打开所有调试选项
3.编译Android源代码
# make //编译
四、out 目录结构分析
Out 目录存放编译Android源代码生成的目标文件的默认目录
-- target(表示目标机,如果编译时候定义TARGET_STRIP_MODULE=false的话,这个目录为debug/target) 主要的两个目录为host和target,前者表示在主机(x86)生成的工具,后者表示目标机(默认为ARMv5)运行的内容。
五、下载和编译Linux 内核源代码
# git clone https://android.googlesourse.com/kernel/common.git //下载最新版的内核源代码
# git branch -a //查看有哪些远程版本库
# git check out -b android-3.0 remotes/origin/android-3.0 //导出Linux3.0的内核
# git clone http://android,googlesourse.com/kernel/goldfish.git
# git checkout -b android-goldfish-2.6.29 remotes/origin/android-goldfish-2.6.29 //导出goldfish
六、Linux内核源码目录
arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。
block: 部分块设备驱动
crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
Documentation
drivers:设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c等。
fs:支持各种文件系统,如EXT、FAT、NTFS、JFFS2等
include:头文件,与系统相关的头文件放置在include/linux子目录下。
init:内核初始化代码。
ipc:进程间通信的代码
kernel:内核的最核心部分,包括进程的调度、定时器等,而和平台相关的一部分代码放在arch/*/kernel目录下。
lib:库文件代码。
mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。
net:网络相关代码,实现了各种常见的网络协议。
scripts:用于配置内核的脚本文件。
security:主要是一个SELinux的模块。
sound:ALSA、OSS音频设备的驱动核心代码和常用设备驱动
usr:实现了用于打包和压缩的cipo等。
七、安装Android内核的编译环境
1.将arm-linux-gcc-4.3.2.tgz文件和arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar,bz2文件复制到工作目录
2.解压上面的两个文件
3.验证交叉编译器是否安装成功
# ls /user/local/arm -1
- 安装libncurses5
# apt-get install libncurses5-dev
八、配置和编译Linux内核
# export PATH=/root/compilers/arm-none-linux-gnueabi/bin:$PATH
#cd ~/linux_kernel
#make clean
#make
在Linux源代码目录执行以下四个配置命令
Make config
Make manuconfig
Make oldconfig
Make xconfig
九、成功编译Linux内核后,会在<Linux内核源码目录>/arch/arm/boot目录生成一个zlmage文件,该文件是Linux内核的二进制版本,可以直接使用zlmage安装到开发版上,也可以通过命令在Android模拟器中进行测试。
# emulator -avd myavd -kernel /root/kernel/goldfish/arch/arm/boot/zlmage