Android系统编译问题
获取Android源码流程:
-
从 https://code.google.com/p/git-repo/downloads/list 下载repo脚本
-
repo init -u git://github.com/CyanogenMod/android.git -b cm-10.1 (CM的Android4.2源码)
-
repo sync -j16 (同步源码)
-
编译操作看 http://source.android.com/source/initializing.html
1、java版本不兼容
解决方法:一改build/core/main.mk中关于java版本判断的语句,二改build/core/combo/java.mk中的java主版本号,比如把1.5改成1.7
2、/usr/include/features.h:324:26: 致命错误: bits/predefs.h:没有那个文件或目录
解决方法:sudo apt-get install libc6-dev-i386
3、/usr/bin/ld: cannot find -lstdc++
解决方法:sudo apt-get install g++-multilib
4、Enum.java中 return ordinal - o.ordinal; 语法错误
解决方法:改成return ordinal - o.ordinal();
5、bad class file magic (cafebabe) or version (0033.0000)
解决方法:把jdk1.7换成1.6的,sudo apt-get install openjdk-6-jdk
6、“_FORTIFY_SOURCE”重定义
解决方法:把build/core/combo/HOST_linux-x86.mk中的HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0加一个-U_FORTIFY_SOURCE改为HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
7、variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]错误
解决方法:在frameworks/compile/slang/Android.mk里面把
local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror中的-Werror去掉
8、linker.cpp:1394:49: 错误: expected primary-expression before ‘,’ token
解决方法:在linker.cpp中加上头文件#include "stddef.h"或"cstddef"
9、format_output.h:94:22: 错误: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
解决方法:手动去掉前面的mutable
10、undefined reference to `dladdr'和undefined reference to `pthread_create'
解决方法:在external/llvm/llvm-host-build.mk
中加入LOCAL_LDLIBS := -lpthread -ldl
11、gtest-param-util.h:122:11: 错误: ‘ptrdiff_t’不是一个类型名
解决方法:在gtest-param-util.h中加入#include "cstddef"
12、CtsVerifier_intermediates/classes-full-debug.jar] Error 41</t extends android.app.activity & passfailactivity>
解决办法:有点怪异,两种方法,一是参考http://www.360doc.com/content/12/0314/11/474846_194227428.shtml中的方法不编译CTS模块; 二是参考http://blog.qhm123.com/2012/02/6/fedora-16-x64-compile-android-4.0.3-source-code.html中的直接注释掉//Dialog onCreateDialog(int id, Bundle args);
13、Can't exec "libtoolize": 没有那个文件或目录 at /usr/bin/autoreconf line 196.
解决办法:sudo apt-get install libtool
Android内核交叉编译问题
1、安装arm交叉编译工具
sudo apt-get install gcc-arm-linux-gnueabi cpp-arm-linux-gnueabi
2、改kernel source中的Makefile中的
ARCH ?= arm
CROSS_COMPILE ?= /usr/bin/arm-linux-gnueabi-
或者
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabi-
或者
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
3、Makefile中
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值
4、alignment.c:298:15: 错误: 此函数中的‘offset.un’在使用前可能未初始化
解决方法:看 https://patchwork.kernel.org/patch/1445111/ 中的patch对应修改。
5、/tmp/ccNcXwyJ.s:69: Error: selected processor does not support ARM mode `smc 0'
解决方法:看 https://gist.github.com/4395518 中的patch对应修改。
6、arm-linux-gnueabi-gcc: 错误: ":没有那个文件或目录
解决方法:这是一个神经质问题,居然跟我中文环境有关,参考 http://wifihack.net/blog/tag/kernel/ 来修改;不过靠谱的修改方法则是 https://github.com/Pivosgroup/buildroot-linux-kernel/commit/1524a2dc8bfbee683384996f434a2a991416c1df
更靠谱的做法是参考 https://github.com/teamhacksung/android_kernel_samsung_smdk4210_new/commit/3d59d99345aee5d6d1a5f2138e66b8ef049f0dea 中提到的,把Makefile或Makefile.common中所有的-qv exported都改为-E "^[0-9]+"
7、/bin/sh: 1: uudecode: not found
解决方法:sudo apt-get install sharutils
8、net/ipv4/netfilter/nf_nat_standalone.c:287:2:错误
解决方法:这是在主Makefile的KBUILD_CFLAGS中加了-Werror(把所有警告当错误处理)参数,去掉它就可以了。
9、make menuconfig出错:mconf.c:(.text.startup+0x66): undefined reference to `initscr'
解决方法:sudo apt-get install lib32ncurses5-dev