Mac OS X下编译Android源码

根据Android官网提供的方法设置编译环境,编译源码

一. Mac OS X(10.9.2)编译环境设置

1. 创建大小写敏感的磁盘镜像

可以通过磁盘管理工具进行设置,也可以通过以下命令生成镜像文件

hdiutil create -type SPARSE -fs ‘Case-sensitive Journaled HFS+’ -size 40g ~/android.dmg.sparsefile

生成分区之后,可以在~/.bash_profile中添加以下命令来加载分区

# mount the android file image

function mountAndroid { hdiutil attach ~/android.dmg.sparsefile -mountpoint /Volumes/android; }

在terminal中输入mountAndroid即可加载分区

2. 需要安装的工具

(1) 安装Xcode,目前虽然有5.1.0版本,但是需要安装5.0.2版本,在编译源码的时候无法正确通过。

(2) 安装MacPort

注:确定/opt/local/bin在/usr/bin之前,如果没有,执行以下命令,或者修改.bash_profile

export PATH=/opt/local/bin:$PATH

(3) 通过MacPort安装make,git,GPG, 如果本地已经安装,或者版本已经比较新了,无需安装

sudo port install gmake libsdl git-core gnupg

(4) 关于make 3.82版本

make 3.82版本有bug,需要退回3.81,通过以下命令确认版本

make -v

GNU Make 3.81

Copyright (C) 2006 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.

There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A

PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.0

因为我的机器上已经是3.81版本所以没用操作这个过程,具体可以查阅Android 官网

(5) 修改文件描述符限制

在~/.bash_profile中添加以下内容

# set the number of open files to be 1024

ulimit -S -n 1024

二. 下载源码

1. 创建目录~/bin

mkdir ~/bin

添加以下命令到~/.bash_profile

export PATH=~/bin:$PATH

2. 安装repo,这里没用安装官网文档来,具体原因你懂得

$ curlhttps://git-repo.googlecode.com/files/repo-1.19 > ~/bin/repo

然后修改repo为可执行权限

chmod a+x ~/bin/repo

3. 为了方便下载,修改repo文件,如下

#REPO_URL = ‘http://gerrit.googlesource.com/git-repo’

REPO_URL=’http://code.google.com/p/git-repo/’

4. 创建个源码目录mkdir android-source准备下载

cd android-source

5. 执行repo init, git库和官网的不一样,原因不解释

从master 下载源码

repo init -u git://Android.git.linaro.org/platform/manifest.git

或者 分支上下载

repo init -u git://Android.git.linaro.org/platform/manifest.git -b “branch tag”

我选择的是比较新的android-4.4.2_r1

repo init -u git://Android.git.linaro.org/platform/manifest.git -b android-4.4.2_r1

可以在官网查看你想要下载的源码对应的tag,

执行完之后,在本地会有个目录.repo

然后在android-source目录下执行repo sync下载代码

下载代码需要很长时间,,如果感觉没用继续下载,可以ctrl+c杀掉,继续执行repo sync 直到下载完成。

下载完成后,android-source下一共27G,.repo 17G, 源码10G左右

三. 可以编译代码

将代码从android-source目录拷贝到挂载的之前创建的分区/Volumes/android,然后在这个分区下可以删除.repo目录,这个目录在编译代码时,没用并且占去很多空间

1. 初始化编译环境

source build/envsetup.sh

2. 选择编译目标,具体查阅官网

lunch full-eng

3. 编译代码

make

或者

make -j4

我在编译过程出现两次错误。

1.build/core/base_rules.mk:130: *** external/webrtc/src/system_wrappers/source: MODULE.TARGET.STATIC_LIBRARIES.libwebrtc_system_wrappers already defined by external/webrtc/src/system_wrappers/source. Stop.

这应该是个bug,需要在编译代码前,在terminal中取消NDK_ROOT设置,可以参阅

unset NDK_ROOT

2. 这个错误就是Xcode版本的问题,出错log如下

target thumb C++: libstagefright_amrnbenc <= frameworks/av/media/libstagefright/codecs/amrnb/enc/src/spstproc.cpptarget thumb C++: libstagefright_amrnbenc <= frameworks/av/media/libstagefright/codecs/amrnb/enc/src/ton_stab.cppGyp timestamp: /Users/lo/Documents/10-repos/02-cyanogenmod/new/android/system/out/target/product/mako/obj/GYP/net_net_resources_gyp_intermediates/net_resources.stampGyp timestamp: /Users/lo/Documents/10-repos/02-cyanogenmod/new/android/system/out/target/product/mako/obj/GYP/webkit_webkit_resources_gyp_intermediates/webkit_resources.stampGyp timestamp: /Users/lo/Documents/10-repos/02-cyanogenmod/new/android/system/out/target/product/mako/obj/GYP/skia_skia_library_gyp_intermediates/skia_library.stampGyp action: Generating icui18n shim headers. (/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/shim_headers/icui18n/target/third_party/icu/source/i18n/unicode/basictz.h)Gyp action: Generating icuuc shim headers. (/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/shim_headers/icuuc/target/third_party/icu/source/common/unicode/brkiter.h)Gyp timestamp: /Users/myuser/android/system/out/target/product/mako/obj/GYP/ui_base_strings_ui_strings_gyp_intermediates/ui_strings.stampmkdir -p /Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni; cd external/chromium_org/ui; ../base/android/jni_generator/jni_generator.py –input_file android/java/src/org/chromium/ui/Clipboard.java –output_dir "/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni" –optimize_generation 0 –jarjar ../android_webview/build/jarjar-rules.txtmkdir -p /Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni; cd external/chromium_org/ui; ../base/android/jni_generator/jni_generator.py –input_file android/java/src/org/chromium/ui/gfx/BitmapHelper.java –output_dir "/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni" –optimize_generation 0 –jarjar ../android_webview/build/jarjar-rules.txtmkdir -p /Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni; cd external/chromium_org/ui; ../base/android/jni_generator/jni_generator.py –input_file android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java –output_dir "/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni" –optimize_generation 0 –jarjar ../android_webview/build/jarjar-rules.txtTraceback (most recent call last):File "../base/android/jni_generator/jni_generator.py", line 1103, in <module>Traceback (most recent call last):File "../base/android/jni_generator/jni_generator.py", line 1103, in <module>Traceback (most recent call last):File "../base/android/jni_generator/jni_generator.py", line 1103, in <module>sys.exit(main(sys.argv))File "../base/android/jni_generator/jni_generator.py", line 1099, in mainsys.exit(main(sys.argv))File "../base/android/jni_generator/jni_generator.py", line 1099, in mainsys.exit(main(sys.argv))File "../base/android/jni_generator/jni_generator.py", line 1099, in mainGenerateJNIHeader(input_file, output_file, options)File "../base/android/jni_generator/jni_generator.py", line 1016, in GenerateJNIHeaderGenerateJNIHeader(input_file, output_file, options)File "../base/android/jni_generator/jni_generator.py", line 1016, in GenerateJNIHeaderinput_file, options)File "../base/android/jni_generator/jni_generator.py", line 570, in CreateFromFileinput_file, options)File "../base/android/jni_generator/jni_generator.py", line 570, in CreateFromFileGenerateJNIHeader(input_file, output_file, options)File "../base/android/jni_generator/jni_generator.py", line 1016, in GenerateJNIHeaderreturn JNIFromJavaSource(contents, fully_qualified_class, options)File "../base/android/jni_generator/jni_generator.py", line 538, in __init__return JNIFromJavaSource(contents, fully_qualified_class, options)File "../base/android/jni_generator/jni_generator.py", line 538, in __init__fully_qualified_class)SyntaxError: Unable to find any JNI methods for org/chromium/ui/gfx/BitmapHelper.input_file, options)File "../base/android/jni_generator/jni_generator.py", line 570, in CreateFromFilefully_qualified_class)SyntaxError: Unable to find any JNI methods for org/chromium/ui/gfx/DeviceDisplayInfo.return JNIFromJavaSource(contents, fully_qualified_class, options)File "../base/android/jni_generator/jni_generator.py", line 538, in __init__fully_qualified_class)SyntaxError: Unable to find any JNI methods for org/chromium/ui/Clipboard.make: *** [/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni/DeviceDisplayInfo_jni.h] Error 1make: *** Waiting for unfinished jobs….make: *** [/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni/BitmapHelper_jni.h] Error 1make: *** [/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni/Clipboard_jni.h] Error 1

重新安装Xcode 5.0.2就可以编译通过,chromium has trouble building with 5.1

编译完成后,40G的分区被占用了30G。

在目录

/Volumes/android/out/target/product/generic

ls

android-info.txtroot

cacheinstalled-files.txtsymbols

cache.imgobjsystem

clean_steps.mkprevious_build_config.mksystem.img

dataramdisk.imguserdata.img

朋友,为了幸福,请你保持一副热爱生活的心肠,

Mac OS X下编译Android源码

相关文章:

你感兴趣的文章:

标签云: