编译Android源码
编译android源码需要安装一些工具(Ubuntu12.10):
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" #安装jdk
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
$ sudo apt-get install git 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 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
$ export USE_CCACHE=1 #使用ccache
下载源码:
$ mkdir ~/bin #创建目录
$ PATH=~/bin:$PATH #加入环境变量PATH $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo #下载工具repo $ chmod a+x ~/bin/repo #赋执行权限 $ mkdir WORKING_DIRECTORY #创建工作目录 $ cd WORKING_DIRECTORY $ repo init -u https://android.googlesource.com/platform/manifest #checkout最新代码 或者使用下面的命令 $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 #checkout分支 $ repo sync #同步代码,这个时间比较长
android代码比较大,一般都有几G大小。下载android源码最痛苦的就是,你辛辛苦苦的下载配置完各种环境和工具,发现代码下载不了(被墙了)。我就遇到了这种情况。可以使用VPN或者代理工具来下载。我最终使用了GoAgent工具把源码下载了下来。GoAgent的使用可以参考:http://daemon369.github.io/network/2013/08/11/use-goagent/ 或者GoAgent官网:https://code.google.com/p/goagent/ 。
$ source build/envsetup.sh #初始化一些环境变量 $ lunch full-eng #编译代码 $ sudo make -j6 #编译代码
编译完成后,运行模拟器:
$ emulator #使用默认配置 $ emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system ./out/target/product/generic/system.img -data ./out/target/product/generic/userdata.img -ramdisk ./out/target/product/generic/ramdisk.img #指定使用的img文件
注意:
1.编译代码的过程中遇到了一些编译错误,在网上搜索,很多人给出了各种修改文件的方法。最终发现,其实是gcc和g++的版本的问题。我编译android2.3.3源码,把gcc和g++降级到4.4,就解决了很多问题:
$ sudo apt-get install gcc-4.4 g++-4.4 gcc-multilib g++-4.4-multilib #安装低版本gcc g++ $ cd /usr/bin $ sudo rm gcc g++ #删除之前的链接文件 $ sudo ln -s gcc-4.4 gcc #建立链接 $ sudo ln -s g++-4.4 g++
2.遇到如下编译错误:
host C: sqlite3 <= external/sqlite/dist/shell.c external/sqlite/dist/shell.c:42:32: error: readline/readline.h: No such file or directory external/sqlite/dist/shell.c:43:31: error: readline/history.h: No such file or directory
解决办法:
dpkg -l | grep readline
找出库libreadline6-dev删除
sudo apt-get remove libreadline6-dev
3.安装了Android SDK或者NDK,设置的环境变量可能会影响编译,需要在$PATH中去除SDK和NDK的路径,同时去除环境变量:
$ unset NDK_ROOT $ unset ANDROID_SDK_ROOT
4.repo使用代理,设置环境变量:
$ export HTTP_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>
$ export HTTPS_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>
参考: