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命令,然后又是慢长的等待,大约 要2-3个小时。完成后镜像文件生成在out/target/product/generic下。
Android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,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/generic(generic是默认的产品名)下打包所有的映像文件:
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 & #调试工具