ubuntu12.04下安卓编译环境搭建总结

前言:

因为工作需要,经常要编译安卓下的动态库,公司有已经搭建好环境的服务器,但是第一自己想自己搭建一下了解一个整个过程,另外,公司的服务器也经常出现问 题,导致编译不了,所以就想自己搭建环境。开始是在公司自己的电脑上装了一个unbuntu的虚拟机,然后在网上找了一个攻略,开始搭建环境。但是一直卡 在源码下载那一块,每次源码下载都出错,如后面问题1所描述。断断续续,都是工作之余抽空弄一弄,但是始终下载不成功,我以为是公司网络的问题,网络不稳 定,所以下载老失败。本来想多试几次,想想总有一次会下载成功吧,但是一个多星期过去,一直都没成功,后来没耐心了,就搁置没管了。

过了一个多星期,一个同事申请了一个台式机开始装ubuntu,我突然心血来潮,想在自己家里电脑上装个unbuntu玩玩,然后回家就开始 装双系统。这里我要吐槽一个万恶的微软,我的机器原本装的是win7,当时装的时候就想着以后装双系统晚点在装个linux,所以预留了80G的空间。但 是我装unbuntu的时候发现,它只能检测我有两个盘,一个c盘和一个d盘。我怎么也想不明白,我明明有c,d,e,f四个盘,现在我把f盘删除,那也 应该有三个盘和80G的剩余空间啊。最后才发现,是基本分区和动态分区的问题,如果装win7的时候它自动给我弄成动态分区了(所谓动态分区就是说盘符的 容量可以动态修改而不用格式化的,当时装系统的时候不明白,也没注意到这个问题),动态分区不适合装双系统,你看到的是四个盘,实际上只有二个盘。在网上 查了很多资料,想在不损坏已有数据的情况下将动态分区转换成静态分区,网上很多人说不能转,但还是不死心,终于找到一个可以无损将动态分区转换成静态分区 的软件,兴奋地下载下来,转换。重启电脑,悲剧发生了,找不到引导文件,系统启动不了了。没办法,只能重装win7,好了重装win7以后发现其它几个盘 的东西还在,而且确实变成静态分区了(我觉得应该是我操作有问题,这款软件还是很强大的)。装完ubuntu,不知道干啥,就想着把安卓编译环境搭建起 来。废话太多了,看看下面的编译过程以及遇到的问题吧。

源代码下载以及编译:

在http://source.android.com/source/initializing.html网站上,有详细的步骤,我的系统是ubuntu12.04,所以下面给出的编译都是针对该系统,如果你的系统不一样,请参考该网站上针对其他系统的环境搭建方法。

1. 工具安装

$ sudo apt-get install git-core 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 openjdk-6-jdk 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

这一步基本没有遇到问题,很顺利。

2. 源码下载

$ mkdir ~/bin

$ PATH=~/bin:$PATH

$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

$ chmod a+x ~/bin/repo

$ mkdir androidsource

$ cd androidsource

如果你想下载当前最新的版本,那么:

$ repo init -u https://android.googlesource.com/platform/manifest

如果你想下载某个特定的版本,那么:(我下载的就是4.0的)

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

这一步会要求你输入用户名以及一个邮箱,输入就行了,我感觉这个邮箱好像也没啥用。

$ repo sync

这一步会花很长时间,请保证你的网络一直有效,另外我遇到下面的问题1,你可以先看看,以避免这个问题。

3. 编译

$ source build/envsetup.sh

$ lunch full-eng

$ make -j4

这一步遇到问题2和3.

这一步具体要多长时间我也不确定,我是晚上睡觉之前让它编的,第二天早上编译完成,最后大处的信息如下:

注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。

target Java: CtsAccountManagerTestCases (out/target/common/obj/APPS/CtsAccountManagerTestCases_intermediates/classes)

注意:某些输入文件使用或覆盖了已过时的 API。

make: *** [out/target/common/obj/APPS/android.core.tests.libcore.package.com.no- core-tests-res_intermediates/noproguard.classes-with-local.dex] 已杀死

make: *** 正在等待未完成的任务....

不确定是不是有错误,但是我发现不影响我编译动态库,所以就没管它。

4.编译动态库或静态库

进入目录:

>> cd ~/androidsource/out/target/product/generic

在这个目录下新建一个文件夹,如driver,然后可以在这个目录下创建你的c程序,编译动态库。

这里我举一个很简单的例子,新建一个c文件,实现add(int a,int b)功能。

(1).c文件如下:

#include

int add(int a,int b)

{

return (a+b);

}

(2)再新建一个Android.mk文件,注意这个文件名不能改,如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:= helloworld

LOCAL_SRC_FILES := hello.c

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_PATH = $(LOCAL_PATH)

include $(BUILD_SHARED_LIBRARY)

(3)配置环境

回到源码目录:

>> cd ~/androidsource

>> source build/envsetup.sh

>> lunch full-eng

回到动态库目录:

>> ~/androidsource/out/target/product/generic/driver

编译:

>> mm

编译完成以后会在当前目录下生成helloword.c,然后你就可以在安卓的其它地方调用该库了。

当然,你如果想在Android App中调用该库,那么借口函数的名字必须修改,这个就是另外一个问题了,这里就不详述了。

遇到的错误以及解决方法:

1. 错误:fatal: HTTP request failed

这个问题也困扰了我很长时间,开始因为是谷歌网站不稳定,所以经常连接失败,网上有很多人建议用迅雷下载。最后终于在网上有人给出了解决方 法,在/etc/hosts增加如下代码:(该文件的作用是提供ip和域名之间的对应关系,DNS服务器就是提供该作用的,看来应该是DNS服务器的问 题,导致源代码下载失败)

74.125.31.82 www.googlesource.com

74.125.31.82 android.googlesource.com

74.125.128.93 dl.google.com

74.125.128.136 dl.google.com

2.错误:“Your version is: 1.7.0 ,The correct version is: Java SE 1.6.”

分析:出现这个错误的主要原因是本机上jdk的版本太高,而Android编译需要的jdk版本是1.6.因为之前搭建过Android App开发环境,也需要jdk,所以当时在官网上找了一个最新的版本1.7的,所以这里就会出现错误。

解决方法:解决方法说起来很简单,将jdk1.7卸载,重新安装1.6就行了。但是实际操作过程中花了我很长时间,因为jdk1.6的安装问题。首先,当 时安装jdk1.7的时候有tar.gz格式的文件,下载下来直接解压在相应目录下,然后添加路径即可。但是官网上关于1.6版本只有.bin格式的文 件,下载下来安装的时候出现

“rpm:RPM should not be used directly install RPM packages, use Alien instead!

rpm:However assuming you know what you are doing...

error: 依赖性检测失败:

/bin/basename 被 jdk-2000:1.6.0_38-fcs.i586 所需要

出现这种错误的原因是因为rpm是redhat系的包管理器,ubuntu是debian系的,debian系的包管理器是dpkg,需要用deb包来安装,而不是rpm包。解决方法是:

>>sudo alien -k jdk-6u38-linux-i586.rpm

注意这个rpm文件是你刚刚运行.bin文件生成的,然后会生成一个.deb包

>>sudo dpkg -i jdk_1.6.038-1_i386.deb

我在这一步的时候遇到提示错误,我忘了是什么错误了,然后我一直重新安装,还是提示错误,我又换其他1.6的版本,仍然提示错误,最后在网上有一个人说, 不用理会这个错误,其实安装已经成功了,我这才修改环境变量,一般在/usr/java/jdk1.6.0下,然后重新编译,果然没错了,折腾死了。

3. 问题:

external/yaffs2/yaffs2/yaffs_tagsvalidity.h:23:6: warning: redundant redeclaration of ‘yaffs_InitialiseTags’ [-Wredundant-decls]

external/yaffs2/yaffs2/yaffs_guts.h:888:6: note: previous declaration of ‘yaffs_InitialiseTags’ was here

host C: mkyaffs2image <= external/yaffs2/yaffs2/yaffs_tagsvalidity.c

host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp

:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default]

原因:gcc和g++编译器版本太高

解决方法:更换较低版本的gcc和g++编译器

查看编译器版本:

>>ls -l gcc*

lrwxrwxrwx 1 root root      7 Aug 30 19:26 gcc -> gcc-4.6

-rwxr-xr-x 1 root root 353216 Apr 16 07:37 gcc-4.6

>>ls -l g++*

lrwxrwxrwx 1 root root      7 Mar 14 04:05 g++ -> g++-4.6

-rwxr-xr-x 1 root root 357312 Apr 16 07:36 g++-4.6

安装gcc和g++4.4 版本:

sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib

修改链接:

>>sudo mv gcc gcc.bak

>>sudo ln -s gcc-4.4 gcc

>>sudo mv g++ g++.bak

>>sudo ln -s g++-4.4 g++

查看当前gcc和g++版本:

>>gcc -v

>>g++ -v

4. 问题
/home/user/bin/repo: line 1: syntax error near unexpected token `newline‘
/home/user/bin/repo: line 1: `<!DOCTYPE html>‘

solution: change a repo
curl 

"http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo"> ~/bin/repo

5. Problem

fatal: ‘../platform/abi/cpp.git‘ does not appear to be a git repository fatal: The remote end hung up unexpectedly  error: Cannot fetch platform/abi/cpp  找到以前的一个文档,发现加上一句话就可以了:  在.repo目录下的manifest.xml里找到fetch属性   改成   fetch= "git://Android.git.linaro.org/ "

 6. problem 

host StaticLib: libGLcommon (out/host/linux-x86/obj/STATIC_LIBRARIES/libGLcommon
_intermediates/libGLcommon.a)
host SharedLib: libGLES_CM_translator (out/host/linux-x86/obj/lib/libGLES_CM_tra
nslator.so)
/usr/bin/ld: cannot find -lGL
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/lib/libGLES_CM_translator.so] Error 1

解决方法:

sudo apt-get install libglu1-mesa-dev

sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 /usr/lib/libGL.so

7. 编译时出现/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when searching for -lz错误 host Executable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt) /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when searching for -lz /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.a when searching for -lz /usr/bin/ld: skipping incompatible //usr/lib/libz.so when searching for -lz /usr/bin/ld: skipping incompatible //usr/lib/libz.a when searching for -lz /usr/bin/ld: cannot find -lz collect2: ld returned 1 exit status make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1 缺少lib32z1-dev,安装即可:apt-get install lib32z1-dev  

 8. target R.java/Manifest.java: CtsVerifier (out/target/common/obj/APPS/CtsVerifier_intermediates/src/R.stamp) Warning: AndroidManifest.xml already defines versionCode (in http://schemas.android.com/apk/res/android); using existing value in manifest. Warning: AndroidManifest.xml already defines versionName (in http://schemas.android.com/apk/res/android); using existing value in manifest. Warning: AndroidManifest.xml already defines minSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest. target Java: CtsVerifier (out/target/common/obj/APPS/CtsVerifier_intermediates/classes) cts/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java:191: onCreateDialog(int,android.os.Bundle) in android.app.Activity cannot implement onCreateDialog(int,android.os.Bundle) in com.android.cts.verifier.PassFailButtons.PassFailActivity; attempting to assign weaker access privileges; was public     private static <T extends android.app.Activity & PassFailActivity>                     ^ 1 error make: *** [out/target/common/obj/APPS/CtsVerifier_intermediates/classes-full-debug.jar] Error 41

 Solution:comment the statement of cts/Android.mk, and then all the files in cts will not be compiled.

 CTS means "Compatibility Test Suite", when we finished the development of Android, we must pass the CTS, and make sure that all the Application can run normally on this platform, then hand over this test report to google and get the authentication of android market.
时间: 2024-08-05 11:16:01

ubuntu12.04下安卓编译环境搭建总结的相关文章

ubuntu14.04下嵌入式工作环境搭建

昨天作死一不小心把小红帽home目录下的东西删光了.跟着国嵌的视频学了这么久,对linux也算是有些熟悉,就决定自己在ubuntu下搭建一个工作环境.整个过程还算比较顺利,不过也有些小波折.下面把这次环境搭建记录下来,方便自己以后查阅,如果能够帮助到大家那自然是最好. ———————————————————————————————————————————————————————————————————— 注意:还处在裸机阶段学习或者还想使用usb下载烧写程序的朋友们就不要看了!!! 原因:由于国

windows环境下安卓开发环境搭建

Android开发环境搭建 工具 JDk:http://www.oracle.com/technetwork/java/javase/downloads/index.html JDK(Java Development Kit)是整个Java的核心,包括一系列Java开发的东西,安装完毕需要配置一下环境变量. JAVA_HOME: JDK的安装路径,这个环境变量本身不存在,需要创建,创建完则可以利用%JAVA_HOME%作为统一引用路径,其值为:jdk在你电脑上的安装路径. PATH: PATH属

Ubuntu18.04下Python Web环境搭建

Python3的安装与卸载 pip, pip3的安装 Django2.x的安装 mysql的安装及命令行工具mycli的安装 virtualenv及virtualenvwrapper的安装 IPython的安装 openjdk的安装(PyCharm需要Java环境) 1. Python3的安装与卸载 首先需要注意的是:系统自带的python(2, 3)建议别删掉!!!系统对自带的python(2, 3)是有依赖的,删掉会崩,自己安装的可以删掉. 此处安装和卸载的都是笔者自己在官网下载的版本,笔者

ubuntu14.04下Qt开发环境搭建遇到的问题

在ubuntu14下安装了Qt的安装包:qt-opensource-linux-x86-5.5.1.run 以为 装完安装包后就能直接用了,结果总提示qmake未配置之类的错误,导致编译不了. 后来网上查查,发现还需要安装其它的一些开发环境: sudo apt-get install build-essential sudo apt-get install libgl1-mesa-dev 执行命令 没有下载, 由于更改了/etc/apt/sources.list,有些源不好使,后来又找源才成功安

Ubuntu16.04下的NetCore环境搭建

跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux VSCode安装:http://www.cnblogs.com/dunitian/p/6661644.html 搜狗拼音安装:http://www.cnblogs.com/dunitian/p/6662374.html 官方参考链接: 离线下载: https://www.microsoft.com/net/download/linux .NET Core 命令https://

Ubuntu12.04下搭建Java环境

1.认识需要配置的环境变量 1). PATH: 作用是指定命令搜索路径,打开/etc/environment可以看到PATH变量的值,该变量包含了一系列的路径.那些路径都是一些经常使用的系统命令的目录地址,如:./sbin./bin等.在bash终端执行命令时,系统会自动到PATH变量所指定的路径中查找是否能找到相应的命令程序.因此,我们需要把jdk安装目录下的bin目录增加到现存的PATH变量中让使用java命令如同系统命令一样方便. 2). CLASSPATH: 作用是指定类搜索路径,让jv

嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境

操作系统:Ubuntu12.04 AMD64位 交叉编译环境:arm-Linux gcc版本4.4.3 前言: 首先理解一下交叉编译的意思.我们要给嵌入式设备写应用程序,但是又不能在嵌入式设备上完成所有的代码开发工作,只能在一台工作PC上完成然后编译成二进制文件上传到嵌入式设备上.但是我们选用的编译工具链不能是工作PC上的,应该是嵌入式设备上的编译工具链,所以,我们要在PC上搭建适用于嵌入式设备的交叉编译工具链.例如,PC上的gcc版本可能是4.6但是arm-linux-gcc的版本却是4.4.

ubuntu12.04下lamp环境搭建步骤

1 .安装apache2:sudo apt-get install apache2 安装完成后,运行如下命令重启apache:sudo /etc/init.d/apache2 restart,在浏览器中输入http://localhost或者http://127.0.0.1,会看到"It works!"说明apache安装成功. 2.安装php: sudo apt-get install libapache2-mod-php5 php5; 安装扩展php5-gd:sudo apt-ge

ubuntu12.04下hadoop1.04环境搭建

(1)我的电脑环境 (2)jdk1.6的安装 由于Ubuntu12.04自带了openjdk6,所以,在终端输入java -version后会现实如下提示: 表示jdk已经安装完成了.接下来是配置环境变量. openjdk6的安装目录是在/usr/lib/jvm下 (3)设置环境变量 #set Java Environment export  JAVA_HOME=/usr/lib/jvm/java-6-openjdk export  CLASSPATH=.:$JAVA_HOME/lib/:$CL