Android源码编译调试详解

 

Android2.2 源码编译

1、编译环境

Android2.2 + Ubuntu10.04 + JDK1.5

安装必要的软件环境

sudo apt-get install git-core

sudo apt-get install gnupg

sudo apt-get install flex

sudo apt-get install bison

sudo apt-get install gperf

sudo apt-get install libsdl-dev

sudo apt-get install libesd0-dev

sudo apt-get install libwxgtk2.6-dev

sudo apt-get install build-essential

sudo apt-get install zip

sudo apt-get install curl

sudo apt-get install libncurses5-dev

sudo apt-get install zlib1g-dev

 

以上就是官方推荐的软件包,可能需要的软件包还有以下几个

sudo apt-get install make

sudo apt-get install gcc

sudo apt-get install g++

sudo apt-get install libc6-dev

sudo apt-get install patch

sudo apt-get install texinfo

sudo apt-get install valgrind

sudo apt-get install python

 

JDK1.5安装

官方声明:32位操作系统下JDK必须要用1.5的,是因为在编译Android api docs时需要1.5的。用JDK1.6必须用64位系统,当然也有解决办法,网上教程很多此处就不再一一声明。

到官网下载jdk-1_5_0_22-linux-i586.bin,目前JDK1.5的最后更新版本是JDK 5.0 Update 22,下载后得到一bin文件。命令行输入

sudo chmod u+x jdk-1_5_0_22-linux-i586.bin

sudo gnome-open /opt

然后将此文件拷贝到 /opt目录下(可自定义),进入/opt目录输入命令

sudo -s ./jdk-1_5_0_22-linux-i586.bin

一路回车,直到询问是否安装,输入yes后确认,安装完毕后配置环境变量

sudo gedit /etc/profile

在umask 022上面添加如下内容

export JAVA_HOME=/opt/Java/jdk1.5.0_22

export JRE_HOME=/opt/Java/jdk1.5.0_22/jre

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$HOME/bin

保存后关闭,再在命令行输入

sudo gedit /etc/environment

然后在文件结尾加入以下内容

export JAVA_HOME=/opt/Java/jdk1.5.0_22

export JRE_Home=/opt/Java/jdk1.5.0_22/jre

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_Home/lib

保存后关闭,然后重启电脑,验证安装,在命令行输入

java –version

javac -version

查看否是刚才所安装的JDK版本

 

2、下载Android2.2源码

安装repo脚本

在当前用户目录下新建一repo目录。在终端中执行:

mkdir repo

然后向PATH中添加repo路径

export PATH=$PATH:~/repo

然后下载repo脚本并修改可执行属性

curl https://android.git.kernel.org/repo > ~/repo/repo

chmod a+x ~/repo/repo

初始化repo

首先建立一个目录用来存放Android源代码并下载

mkdir Android2.2

cd Android2.2

repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo

注:后面加 -b froyo 就是下载指定的版本源码,froyo 就是Android2.2版本 的代号。这中间会问到你的名字和Email。如果你打算上传代码,Email须是   一个Google账户。

最后执行repo sync开始同步代码,接下来就是慢长的等待了,中间可能会   遇到断线,重新执行repo sync即可断点续传。

 

3、编译Android源码

编译生成镜像文件:make

切换到Android源码目录下,执行make命令,然后又是慢长的等待,大约   23个小时。完成后镜像文件生成在out/target/product/generic下。

Android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中,       ramdisk.imgemulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把      system userdata分别加载到 ramdisk文件系统中的system userdata目录   下。

编译SDK

make编译完成后,执行

make sdk

生成对应于该版本源代码的sdk。注意这个sdk不能用于生产环境,用于生产环境的最好用如下命令:

make PRODUCT-sdk-sdk  ###使用make sdk 会出现R文件不能自动生成的问题

SDK编译成功后会在out/host/linux-x86/sdk/ 生成sdk的文件目录和压缩包:

android-sdk_eng.用户名_linux-x86

android-sdk_eng.用户名_linux-x86.zip

并在out/target/product/genericgeneric是默认的产品名)下打包所有的映像文件:

generic-img-eng.用户名.zip

 

配置AndroidSDK环境变量在终端中执行

sudo gedit ~/.bashrc

在文件最后添加如下内容

#set android environment

export PATH=$PATH:/Android源码目录/out/host/linux-x86/bin

export ANDROID_PRODUCT_OUT=/Android源码目录/out/target/product/generic

保存后退出,在终端中同步这些设置

source ~/.bashrc

验证是否编译正确

在终端执行

emulator &

(注:可进入${ANDROID_PRODUCT_OUT}目录,后执行

emulator -image system.img -data userdata.img -ramdisk ramdisk.img)

模拟器能正常启动则表明编译成功

 

4、单模块编译

Android中的一个应用程序可以单独编译,编译后要重新生成system.img

在源码目录下执行

. build/envsetup.sh .后面有空格)

然后就多出一些命令:

- croot: Changes directory to the top of the tree. 

- m: Makes from the top of the tree. 

- mm: Builds all of the modules in the current directory. 

- mmm: Builds all of the modules in the supplied directories. 

- cgrep: Greps on all local C/C++ files. 

- jgrep: Greps on all local Java files. 

- resgrep: Greps on all local res/*.xml files. 

- godir: Go to the directory containing a file.

可以加—help查看用法

我们可以使用mmm来编译指定目录的模块,如编译联系人:

mmm packages/apps/Contacts/

编完之后生成两个文件:

out/target/product/generic/data/app/ContactsTests.apk 

out/target/product/generic/system/app/Contacts.apk

 

可以使用make snod重新生成system.img

编译所修改的代码所在模块,例如:

cd ~/android/src

mmm packages/apps/Contacts

~/android/src中运行:

cd ~/android/src

make snod

该命令生成一个新的系统映像

out/target/product/generic/system.img

将这个系统映像拷贝至sdk

out/host/linux-x86/sdk/android-sdk_eng.justin_linux-x86/tools/lib/images/

 

5、Android Eclipse中进行调试

拷贝development/ide/eclipse/.classpath到源代码根目录

启动Eclipse并新建一Java Project

选择Create project from existing source

点击Browse选择Android的源码目录然后Finish

导入时比较慢,导入完成后Android项目出错,右击工程

Build Path -- Configure Build Path -- Libraries

删除两个出错的jar

google-common_intermediates/javalib.jar

gsf-client_intermediates/javalib.jar

再添加out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar

点击OK

 

Eclipse中修改

展开packages/providers/CalendarProvider/src

展开包 com.android.providers.calendar

右键点击包com.android.providers.calendar

选择 "new file"

在对话框中选择点击  "Advanced >>" 按钮, 可以看到"Link to file in the file system" checkbox

勾选上 checkbox.  这时 "Browse..." 可用.

点击 "Browse..." 按钮

选择out/target/common/obj/APPS/CalendarProvider_intermediates/src/src/com/android/providers/calendar/EventLogTags.java

点击OK

点击 Finish (in "New File")

 

同样的方式修改com.android.providers.contacts的问题

 

调试

IDE(eclipse)中修改源代码后在shell中编译运行

源码自带编译工具

先在Adroid源码根目录执行. build/envsetup.sh 再通过m/mm/mmm进行编译

- m:    Makes from the top of the tree.

- mm:   Builds all of the modules in the current directory.

- mmm:  Builds all of the modules in the supplied directories.

 

. build/envsetup.sh #初始化

lunch 1   # 初始化模拟器等

mmm packages/providers/ContactsProvider/

#mm/mmm来编译生成的.apk并不会打包到system.img

#可以使用make snod将模块打包到system.img中,也可以使用 adb install -r *.apk安装

注:通过mmm packages/providers/ContactsProvider/ 编译后的apk out/target/product/generic/system/app

emulator & #启动Android模拟器

ddms &     #调试工具

 

你可能感兴趣的:(Android源码)