http://www.mikewootc.com/wiki/android/basic/compiledebug.html
date: 2013.05.30; modification:2014.02.18
目录:
本文介绍的内容是给予repo下载到的https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
的.
1 安装环境
sudo apt-get install --force-yes -y git-core gnupg flex bison gperf build-essential
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386
libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
2 下载源代码
下载repo:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
初始化repo:
如果是默认:
repo init -u https://android.googlesource.com/platform/manifest
如果指定某个分支:
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
利用repo下载源代码:
repo sync
3 编译
3.1 完全编译
. build/envsetup.sh
lunch full-eng
make
编译完之后生成的内容在:
out/target/product/generic
3.2 编译问题处理
3.3 扩展内容
本节与编译本身并无关系, 只是对编译出来的内容做一些扩展说明, 如果只是想了解编译调试过程, 可以跳过本节.
3.3.1 android文件系统的结构
android源码编译后在out/target/product/generic下得到system.img,ramdisk.img,userdata.img映像文件. 其中:
- ramdisk.img是emulator的文件系统
- system.img包括了主要的包, 库等文件
- userdata.img包括了一些用户数据
emulator加载这3个映像文件后, 会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下. 因此, 我们可以把ramdisk.img里的所有文件复制出来, system.img和userdata.img分别解压到 ramdisk文件系统中的system和 userdata目录下.
3.3.2 分离android文件系统出来
system.img,ramdisk.img,userdata.img映像文件是采用cpio打包, gzip压缩的, 可以通过file命令验证:
file ramdisk.img
Android源码编译后除了生成system.img, userdata.img之外还生成system和 userdata文件夹, 因此不需要解压它们. Android源码编译后还生成root文件夹, 其实root下的文件与 ramdisk.img 里的文件是一样的, 不过这里还是介绍怎样把 ramdisk.img解压出来: 将ramdisk.img复制一份到任何其他目录下, 将其名称改为ramdisk.img.gz, 并使用命令
gunzip ramdisk.img.gz
然后新建一个文件夹, 叫ramdisk吧, 进入, 输入命令
cpio -i -F ../ramdisk.img
这下, 你就能看见并操作ramdisk里面的内容了.
然后把Android源码编译后生成的system和 userdata里的文件复制到 ramdisk/system和 ramdisk/userdata下. 这样就得到一个文件系统了.
3.3.3 system.img 和 userdata.img
这两个镜像都属于yaffs2文件格式, 生成方式是一样的. 我们就以 system.img为例来说明.
System.img --> system目录树
所需工具unyaffs, 下载地址 http://code.google.com/p/unyaffs/downloads/list
mkdir system
cd system
unyaffs ../system.img
system目录树 >> system.img
所需工具 mkyaffs2image, Android源码编译后会生成该工具, 在 out/host/linux-x86/bin 目录下. 命令格式:
mkyaffs2image system/ system_new.img
4 调试
4.1 启动默认配置模拟器
在上述源码编译的环境下, 运行:
emulator
即可以按照默认配置启动模拟器.
注意: 由于上述的编译并没有把emulator等可执行文件安装到linux的默认查找路径, 所以必须在上述make的终端环境下键入emulator命令才能找到, 因为make之前配置了环境变量. 如果需要在其他环境下运行该命令, 可以手动键入路径或者将其加入linux的PATH环境变量. 其路径在:
out/host/linux-x86/bin/
如果该路径下找不到, 可以在编译环境下用echo $PATH来自行查找.
4.2 启动自定义配置的模拟器
4.2.1 使用sd卡
创建sdcard镜像
out/host/linux-x86/bin/mksdcard -l sdcard 512M myemulator/sdcard.img
说明:
- 512M: 是随意指定的大小(最小9M), 这里指定多大, 最后创建出来的镜像就占多少磁盘空间, 所以要斟酌自己的磁盘空间.
- myemulator/sdcard.img: 是自己随便指定的路径.
启动带sdcard的模拟器
emulator -sdcard myemulator/sdcard.img
关于emulator命令的详细使用请见: Android emulator命令详解
4.2.2 指定存储大小
out/host/linux-x86/bin/emulator-x86 -memory 512 -partition-size 512
x86_4.0.3_api15 -sdcard out/target/product/generic_x86/sdcard.img
说明: * -memory 是RAM大小 * -partition-size 是本机ROM大小
4.3 logcat
- logcat -c 清除已有log信息
- logcat -b
- logcat -b main 显示主缓冲区的log
- logcat -b radio 显示无线缓冲区的log
- logcat -b events 显示事件缓冲区的log
- logcat -f [filename] 将log保存到指定的文件中, 例如 logcat -b radio -f /data/radio.log
- logcat -v 设置logcat输出的格式. 主要有7种输出格式:
- brief — Display priority/tag and PID of originating process (the default format).
- process — Display PID only.
- tag — Display the priority/tag only.
- thread — Display process:thread and priority/tag only.
- raw — Display the raw log message, with no other metadata fields.
- time — Display the date, invocation time, priority/tag, and PID of the originating process.
- long — Display all metadata fields and separate messages with a blank lines.
比较常用的是显示时间:logcat -v time &
- logcat -g 查看缓冲区的大小
- logcat -g main
- logcat -g radio
-
logcat -g events
5 参考资料
http://www.61ic.com/Mobile/Android/201104/32906.html