[转发请注明出处,谢谢]
本文的编译环境指的是Android Kernel,Framework的编译,不是Application的开发环境。
有详细说明的只给出链接和要点提示。
大的步骤就是Android的source网站的原文
“Initializing a Build Environment”的Setting up a Mac OS X build environment部分。
要点提示:
1. 创建case-sensitive disk image.的问题
原文提到要在~/.bash_profile文件添加mountAndroid命令。好多人找不到此文件。
其实,默认Mac OS X是没有这个文件的。可以参考下文解决
“MAC上找不到.bash_profile该怎么办?” 链接:http://blog.csdn.net/edai9508/article/details/6006269
也就是要自己产生此文件,并且编辑加入内容,编辑好保存后要执行
source .bash_profile
来更新配置。
2.装Xcode的问题
Android官方推荐装Xcode3.1.4版本,但是先在都4.x了,其实主要是要MacOS SDK 10.5.
请参考链接:
(1)解决Android在MAC OSX上编译缺少10.5SDK问题
链接:http://blog.csdn.net/dragon1225/article/details/7061076
[注释:链接文章提到编译时strnlen的错误问题,这个将下文列举]
(2)10.5的SDK包可以通过这里下载
http://blog.csdn.net/guoguoljg/article/details/7300940
3.通过Macport装相关的包的过程中遇到的问题
(1)Python27安装错误,解决方案:自己重新找源安装即可;
(2)xz错误(好像和Python有关系):自己手动装xz sudo port install xz;
4.编译Android遇到的问题
(1)问题 error: elf.h: No such file or directory
原因:Mac缺少elf.h文件
解决方法:参考这里http://blog.csdn.net/quaful/article/details/6053708
思想:从网上下个elf头文件,放到scripts/mod/文件夹里,要修改两个文件mk_elfconfig.c和modpost.h
把#include
(2)问题error: static declaration of ‘strnlen’ follows non-static declaration
/usr/include/string.h:143: error: previous declaration of ‘strnlen’ was here
原因:通过解决方案发现这个strnlen时多余的
解决:方案一,替换这个函数, 参考http://dyf128.iteye.com/blog/1258943
方案二,函数外围加宏或者注释掉,参考
我采用方案二,参考
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070
static inline size_t strnlen (const char *__string, size_t __maxlen)
{
int len = 0;
while (__maxlen-- && *__string++)
len++;
return len;
}
#endif
无论哪个方案都会引来下面的新问题。
(3)问题 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
原因:不明
解决:注释掉Android.mk的所有内容
参考:
# the following test is made to detect that we were called
# through the 'm' or 'mm' build commands. if not, we use the
# standard QEMU Makefile
#
###################Comment by Damon on June 28, 2012###########################
#ifeq ($(DEFAULT_GOAL),droid)
# LOCAL_PATH:= $(call my-dir)
# include $(LOCAL_PATH)/Makefile.android
#else
# include Makefile.qemu
#endif
##############################################################
相关参考
i) http://dyf128.iteye.com/blog/1258943
ii) http://groups.google.com/group/android-building/browse_thread/thread/bd566c8b513a4946
iii) http://www.linuxidc.com/Linux/2012-06/61754.htm