Ubuntu14.04 Android(安卓)源码编译
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-versionjavaversion"1.7.0_79"
Java(TM)SERuntimeEnvironment(build1.7.0_79-b15)
JavaHotSpot(TM)64-BitServerVM(build24.79-b02,mixedmode)
为了切换到 Jdk 1.6,我们修改一下系统配置文件,执行 sudo gedit /etc/profile,打开系统配置文件。把之前的 JAVA_HOME 注释掉,再给新的 JAVA_HOME 赋值为 Jdk 1.6 的安装路径,如下: #exportJAVA_HOME=/home/lion/storm/jdk1.7/jdk1.7.0_79
exportJAVA_HOME=/home/lion/storm/jdk1.6/jdk1.6.0_45
exportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANDROID_NDK:$PATH
exportCLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
保存退出,然后执行命令 source /etc/profile 重新加载环境变量。然后再次执行 java -version,这回就切换到 Jdk 1.6 了,打印如下 lion@lo:/etc/alternatives$java-version
javaversion"1.6.0_45"
Java(TM)SERuntimeEnvironment(build1.6.0_45-b06)
JavaHotSpot(TM)64-BitServerVM(build20.45-b01,mixedmode)
三、 进入 Android 源码根目录,执行 make 命令进行编译
编译过程中可能会出现一些错误,通常是缺少必要的依赖库,直接安装它们就行了,如 1. fatalerror:X11/Xlib.h:Nosuchfileordirectory(因为缺少必要的库) 解决方法: $sudoapt-getinstalllibx11-dev
2. /usr/bin/ld:cannotfind-lreadline
解决方法:sudo apt-get install libreadline6-dev lib32readline6-dev
在配置正确的情况下,错误是非常少的,如果你编译的过程中频频出错,那肯定是配置有问题。编译完成后会出现以下提示,说明编译成功 Generated:(out/target/product/generic/android-info.txt)
Targetsystemfsimage:out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
Installsystemfsimage:out/target/product/generic/system.img
Targetramdisk:out/target/product/generic/ramdisk.img
Targetuserdatafsimage:out/target/product/generic/userdata.img
Installedfilelist:out/target/product/generic/installed-files.txt
我们还需要设置一下环境变量,才能运行模拟器,执行命令 gedit ~/.bashrc,在打开的文件末尾添加 exportANDROID_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
exportPATH=$PATH:$ANDROID_PRODUCT_OUT_BIN:$ANDROID_PRODUCT_OUT;
保存退出,执行 source ~/.bashrc 使修改立即生效,然后就可以到 ../out/target/product/generic 目录执行命令启动模拟器了,启动命令如下 emulator-systemsystem.img-datauserdata.img-ramdiskramdisk.img (后边的 *.img 是启动模拟器需要的依赖文件),然后就可以看到模拟器启动起来了。
更多相关文章
- android activity的全新解析
- 2.Eclipse版本android 65535解决方案(原理等同android studio现
- 我的第一个Android升级版本
- Android(安卓)Studio ADB not responding. If you'd like to ret
- Android中为什么主线程更新UI,子线程执行耗时操作?
- 在Android(安卓)P版本中加入Face Unlock相关功能的讲解
- Android之Handler总结与Timer和TimerTask详解
- Android它Service
- Android(安卓)实现高斯模糊效果及低版本兼容