Android学习笔记2--编译源代码

本文记录了在Mac OS 10.7.5和Xcode 4.4.1上编译Android 4.0.1_r1源代码时遇到的问题及解决方法,包括需要MacOSX10.5 SDK、Perl版本不一致、KeyedVector.h错误、'strnlen'重定义和链接错误等。提供了相关链接和修改编译脚本的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


6. 遇到类似这样的错误信息:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值