在 VMWare 7.1.2 + Ubuntu 11.10(32位)中,编译 Android 2.3.7 (gingerbread) 源码 (Anroid Open Source Project)

3 篇文章 0 订阅
2 篇文章 0 订阅

在 VMWare 7.1.2 + Ubuntu 11.10(32位)中,编译 Android 2.3.7 (gingerbread) 源码 (官方 Anroid Open Source Project)

我参照了官方网页和网上的许多教程,遇到问题再Google寻找解决方法,官方网页链接如下:
http://source.android.com/source/initializing.html

 

一. 下载和安装 JDK

由于我要编译的是 gingerbread 版本的源代码,所以需要下载 JDK6。
(JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older. )

有两种下载方法,一种是通过官方网站下载JDK6的安装包,还有一种是通过在 Linux 终端中执行命令:
$sudo apt-get install sun-java6-jdk or $sudo apt-get install openjdk-6-jdk
我用的是前一种(参考: http://forum.ubuntu.org.cn/viewtopic.php?t=183803),用后一种的话可以参考官方网页。

1. 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
我下载的是: Java SE 6 Update 30 (JDK6),进入下载列表页选择对应的 linux 版:(jdk-6u30-linux-i586.bin)

2. 修改为可执行权限:sudo chmod u+x /home/liqing/download/jdk1.6.0_30.bin

3. 执行:sudo /home/liqing/download/jdk1.6.0_30.bin

4. 配置环境变量,然后注销重登录:
sudo vi /etc/environment
PATH="......:/home/liqing/download/jdk1.6.0_30/bin"
CLASSPATH=.:/home/liqing/download/jdk1.6.0_30/lib
JAVA_HOME=/home/liqing/download/jdk1.6.0_30

// 当然也可以在 ~/.bashrc 中配置环境变量,然后执行 $. ~/.bashrc 使配置生效,这样做不需要重启或注销。

5. 输入命令检查Java版本: $java -version or $javac -version

// 以下步骤不是必须,如果第5步发现刚安装的 jdk6 没有生效,则执行以下步骤:

6. 由于ubuntu中可能会有默认的jdk,如openjdk,为了使用刚安装的 jdk6,需要先将jdk6加入java选单:
update-alternatives --install /usr/bin/java java /home/liqing/download/jdk1.6.0_30/bin/java 300
update-alternatives --install /usr/bin/javac javac /home/liqing/download/jdk1.6.0_30/bin/javac 300

7. 设为系统默认的jdk:
update-alternatives --config java

再重复第5步,检查安装的jdk6是否生效。


二. 安装编译所需要的软件包

1. 下载和安装所需的软件包,参照官网:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
  x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
  libxml2-utils xsltproc

2. On Ubuntu 11.10:
$ sudo apt-get install libx11-dev:i386

3. 有个依赖包 lib32readline5-dev 已经被废弃了,但是可以用lib32readline-gplv2-dev替代。
参考:http://guoh.org/lifelog/2012/04/build-android-on-ubuntu-11-10-x64/


三. 配置 USB 使用权

1. 使用 root 权限创建文件 :
$sudo vi /etc/udev/rules.d/51-android.rules"

2. 由于我是 HTC Desire (G7) 手机,因此添加以下内容,保存后退出:
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666"
// 其他手机可参考:http://developer.android.com/guide/developing/device.html

3. 设置所有用户读权限:
$ sudo chmod a+r /etc/udev/rules.d/51-android.rules


四. 设置 ccache
(This works very well if you do "make clean" often, or if you frequently switch between different build products.
)

1. 在 ~/.bashrc 中添加:
export USE_CCACHE=1

可选添加:export CCACHE_DIR=~/.ccache

2. 执行:$source ~/.bashrc  (source 可以用 . 代替)


五. 下载源码

1. 安装 repo 工具/脚本(repo是使用 git 的辅助工具):
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

2. 初始化 repo和下载源码:
$ mkdir ~/android
$ cd ~/android

/*
$ repo init -u https://android.googlesource.com/platform/manifest -b gingerbread
$ repo sync
*/

3. 我的下载过程经常提示错误:connection reset by peer.
经搜索查证,最后在官网找到答案:由于我是在虚拟机中下载源码,虚拟机使用了NAT网络模式,在 google 服务器看来,我的ip地址和很多人相同,因此要用授权方式下载,授权方法见: http://source.android.com/source/downloading.html

4. 重新执行
$ repo init -u https://android.googlesource.com/a/platform/manifest -b gingerbread
$ repo sync

5. 验证 Git 标签
$ gpg --import
//参阅官网拷入 key

6. 安装 ccache
(The suggested cache size is 50-100GB. You will need to run the following command once you have downloaded the

source code.)

$ prebuilt/linux-x86/ccache/ccache -M 20G
// 我没给虚拟机分配太大空间,因此这里指定为 20G。


六. 编译源码

确定当前所在路径仍然为:~/android

1. 初始化编译环境
$ source build/envsetup.sh or $ . build/envsetup.sh

2. 选择编译目标
$ lunch full-eng

3. 编译源码
$ make -j2
// jN: N 是 CPU个数*每CPU的Core数*每Core的线程数,我的是单CPU双核,每核双线程,可以用-j4,但是担心在虚拟机中资源有限CPU会过热,因此用-j2

4. 编译碰到错误:
frameworks/base/libs/utils/RefBase.cpp:507:67: 错误: 将‘const android::RefBase::weakref_impl’作为‘void

android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’实参时丢弃了类型限定 [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 错误 1
make: *** 正在等待未完成的任务....

解决方法1:
这是因为gcc版本过高的问题,改成4.4之后就好了,注意g++的版本要和gcc一致,否则会出错。
1) sudo apt-get install gcc-4.4
2) sudo rm /usr/bin/gcc
3) sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc

4) sudo apt-get install g++-4.4
5) sudo rm /usr/bin/g++
6) sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++

解决方法2:
编译源码时指定编译器版本,参考:http://guoh.org/lifelog/2012/04/build-android-on-ubuntu-11-10-x64/
1) 安装 gcc-4.4 和 g++-4.4
2) make CC=gcc-4.4 CXX=g++-4.4 -j2

5. 编译若碰到其他错误,可参考:
http://blog.csdn.net/sunboy_2050/article/details/6977386

6. 编译完成后,会生成一个 ~/android/out 文件夹,里面有三个文件夹:host,target和temp。host是在PC上运行的(如SDK,

emulator等),target是在目标板上运行的。target/product/generic里有三个文件:system.img 、userdata.img、ramdisk.img。
(参考:http://blog.csdn.net/htttw/article/details/6783604)

7. 运行模拟器测试
$emulator

如果不行,可以这样:
1) 增加环境变量
$ vi ~/.bashrc
export ANDROID_PRODUCT_OUT=~/android/out/target/product/generic
ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x86/bin
export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}
$ source ~/.bashrc

// emulator 在 ~/android/out/host/linux-x86/bin 下

2) 运行模拟器
$ cd ~/android/out/target/product/generic
$ emulator -system system.img -data userdata.img -ramdisk ramdisk.img -partition-size 100

8. 运行 Android SDK and AVD Manager
(参考:http://blog.csdn.net/htttw/article/details/6783173)

$ cd ~/android/out/host/linux-x86/bin
$ ./android

1) 提示没有设置ANDROID_SWT,添加如下环境变量:
$ vi ~/.bashrc
export ANDROID_SWT=~/android/out/host/linux-x86/framework
$ . ~/.bashrc

2) 提示 Error: Error parsing the sdk.
Error: /home/liqing/android/out/host/linux-x86/platforms is missing.

Error: /home/liqing/android/out/host/linux-x86/add-ons is missing.
解决方法很简单,只要在相应路径下新建 platforms 和 add-ons 文件夹即可

我运行模拟器时,一直停留在黑屏的界面,我想用 Android SDK and AVD Manager (android 命令)更新 ADT 并创建 AVD,总是不成

功,更新过程中程序退出,于是改成编译 sdk 并用 sdk 中的 android 命令来更新 ADT 和创建 AVD,成功。只是这样创建的模拟器

感觉并不是使用从源码编译得来的 sdk。
(参考:http://blog.163.com/zhaolin53636848@126/blog/static/49086668201211210853358/)


七. 编译 ADT
(参考:http://tc.itkee.com/developer/detail-190.html,ADT是在 eclipse 下开发 Android 程序的插件)

1) 下载 eclipse,配置环境变量:
// 注意:android 2.3.7 源码对应的 eclipse 版本为 Galileo,要下载 for JavaEE 的

$ vi ~/.bashrc
export ECLIPSE_HOME=~/download/eclipse
$ . ~/.bashrc

2) 在 android 根目录下(~/android),初始化编译环境
$ . build/envsetup.sh

3) 进入编译脚本所在目录:
$cd ~/android/sdk/eclipse/scripts

4) 编译:
$ mkdir ~/adt
$ ./build_server.sh /home/liqing/adt (要用绝对路径)


八. 编译 SDK

1) 在 android 根目录下(~/android),初始化编译环境
$ . build/envsetup.sh

2) 编译 SDK
$ make PRODUCT-sdk-sdk

// 不要用 $ make sdk,这样编出来的 sdk 在 eclipse 里不能用。

3) 备份 ~/android/out/host/linux-x86/sdk 到其他目录,因为以后编译模块会删除sdk。

4) 创建 sd 卡映像
$ cd ~/android/out/host/linux-x86/sdk/android-sdk_eng.liqing_linux-x86/tools
$ mksdcard 512M sdcard.img

5) 运行 Android SDK and AVD Manager,更新sdk
$ ./android

6) 创建AVD
$ ./android create avd -t 2 -n oneand --sdcard sdcard.img

7) 查询创建的 AVD
$ ./android list avd

8) 启动模拟器
$ ./emulator -avd oneand


九. 编译模块
参考:
http://www.devdiv.com/home.php?mod=space&uid=83792&do=blog&id=4026 (使用eclipse基于android源码做开发)
http://hualang.iteye.com/blog/1141315 (各种模块的编译)
http://mengcong.info/android/android%E4%B8%AD%E5%86%99cc%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F.html (一个例子)
http://www.aton.com/android-native-development-using-the-android-open-source-project/ (ping工程转成myping工程)

// 如果编译自己的可独立运行的C程序,push 到模拟器后,执行时提示:
android Syntax error: "(" unexpected
or
android Syntax error: "&" unexpected

1) 可能是终端环境不对,需要将终端换成 bash:
* 执行 $ ls -la /bin/sh命令,如果输出如下:
rwxrwxrwx 1 root root 4 2010-02-10 17:14 /bin/sh -> dash
* 执行 $ sudo dpkg-reconfigure dash 命令修改sh版本,并选择“否”;

2) 可能是权限问题,
* 进入 adb shell,执行# mount -o remount,ro -t yaffs2 /data/samples,将文件夹挂载为可读写

* 执行 $ adb shell chmod 777 /data/samples,改变文件夹访问权限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值