android编译与调试

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 编译问题处理

见: Android编译问题汇总

3.3 扩展内容

本节与编译本身并无关系, 只是对编译出来的内容做一些扩展说明, 如果只是想了解编译调试过程, 可以跳过本节.

3.3.1 android文件系统的结构

android源码编译后在out/target/product/generic下得到system.img,ramdisk.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

说明:

启动带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

5 参考资料

http://www.61ic.com/Mobile/Android/201104/32906.html