本文是对《Android深度探索-HAL与驱动开发》中关于此章节的总结,记录自己学习的点点滴滴。
Android源代码包含了很多东西,如内嵌在Android系统中的应用程序
(拍照、计算器、日历、拨号器等)源码、Android SDK带的各种工具
源码、Android NDK源码、HAL源码等等,所以Android源码包非常大。
---源码下载
/*配置下载环境*/
创建一个用于存放下载脚本文件repo的目录(该脚本文件可以存放
到任意目录中,一般使用~/bin)
1)
#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
repo文件实际上是用Python脚本对git的封装,主要是为了简化下载
Android源代码的操作。
3)创建存放Android源码目录
#mkdir android
#cd android
4)执行初始化
#repo init -u
https://android.googlesource.com/platform/mainfest
上面的代码要求repo下载最新的源码,也就是master分支。如果想下
载其他分支,可以使用如下命令。
#repo init -u
https://android.googlesource.com/platform/mainfest -b xxxxx(其他)
5)开始执行下载
#repo sync
根据网速和机器配置的不同这个过程会持续不同的时间起码几个小时吧
PS:Android源码repo下载方式不是必须的,只要有可用的源码包,何必下载呢?
解压之后直接用也是不错的方式。
---Android源代码目录结构分析
目录名 源码目录含义
abi | 应用程序二进制接口 application binary interface
bionic | C/C++运行时库,在NDK程序中很大一部分调用的就是此处程序
bootable | 用于Android装载和启动程序,其中包含著名的bootloader和recovery。
bootloader在Linux内核启动之前启动,用来初始化硬件、建立映射等等
recovery可以讲一个压缩包中文件覆盖到手机内存中系统目录的程序
(刷机程序)
build | 用于编译Android源码以及建立system.img、ramdisk.img等文件的工具。
cts | 用于兼容性测试的工具
dalvik | Dalivk虚拟机的源代码
development 高层的开发和调试工具
device | 与设备相关的代码。其中包含了motto、三星的设备相关代码
docs | Android源代码项目的文档和工具
external | 扩展工具的源代码
frameworks Android框架层代码。也就是Android SDK的源代码
hardware | 硬件接口层和库。HAL的源代码就在此处
libcore | Java核心库
ndk | NDK的相关代码
packages | 与Android系统一同发布的应用程序源代码
prebuilts | Android在各种平台下编译之前要使用的工具
sdk | 在开发环境中使用的工具,如DDMS、draw9patch、sdkmanager等
system Android的基本系统
/*在prebuilts文件夹下边果然有部分编译工具~~*/
---编译Android源码
/*初始化编译环境*/
在Linux终端下执行
#source build/envsetup.sh envsetup.sh脚本主要来初始化一些编译命令如mm.
mmm等。
envsetup.sh中定义了一些shell函数,当使用source命令之后,就可以在Linux终端
下执行这些命令函数。mm和mmm都可以编译Android源代码中指定的工程,他们
的区别是mm命令必须进入指定工程的目录进行编译,而mmm可以在Android可以
在源码树下任何一级目录编译任意指定的工程,只要指定路径即可。
例如:
1)#cd ~/android/android2.3.4_src
#source build/envsetup.sh
#cd packages/apps/calculator
#mm
2)#cd ~/android/android2.3.4_src
#source build/envsetup.sh
#mmm packages/apps/calculator
/*选择编译目标*/
使用lunch命令编译制定目标
full-eng | 针对所有移动设备,Android模拟器有效,打开所有调试选项
当不能确定或者忘记具体目标的时候可以在命令行上只输入lunch进行运行
会提示处多种目标选项,从其中选择合适的目标进行编译即可。
3)#make 如果拥有多核、多线程、超线程的PC那么可以附带-jn参数,这样可以加快
编译速度。例如#make -j4 编译的过程也是一个漫长的等待。~~
---out目录结构分析
out目录是存放编译Android源代码生成的目标文件的默认目录。
|--host/ 编译过程中需要的一些库和工具
out--|
|--target/ ~/common主要包含Android系统Java库。~/generic包含目标文件system.img等
---将apk内置发布
将apk嵌入system.img中,这样apk就和原生系统的app一样内置,非root无法卸载。
1)将apk嵌入/out/target/product/generic/的system/app文件中,然后重新打包生成system.img
2)因为系统自带的app不管有apk文件而且还有对应的odex文件,我们也可以将app源码
放到Android源码包中重新编译app,这样就会在system/app目录底下生成app的apk和odex
然后重新打包system.img。
重新打包system.img,可以使用out/host/linux-x86/bin目录下的mkyaffs2image命令行工具,或者
执行make snod打包
---下载和编译Linux内核源代码
从刚才的Android源码树也可以看到确实没有和Linux相关的文件夹,OK,原来内核是单独添
加进去的,而且这个Linux内核是经过Google修改后的,不是linux.kernel.org的原生内核
从Google下载Linux内核、解压后,配置内核,然后进行编译。
---总结:
Android移植主要是Linux内核的移植。而Linux内核移植主要是Linux驱动的移植,所以本文概述
了Android源码的编译和Android内Linux内核的编译。