看了本书第四章,我学会了下载、编译、测试android源代码和linux内核源代码:
- android源代码的下载、编译、测试:
① 配置Android源代码的下载环境:
创建一个用于存放下载脚本文件(repo)的目录(例如bin):
#mkdir ~/bin
#PATH=~/bin:$PATH
下载repo脚本文件用于下载安卓源码,repo文件实际上是用python脚本对Git的封装,主要是为了简化下载安卓源码的操作:
#curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
#chmod a+x ~/bin/repo
创建用于存放安卓源码的目录:
#mikdir android_source
#cd android_source
初始化:
#repo init –u https://android.googlesource.com/platform/manifest
开始下载安卓源码:
#repo sync
② 下载android源码中的一部分:
法一:使用命令#repo sync(后跟工程名)
法二:使用#git clone命令
两种方法的区别:前者会在当前目录生成一个隐藏目录.repo,该目录存放了下载android源码所需的全部信息;前者下载指定工程的源码会按实际路径存放,后者只会建立工程目录,并不会建立层次路径结构。
③ 编译android源码:
初始化编译环境:#source build/envsetup.sh 或# .build/envsetup.sh
选择目标:#lunch full-eng
编译安卓源码:#make (若为四核)#make j4
④ 编译完成后,生成out目录,用来存放android源码生成的目标文件。
- out文件夹目录结构如下所示:
out/
-- CaseCheck.txt
-- casecheck.txt
-- host
-- common
-- linux-x86/darwin-x86
-- target(如果编译时候定义TARGET_STRIP_MODULE=false的话,这个目录为debug/target)
-- common
-- product
Out目录的直接子目录:host、target。
host目录主要包含编译过程中需要的一些java library,target目录中的目标文件(.jar、.so、.img等都可以在android系统上运行),host目录的结构如下所示:
out/host/
-- common
-- obj(JAVA库)
-- linux-x86/darwin-x86
-- bin(二进制程序)
-- framework(JAVA库,*.jar文件)
-- lib(共享库*.so)
-- obj(中间生成的目标文件)
out/target/generic目录包含最终要使用的目标文件(system.img、ramdisk.img、userdata.img),安卓系统中大多程序都在system目录中,包括apk应用程序。out/target/generic/system目录结构和linux根目录类似,但是android也增加了许多特有的目录,如app、media目录等。
target目录的结构如下所示:
out/target/
-- common
-- R (资源文件)
-- docs
-- obj (目标文件)
-- APPS(包含了JAVA应用程序生成的目标,每个应用程序对应其中一个子目录,将结合每个应用程序的原始文件生成Android应用程序的APK包)
-- JAVA_LIBRARIES(包含了JAVA的库,每个库对应其中一个子目录)
-- product
-- generic
-- android-info.txt
-- clean_steps.mk
-- data(存放数据的文件系统)
-- obj
-- APPS(包含了各种JAVA应用,与common/obj/APPS相对应,但是已经打成了APK包)
-- SHARED_LIBRARIES(存放所有动态库)
-- STATIC_LIBRARIES(存放所有静态库)
-- ramdisk.img(内存盘的根文件系统映像)
-- root
-- symbols
-- system(存放主要的文件系统)
-- system.img(文件系统的映像)
-- userdata-qemu.img(模拟器使用的数据文件)
-- userdata.img(数据内容映像)
其中common目录表示通用的内容,product中则是针对产品的内容。
⑤ 将apk作为安卓内置程序发布:将apk嵌入到镜像文件(如system.img):直接将apk文件复制到system/app目录下,再从system目录生成system.img文件。
⑥ 用模拟器测试生成的镜像文件(system.img):
需要一个mkyaffs2image命令行工具,将原来的system.img文件备份
然后重新生成system.img文件#mkyaffs2image system system.img
使用模拟器测试新生成的system.img文件:#emulator –avd myavd –system system.img –data userdata.img
2.linux内核源码的下载、编译
① 下载linux内核源码:
#git clone https://android.googlesource.com/kernel/common.git
进入common目录:#git branch –a 查看当前有哪些远程版本库
导出最新linux内核:#git checkout –b android-3.0 remotes/origin/android-3.0
② 安装android内核编译环境:
配置内核源码下的Makefile文件,找到ARCH、CROSS_COMPILE并设置:
“ARCH ?= arm
CROSS_COMPILE?= arm-none-linux-gnueabi-“
安装交叉编译器
准备工作:将arm-linux-gcc-4.3.2.tgz文件和arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar.bz2文件复制到工作目录。
解压编译器:
#tar zxvf(前者文件名) -C /
#tar jxvf(后者文件名-C /
验证交叉编译器是否安装成功:#ls /usr/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内核后,会在(linux内核源码根目录)/arch/arm/boot目录生成一个zImage文件。
测试linux内核:
#emulator –avd myavd –kernel /root/kernel/goldfish/arch/arm/boot/zImage
3.Android移植主要是linux内核的移植,linux内核的移植主要是linux驱动的移植。