一、安装设置 gcc、g++ 版本
Ubuntu 系统使用的 gcc、g++ 版本随着发布版本的不同而不同,在编译 Android 系统时不同的版本应该用相应版本的
gcc、g++ 去编译。因为每次 gcc、g++ 的版本升级,其语法规则都可能发生一些改变,所以在用高版本的 gcc、g++ 编译低版本的 Android 系统时,会有语法不兼容的现象,从而导致编译无法进行(会出现很多改不完的错误)。我的系统是 Ubuntu 14.04。
我们可以通过 gcc -v 命令查看一下 Ubuntu 默认安装的 gcc 版本,执行命令 gcc -v 查看 gcc 版本。打印结果如下
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
默认情况下,Ubuntu 是不会自动安装低版本的 gcc、g++ 版本的,如果我们想使用 gcc4.4 怎么办?首先看看有没有安装 gcc4.4,执行命令 ls /usr/bin/gcc*
结果只有 /usr/bin/gcc /usr/bin/gcc-4.8 两个,没有 gcc-4.4,所以要先给它安装上去,执行安装命令
sudo apt-get install gcc-4.4
再查看一下系统已安装的 g++ 版本,执行命令 ls /usr/bin/g++*,结果发现只有 /usr/bin/g++ /usr/bin/g++-4.8 两个,要先安装它,执行安装命令
sudo apt-get install g++-4.4
安装好后执行下面的命令,修改各版本的优先级:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40
(后面跟的数字 40、50 表示优先级,值越大优先级越高)
接着执行下面的命令,修改系统默认使用的 gcc 版本:
sudo update-alternatives --config gcc
会看到如下的信息:有两个候选项可用
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gcc-4.4 40 auto mode
1 /usr/bin/gcc-4.4 50 manual mode
* 2 /usr/bin/gcc-4.8 40 manual mode
要维持当前值[*]请按回车键,或者键入选择的编号,要想用哪个版本的 gcc 就输入它对应的编号(输入 1 切换到 gcc-4.4 版本)。
类似的,设置一下默认的 g++ 版本
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 40
接着执行命令 sudo update-alternatives --config g++,打印结果如下
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/g++-4.4 40 auto mode
1 /usr/bin/g++-4.4 50 manual mode
* 2 /usr/bin/g++-4.8 40 manual mode
然后输入 1 切换到 g++-4.4 版本。
如果想删除可选项的话可以执行如下指令:
sudo update-alternatives --remove gcc /usr/bin/gcc-4.5
重新设置完成后,可以执行 gcc -v 命令来看一下版本是否改变了。
二、安装设置 Java Jdk
(所有版本的 Jdk 官方下载地址 http://www.oracle.com/technetwork/java/javase/archive-139210.html)
由于我 Ubuntu 上安装了多个版本的 Java Jdk,所以还要修改一个默认的 Jdk 版本,Android 2.3 需要的 Jdk 版本是 1.6。先执行一下 java -version 命令,查看一下当前系统默认使用的版本,发现当前系统使用的版本是 Jdk 1.7 的,如下
lion@lo:~/storm/android-dev/android2.3/android-2.3.7_r1$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
为了切换到 Jdk 1.6,我们修改一下系统配置文件,执行 sudo gedit /etc/profile,打开系统配置文件。把之前的 JAVA_HOME 注释掉,再给新的 JAVA_HOME 赋值为 Jdk 1.6 的安装路径,如下:
export JAVA_HOME=/home/lion/storm/jdk1.7/jdk1.7.0_79
export JAVA_HOME=/home/lion/storm/jdk1.6/jdk1.6.0_45
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANDROID_NDK:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
保存退出,然后执行命令 source /etc/profile 重新加载环境变量。然后再次执行 java -version,这回就切换到 Jdk 1.6 了,打印如下
lion@lo:/etc/alternatives$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
三、 进入 Android 源码根目录,执行 make 命令进行编译
编译过程中可能会出现一些错误,通常是缺少必要的依赖库,直接安装它们就行了,如
-
fatal error: X11/Xlib.h: No such file or directory(因为缺少必要的库)
解决方法:$sudo apt-get install libx11-dev
-
/usr/bin/ld: cannot find -lreadline
解决方法 : sudo apt-get install libreadline6-dev lib32readline6-dev
在配置正确的情况下,错误是非常少的,如果你编译的过程中频频出错,那肯定是配置有问题。编译完成后会出现以下提示,说明编译成功
Generated: (out/target/product/generic/android-info.txt)
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
Installed file list: out/target/product/generic/installed-files.txt
我们还需要设置一下环境变量,才能运行模拟器,执行命令 gedit ~/.bashrc,在打开的文件末尾添加
export ANDROID_PRODUCT_OUT=/home/lion/storm/android-dev/android2.3/android-2.3.7_r1/out/target/product/generic
ANDROID_PRODUCT_OUT_BIN=/home/lion/storm/android-dev/android2.3/android-2.3.7_r1/out/host/linux-x86/bin
export PATH=$PATH:$ANDROID_PRODUCT_OUTBIN:$ANDROID PRODUCT_OUT;
保存退出,执行 source ~/.bashrc 使修改立即生效,然后就可以到 ../out/target/product/generic 目录执行命令启动模拟器了,启动命令如下
emulator -system system.img -data userdata.img -ramdisk ramdisk.img
(后边的 *.img 是启动模拟器需要的依赖文件),然后就可以看到模拟器启动起来了。