您的位置:首页 > 移动开发 > Android开发

Mac OS X下编译Android源码

2014-04-02 11:25 579 查看
根据Android官网提供的方法设置编译环境,编译源码

对于Andrid无法下载的问题,可以移步清华下载AOSP,具体链接:https://mirrors.tuna.tsinghua.edu.cn/help/#AOSP

一. 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,这里没用安装官网文档来,具体原因你懂得
$ curl https://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设置,可以参阅
http://stackoverflow.com/questions/18039555/module-already-defined-when-compiling-android-4-3-source-code

unset NDK_ROOT

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

target thumb C++: libstagefright_amrnbenc <= frameworks/av/media/libstagefright/codecs/amrnb/enc/src/spstproc.cpp
target thumb C++: libstagefright_amrnbenc <= frameworks/av/media/libstagefright/codecs/amrnb/enc/src/ton_stab.cpp
Gyp timestamp: /Users/lo/Documents/10-repos/02-cyanogenmod/new/android/system/out/target/product/mako/obj/GYP/net_net_resources_gyp_intermediates/net_resources.stamp
Gyp timestamp: /Users/lo/Documents/10-repos/02-cyanogenmod/new/android/system/out/target/product/mako/obj/GYP/webkit_webkit_resources_gyp_intermediates/webkit_resources.stamp
Gyp timestamp: /Users/lo/Documents/10-repos/02-cyanogenmod/new/android/system/out/target/product/mako/obj/GYP/skia_skia_library_gyp_intermediates/skia_library.stamp
Gyp 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.stamp
mkdir -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.txt
mkdir -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.txt
mkdir -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.txt
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>
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 main
sys.exit(main(sys.argv))
File "../base/android/jni_generator/jni_generator.py", line 1099, in main
sys.exit(main(sys.argv))
File "../base/android/jni_generator/jni_generator.py", line 1099, in main
GenerateJNIHeader(input_file, output_file, options)
File "../base/android/jni_generator/jni_generator.py", line 1016, in GenerateJNIHeader
GenerateJNIHeader(input_file, output_file, options)
File "../base/android/jni_generator/jni_generator.py", line 1016, in GenerateJNIHeader
input_file, options)
File "../base/android/jni_generator/jni_generator.py", line 570, in CreateFromFile
input_file, options)
File "../base/android/jni_generator/jni_generator.py", line 570, in CreateFromFile
GenerateJNIHeader(input_file, output_file, options)
File "../base/android/jni_generator/jni_generator.py", line 1016, in GenerateJNIHeader
return 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 CreateFromFile
fully_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 1
make: *** Waiting for unfinished jobs....
make: *** [/Users/myuser/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni/BitmapHelper_jni.h] Error 1
make: *** [/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.txt fake_packages
root
cache installed-files.txtsymbols
cache.img obj system
clean_steps.mk previous_build_config.mksystem.img
data ramdisk.imguserdata.img
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: