Google官方建议在Mac OS上编译Master下的代码所需环境为MacOS 10.8 (Mountain Lion) + Xcode 4.5.2;编译4.2.x分支下的代码需MacOS 10.6 (Snow Leopard)或MacOS 10.7 (Lion), 以及Xcode 4.2;编译4.0.x及以前的代码需MacOS 10.5 (Leopard)或MacOS 10.6 (Snow Leopard),并且需要MacOS 10.5 SDK。而我这边的环境为Mac OSX 10.7.5,Xcode 4.4.1,待编译的Android版本为4.0.1_r1。由于不是官方推荐的环境,所以在编译过程中遇到很多问题,这里一一记录下。
1. Need the MacOSX10.5 sdk. 问题,解决方法有两种:
a). 修改编译脚本“external/qemu/Makefile.android”,找到如下内容:
ifneq ($(filter 10.1 10.2 10.3 10.1.% 10.2.% 10.3.% 10.4 10.4.%,$(DARWIN_VERSION)),) $(error Building the Android emulator requires OS X 10.5 or above) endif ifeq ($(filter 10.5 10.5.%,$(DARWIN_VERSION)),) # We are on Snow Leopard or above #LEOPARD_SDK := /Developer/SDKs/MacOSX10.5.sdk #LEOPARD_SDK := /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk ifeq ($(strip $(wildcard $(LEOPARD_SDK))),) $(info Please install the 10.5 SDK on this machine at $(LEOPARD_SDK)) $(error Aborting the build.) endif MY_CFLAGS += -isysroot $(LEOPARD_SDK) -mmacosx-version-min=10.5 -DMACOSX_DEPLOYMENT_TARGET=10.5 MY_LDLIBS += -isysroot $(LEOPARD_SDK) -Wl,-syslibroot,$(LEOPARD_SDK) -mmacosx-version-min=10.5 endif
蓝色语句为原始代码,红色为需要修改的地方。可以看到,脚本中指定了10.5 SDK的位置,只要将该位置换成10.7 SDK的位置,并且把条件判断的版本修改为10.7就可以继续编译了。但是由于10.5和10.7的系统环境不同,这个方法虽然能继续编译,但后面还会遇到很多问题,我在编译过程中最终还是遇到一个问题无法解决,所以不建议使用。建议采用下面的方法。
b). 从Mac Developer官网上下一个Xcode3.2.6(该文件大约4.4G),它里面包含了10.5 SDK。不需要再装一个Xcode,我们只需要它里面的SDK包。打开dmg文件,里面有个Packages目录(注:该目录为隐藏,需要将Finder设置为能显示隐藏文件才能看到);找到MacOSX10.5.pkg,打开安装。默认安装后的目录为/SDK。之后或者修改编译脚本中的目录使其指向实际目录,或者在根目录下新建一个Developer目录,把SDK的内容移过去。就能在正确的环境下继续编译了。
2. Can't locate Switch.pm问题,这是Perl版本不一致导致的问题
解决方法可通过修改"external/webkit/Source/WebCore/make-hash-tools.pl"。具体方法参考链接http://mexapi.macpress.com.br/2012/11/compiling-android-aosp-in-slackware.html#.UzRQnVznNvR
3. frameworks/base/include/utils/KeyedVector.h:193:17: error: use of undeclared identifier 'indexOfKey'
ssize_t i = indexOfKey(key);
解决方法:找到该文件打开,并参考红色部分进行修改
template<typename KEY, typename VALUE> inline
const VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {
ssize_t i = this->indexOfKey(key);
return i >= 0 ? KeyedVector<KEY,VALUE>::valueAt(i) : mDefault;
}
4. 编译过程中报出很多缺少“this->”指针的错误,可使用“make CC=gcc CXX=g++ -j4”尝试解决。不过我感觉在安装了10.5 SDK后好象就没再见过这个错误。这个错误是之前使用10.7 SDK编译时看到的。
5. 关于“strnlen”重定义的问题,可通过修改“external/elfutils/config-darwin.h”,将重复定义的部分注释掉即可。
#if 0 static inline size_t strnlen (const char *__string, size_t __maxlen) { int len = 0; while (__maxlen-- && *__string++) len++; return len; } #endif
ld: warning: ignoring file out/host/darwin-x86/obj/STATIC_LIBRARIES/libSDL_intermediates/libSDL.a, file was built for archive which is not the architecture being linked (i386):
Undefined symbols for architecture i386:
"_SDL_...", referenced from:
这是使用10.7 SDK编译遇到的最麻烦的一个问题,原因应该是用到的libSDL.a库文件不支持i386架构,网上的较多的解决方法是找到“/external/qemu/Android.mk”文件并将里面的内容都注释掉,但是这样最终就不能得到emulator这个文件了。此外在我的机器上,把该文件内容注掉后还遇到另外一个库文件的问题。
host SharedLib: libext2_e2p_host (out/host/darwin-x86/obj/lib/libext2_e2p.dylib)
Undefined symbols for architecture i386:
最终的解决方法还是安装10.5 SDK
最后列出一些相关内容的参考链接,一些网站可能需要代理才能访问
https://groups.google.com/forum/#!msg/android-building/vVZsi1E6SUY/my0nat4A2kYJ
http://vinsnaps.blogspot.com/2012/08/build-android-ics-on-mac-os-108.html
http://blog.youkuaiyun.com/beiyouqiang/article/details/8787416
http://mexapi.macpress.com.br/2012/11/compiling-android-aosp-in-slackware.html#.UzRZy1znNvR