现在的位置: 首页 > 综合 > 正文

Android源码编译

2013年01月22日 ⁄ 综合 ⁄ 共 13056字 ⁄ 字号 评论关闭

一、环境设置

  1. wayne@wayne-pc:~/Android/source$ source build/envsetup.sh   
  2. including device/htc/passion/vendorsetup.sh  
  3. including device/samsung/crespo/vendorsetup.sh  
  4. wayne@wayne-pc:~/Android/source$ lunch full-eng  

在lunch时,如果提示permission denied权限不够的话,需要在源码根目录下执行,赋予目录下所有文件权限

  1. wayne@wayne-pc:~/Android/source$ sudo chmod -R 777 *  

这时候会lunch指令会打印出如下所示文段:

  1. ============================================  
  2. PLATFORM_VERSION_CODENAME=REL  
  3. PLATFORM_VERSION=2.3.3  
  4. TARGET_PRODUCT=full  
  5. TARGET_BUILD_VARIANT=eng  
  6. TARGET_SIMULATOR=false  
  7. TARGET_BUILD_TYPE=release  
  8. TARGET_BUILD_APPS=  
  9. TARGET_ARCH=arm  
  10. HOST_ARCH=x86  
  11. HOST_OS=linux  
  12. HOST_BUILD_TYPE=release  
  13. BUILD_ID=GRI40  
  14. ============================================  

二.开始编译

编译过程可能会出现许多错误而中止,在此wayne将会把所有遇到的问题以及解决方法一一贴出来,以供以后参考。

1.Q:

  1. wayne@wayne-pc:~/Android/source$ make -j2  
  2. ============================================  
  3. PLATFORM_VERSION_CODENAME=REL  
  4. PLATFORM_VERSION=2.3.3  
  5. TARGET_PRODUCT=full  
  6. TARGET_BUILD_VARIANT=eng  
  7. TARGET_SIMULATOR=false  
  8. TARGET_BUILD_TYPE=release  
  9. TARGET_BUILD_APPS=  
  10. TARGET_ARCH=arm  
  11. HOST_ARCH=x86  
  12. HOST_OS=linux  
  13. HOST_BUILD_TYPE=release  
  14. BUILD_ID=GRI40  
  15. ============================================  
  16. Checking build tools versions...  
  17. build/core/main.mk:76: ************************************************************  
  18. build/core/main.mk:77: You are attempting to build on a 32-bit system.  
  19. build/core/main.mk:78: Only 64-bit build environments are supported beyond froyo/2.2.  
  20. build/core/main.mk:79: ************************************************************  
  21. build/core/main.mk:80: *** stop。 停止。  

解决方法:cd到源码根目录,执行:


  1. $ gedit build/core/main.mk  

找到

  1. ifneq (64,$(findstring 64,$(build_arch)))  

将其修改为

  1. ifneq (i686,$(findstring i686,$(build_arch)))  
然后依次修改以下四个make文件:
  1. external/clearsilver/cgi/Android.mk  
  2. external/clearsilver/java-jni/Android.mk  
  3. external/clearsilver/util/Android.mk  
  4. external/clearsilver/cs/Android.mk  
将其中的
  1. LOCAL_CFLAGS += -m64  
  2. LOCAL_LDFLAGS += -m64  
修改为
  1. LOCAL_CFLAGS += -m32  
  2. LOCAL_LDFLAGS += -m32  
2.Q:
  1. frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]  
  2.  make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] Error 1  
解决方法:
  1. $ gedit frameworks/base/libs/utils/Android.mk  
修改以下语句
  1. LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)  
  1. LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissive  
3.Q:
  1. arm-eabi-gcc: error trying to exec 'cc1': execvp: No such file or directory  
  2. make: *** [out/target/product/generic/obj/lib/crtbegin_dynamic.o] Error 1  
如果之前的依赖包都已经安装成功的话,此处应该是交叉编译工具权限的问题。这个问题只要在文章开头lunch时执行了赋予权限命令,就应该不会遇到了。
4.Q:
  1. <command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]  
  2.  <built-in>:0:0: note: this is the location of the previous definition  
  3.  cc1plus: all warnings being treated as errors  
  4. make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1  

此处编译错误是由于ubuntu 11.10采用了GCC4.6.1导致的。

解决方法:

修改源码目录下/build/core/combo/HOST_linux-x86.mk文件:

将以下语句

  1. HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0  
修改为
  1. HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0  

编译时还有可能出现类似的错误,根据错误提示的关键词比如g++错误、jre错误等,都是些细节问题,比较好解决。

经过两小时左右的等待后,终于顺利完成。编译成功后会生成system.img等镜像文件,下面是编译完成提示:

  1. Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img  
  2. Install system fs image: out/target/product/generic/system.img  
  3. Installed file list: out/target/product/generic/installed-files.txt  
5.Q
出现如下错误:
  1. hash_table*)::remap_visitor::visit(ir_dereference_variable*)’ [-Woverloaded-virtual]  
  2. external/mesa3d/src/glsl/linker.cpp: In function ‘void assign_varying_locations(gl_shader_program*, gl_shader*, gl_shader*)’:  
  3. external/mesa3d/src/glsl/linker.cpp:1394:49: error: expected primary-expression before ‘,’ token  
  4. external/mesa3d/src/glsl/linker.cpp:1394:50: error: ‘varyings’ was not declared in this scope  
  5. external/mesa3d/src/glsl/linker.cpp:1394:58: error: ‘offsetof’ was not declared in this scope  
  6. external/mesa3d/src/glsl/linker.cpp:1395:48: error: expected primary-expression before ‘,’ token  
  7. external/mesa3d/src/glsl/linker.cpp:1412:47: error: expected primary-expression before ‘,’ token  
  8. external/mesa3d/src/glsl/linker.cpp:1412:48: error: ‘position’ was not declared in this scope  
  9. external/mesa3d/src/glsl/linker.cpp:1414:47: error: expected primary-expression before ‘,’ token  
  10. external/mesa3d/src/glsl/linker.cpp:1414:48: error: ‘pointSize’ was not declared in this scope  
  11. external/mesa3d/src/glsl/linker.cpp:1424:47: error: expected primary-expression before ‘,’ token  
  12. external/mesa3d/src/glsl/linker.cpp:1424:48: error: ‘position’ was not declared in this scope  
  13. external/mesa3d/src/glsl/linker.cpp:1428:47: error: expected primary-expression before ‘,’ token  
  14. external/mesa3d/src/glsl/linker.cpp:1428:48: error: ‘frontFacingPointCoord’ was not declared in this scope  
  15. external/mesa3d/src/glsl/linker.cpp:1431:47: error: expected primary-expression before ‘,’ token  
  16. external/mesa3d/src/glsl/linker.cpp:1431:48: error: ‘frontFacingPointCoord’ was not declared in this scope  
  17. external/mesa3d/src/glsl/linker.cpp: In function ‘void link_shaders(const gl_context*, gl_shader_program*)’:  
  18. external/mesa3d/src/glsl/linker.cpp:1734:49: error: expected primary-expression before ‘,’ token  
  19. external/mesa3d/src/glsl/linker.cpp:1734:50: error: ‘fragColor’ was not declared in this scope  
  20. external/mesa3d/src/glsl/linker.cpp:1734:59: error: ‘offsetof’ was not declared in this scope  
  21. make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libMesa_intermediates/src/glsl/linker.o] Error 1  
在android源码文件中找到"external/mesa3d/src/glsl/linker.cpp"这个文件,添加#include <stddef.h>头文件就可以!

6Q:
现象:
<command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]
 <built-in>:0:0: note: this is the location of the previous definition
 cc1plus: all warnings being treated as errors
make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

原因:
此处编译错误是由于ubuntu 11.10采用了GCC4.6.1导致的。

解决方法:
使用gcc4.4.6版本进行编译.


7Q:


现象:
In file included from external/oprofile/libpp/arrange_profiles.cpp:24:0: 
external/oprofile/libpp/format_output.h:94:22: error: reference ‘counts’ c-fpermissiveannot be declared ‘mutable’ [-fpermissive]
host C++: liboprofile_pp <= external/oprofile/libpp/callgraph_container.cpp 
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/liboprofile_pp_intermediates/arrange_profiles.o] Error 1
make: *** Waiting for unfinished jobs.... 

解决:
使用gcc4.4.6版本进行编译.


ubuntu 11.10的gcc版本是4.6.1,版本太高,编译android时出错,要把gcc版本改为4.4.6, 4.5的版本据说可以,但没试过.
通 过gcc -v命令可以发现gcc库在/usr/lib/gcc/i686-linux-gnu目录下,该目录下有当前系统支持的各种版本gcc库 。在安装gcc 4.4前该目录下是没有4.4目录的,安装gcc 4.4后该目录下就会多出4.4这个目录,且该4.4目录下有各种相应库文件。
ubuntu 32bit系统下安装gcc 4.4的最好方法是仅用以下两条命令,不需要其它命令,否则编译时可能会出错。
sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4


装完后在/usr/bin目录下
$ ls -l gcc*
lrwxrwxrwx 1 root root      7 2011-10-29 09:11 gcc -> gcc-4.6
-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 gcc-4.4
-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 gcc-4.6
发现gcc 链接到gcc-4.6,  需要将它改为链接到gcc-4.4 :
sudo mv gcc gcc.bak
sudo ln -s gcc-4.4 gcc
同理
ls -l g++*
lrwxrwxrwx 1 root root      7 2011-08-14 15:17 g++ -> g++-4.6
-rwxr-xr-x 1 root root 228640 2011-10-06 05:45 g++-4.4
-rwxr-xr-x 1 root root 306200 2011-09-17 05:39 g++-4.6
需要将g++链接改为g++-4.4:
/usr/bin$ sudo mv g++ g++.bak
/usr/bin$sudo ln -s g++-4.4 g++


再查看gcc和g++版本号:
gcc -v
g++ -v
均显示gcc version 4.4.6 ,说明gcc 4.4安装成功。

三、启动所编译的系统

编译完之后会在out/target/product/generic目录下生成system.img ramdisk.img userdata.img三个镜像文件。

在启动模拟器之前,需要先为模拟器系统设置环境变量,执行gedit ~/.bashrc,新增环境变量如下:

  1. export ANDROID_PRODUCT_OUT=~/Android/source/out/target/product/generic  
  2. ANDROID_PRODUCT_OUT_BIN=~/Android/source/out/host/linux-x86/bin  
  3. export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT};  
最后,同步这些变化并启动模拟器:
  1. $ source ~/.bashrc  
  2. $ cd ~/Android/source/out/target/product/generic  
  3. $ emulator -system system.img -data userdata.img -ramdisk ramdisk.img  
加载上我们所编译出来的系统文件,终于出现了期待已久的模拟器.
到这里,源码编译就完成了,接下来就可以进行自己的改动测试了


问题补充



错误1:
USER-NAME@MACHINE-NAME:~/Android$
make 出现了如下错误: host C++: llvm-rs-cc <= frameworks/compile/slang/slang_rs_export_foreach.cpp frameworks/compile/slang/slang_rs_export_foreach.cpp: In static member function ‘static slang::RSExportForEach* slang::RSExportForEach::Create(slang::RSContext*, const
clang::FunctionDecl*)’: frameworks/compile/slang/slang_rs_export_foreach.cpp:247:23: error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable] cc1plus: all warnings being treated as errors make: *** [out/host/linux-x86/obj/EXECUTABLES/llvm-rs-cc_intermediates/slang_rs_export_foreach.o]
Error 1
 
解决方法: 1.在工程根目录下,打开下面的makefile文件: $ vi frameworks/compile/slang/Android.mk  2.在打开的makefile文件中按照下面更改: #local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror local_cflags_for_slang := -Wno-sign-promo
-Wall -Wno-unused-parameter 错误2:
<命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror] <built-in>:0:0: 附注: 这是先前定义的位置

解决:
修改build/core/combo/HOST_linux-x86.mk 61行,将 HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 修改成 HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

错误2:

host Prebuilt: monkeyrunner (out/host/linux-x86/obj/EXECUTABLES/monkeyrunner_intermediates/monkeyrunner) host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp <命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror] <built-in>:0:0: 附注: 这是先前定义的位置 cc1plus:所有的警告都被当作是错误

解决:
修改build/core/combo/HOST_linux-x86.mk 将 HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 修改成 HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

错误3:
error:
Exited sync due to fetch errors
解决:
重新运行 repo sync 就可以解决

 

1、问题一:/bin/bash: bison: 未找到命令

 解决方法:$ sudo apt-get install bison

 

2、问题二:

You are attempting to build with the incorrect version of java.

Your version is: /bin/bash: java: 未找到命令.

The correct version is: 1.5.

 解决方法:

注意:必须使用1.5的JDK版本。不能使用1.6等其他版本。

(1)       下载

在sun官网上下载jdk-1_5_0_22-linux-i586.bin。注意不是jdk-1_5_0_22-linux-i586rpm.bin

(2)       部署

进入jdk-1_5_0_22-linux-i586.bin所在目录

cd ~

赋予该bin文件可执行属性

chmod +x jdk-1_5_0_22-linux-i586.bin

一直回车跳过协议到最后一行:

Do you agree to the above license terms? [yes or no]

键入yes回车开始解压。默认解压到当前目录下的jdk1.5.0_22目录里。

(3)       配置环境变量

执行$gedit ~/.bashrc打开.bashrc文件。

修改./bashrc文件在文件末尾添加

#set java environment 

JAVA_HOME=“你的路径”/jdk1.5.0_10 
export JRE_HOME=“你的路径”/jdk1.5.0_10/jre 
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH 
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 

保存并关闭文件。

在终端执行source ~/.bashrc刷新该配置

 使用java –version检查JDK是否配置正确。

 

3、问题三:

host c++: libhost <= build/libs/host/pseudolocalize.cpp/bin/bash: g++: 未找到命令

make: ***[out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/pseudolocalize.o] 错误 127

 解决方法:$ sudo apt-get install build-essential

 

4、问题四:

external/clearsilver/cgi/cgi.c:22:18: 致命错误: zlib.h: 没有那个文件或目录编译终端。

make: ***[out/host/linux-x86/obj/SHARED_LIBRARIES/libneo_cgi_intermediates/cgi.o] 错误 1

 解决方法:$ sudo apt-get install zlib1g-dev

 

5、问题五:

make: ***[out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/appt] 错误 1

 解决方法:

打开Android.mk文件

$gedit frameworks/base/tools/aapt/Android.mk

编辑下面一行:

ifeq ($(HOST_OS),linux)

#LOCAL_LDLIBS += -lrt       把这行注释掉改为下面一行。

LOCAL_LDLIBS += -lrt -lpthread

endif

 

6、问题六:

host c: adb<= system/core/adb/fdevent.c

host Executable:adb (out/host/linux-86/obj/EXECUTABLES/adb_intermediates/adb)/user/bin/ld: cannot find –lncurses

collect2: ld 返回 1

make: ***[out/host/linux-86/obj/EXECUTABLES/adb_intermediates/adb] 错误 1

 解决方法:$sudo apt-get install libncurses5-dev

 

7、问题七:

make: ***[out/target/product/sam9g45/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h] 错误 25

 解决方法:$sudo apt-get install gpert

 

8、问题八:

host C++: libutils <= frameworks/base/libs/utils/RefBase.cpp

frameworks/base/libs/utils/RefBase.cpp: In member function ‘void android::RefBase::weakref_type::trackMe(bool, bool)’:

frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 错误 1

 解决方法:

打开Android.mk

$ gedit frameworks/base/libs/utils/Android.mk

将下面这一行

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)

改为

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive

 

9、问题九:

make: ***[out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/android/skin/window.o] Error 1

 解决方法:$ sudo apt-get install libx11-dev

 

10、问题十:

make: *** [out/host/linux-x86/obj/EXECUTABLES/localize_intermediates/localize] 错误 1

 解决方法:

打开Android.mk:

$gedit ./framework/base/tools/localize/Android.mk文件(注意与问题五中的文件是不同文件)

编辑下面一行:

ifeq ($(HOST_OS),linux)

#LOCAL_LDLIBS += -lrt       把这行注释掉改为下面一行。

LOCAL_LDLIBS += -lrt –lpthread

 

转载请注明出处:http://blog.csdn.net/pku_android 

 

11、问题十一:

make: ***[out/host/linux-x86/obj/EXECUTABLES/accRuntimeTest_intermediates/accRuntimeTest] 错误 1

 解决方法:

打开Android.mk:

$gedit system/core/libacc/tests/Android.mk(注意与问题五和问题十不是同一个文件)

将以下缺少的语句添加进去:

LOCAL_SHARED_LIBRARIES := \

     libacc

LOCAL_LDLIBS += -ldl

LOCAL_MODULE_TAGS := tests

在include $(BUILD_HOST_EXECUTABLE)下面添加以下缺少的语句:

LOCAL_SHARED_LIBRARIES := \

     libacc

LOCAL_LDLIBS += -ldl

LOCAL_MODULE_TAGS := tests

 

抱歉!评论已关闭.