前置条件
- macOS Sierra (10.12.3)
- Homebrew (1.1.9 或更高版本)
- Xcode (8.2.1 或更高版本)
- Xcode (5.1.1 只能是此版本)
准备环境
1.创建大小写区分的磁盘分区
1 2 3 4 5 6 7 |
$ cd ~ $ mkdir Android $ cd Android $ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 80g android.dmg |
2.挂载刚刚创建好的分区
1 |
$ hdiutil attach ~/Android/android.dmg.sparseimage -mountpoint /Volumes/android |
3. 切换到刚刚挂载的分区
1 |
$ cd /Volumes/android |
4.安装最新版本的repo
1 2 3 |
$ brew update $ brew install repo |
5. 安装依赖的第三方应用
1 2 3 4 5 |
$ brew update $ brew install GnuPG $ brew install gnupg2 |
6.下载并安装Xcode 5.1.1
此版本,我们只是使用其中的SDK
,其他的,我们使用8.2.1中的工具,注意,我们只能使用MacOSX10.8.sdk才能顺利编译通过。
下载地址 http://adcdownload.apple.com/Developer_Tools/xcode_5.1.1/xcode_5.1.1.dmg
下载之后,安装之前我们先把8.2.1的Xcode重命名一下,稍后我们再修改回来即可。我们安装之后,提取Xcode 5.1.1
版本里面的"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk",然后拷贝到Xcode 8.2.1 版本的"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"目录下面。操作完成后,可以删除Xcode 5.1.1
。
也可以从phracker/MacOSX-SDKs 获取已经提取好了的版本。
执行如下命令,使得低版本的SDK生效。
1 |
$ sudo /usr/libexec/PlistBuddy -c "Set :MinimumSDKVersion 10.8" /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist |
如此操作的原因有两条:
(1)在macOS Sierra (10.12.3)上,Xcode 5.1.1
无法执行,因此没办法做到两个版本并存.
(2)如果通过修改代码来把代码中限制的系统版本调整到10.8版本以上,则GCC存在BUG,导致编译无法正常通过,具体的BUG参考
libgcc: error: unknown value '10.10' of -mmacosx-version-min
7.下载Android-5.1.1_r38
源代码(此处请准备梯子,或者自己从国内源进行替换)
1 2 3 4 5 6 7 |
$ mkdir Android_Source $ cd Android_Source $ repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r38 $ repo sync |
编译代码
1.设置编译需要的环境信息
1 |
$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer |
2.切换Java版本到1.7
1 |
$ export JAVA_HOME=$(/usr/libexec/java_home -v 1.7) |
3.清理代码,为编译准备干净的环境
1 |
$ make clobber |
4.引入编译环境变量
1 |
$ source build/envsetup.sh |
5.设置编译目标,此处我们指定编译ARM
下的完整调试版本
1 |
$ lunch aosp_arm-eng |
6.如果需要跟踪调试代码,建议编译为调试类型
1 |
$ export TARGET_BUILD_TYPE=debug |
7.编译
1 |
$ make -j8 |
注意此处如果发生编译失败,原因基本上是编译顺序导致的引用出错,也就是某些模块还没有编译完成,其他模块已经开始尝试链接,导致依赖错误,此时只要把多线程并发编译修改成单线程编译即可,即直接执行
1 |
$ make |
运行镜像
1 2 3 4 5 6 7 8 9 10 11 |
$ cd /Volumes/android/Android_Source $ export ANDROID_BUILD_TOP=/Volumes/android/Android_Source $ export PATH=$PATH:$ANDROID_BUILD_TOP/out/host/darwin-x86/bin $ export ANDROID_SWT=$ANDROID_BUILD_TOP/out/host/darwin-x86/framework $ export ANDROID_PRODUCT_OUT=$ANDROID_BUILD_TOP/out/debug/target/product/generic $ ./prebuilts/android-emulator/darwin-x86_64/emulator -system ./out/debug/target/product/generic/system.img -data ./out/debug/target/product/generic/data.img -ramdisk ./out/debug/target/product/generic/ramdisk.img |
上面运行起来的镜像是从/Volumes/android/Android_Source/out/debug/target/product/generic/hardware-qemu.ini
即可读取配置信息的,但是这个文件直接修改无效,我们如果需要修改参数,只能从启动参数中设置。
比如我们如果需要增大内存,开启GPU
的支持,则执行如下命令:
1 |
$ ./prebuilts/android-emulator/darwin-x86_64/emulator -system ./out/debug/target/product/generic/system.img -data ./out/debug/target/product/generic/data.img -ramdisk ./out/debug/target/product/generic/ramdisk.img -gpu on -memory 2048 |
参考链接
- Requirements | Android Open Source Project
- Mac OSX 下如何便捷地在两个 Java 版本之间进行切换呢?机器上装了 Java6、Java7 和 Java8
- Mac 10.10 编译android 4.4.4 for nexus
- Build Android 5.1.1 on OSX 10.10 Yosemite With Xcode7
- Xcode 8 with older Base SDK
- Xcode 7.3 not able to use older SDKs
- phracker/MacOSX-SDKs
- Xcode - Support - AppleDeveloper
- libgcc: error: unknown value '10.10' of -mmacosx-version-min
- ibgcc-devel @5-20140824_1: error: unknown value '10.10' of -mmacosx-version-min
- Mac OS X 10.10.3下android-5.1.1_r9 源码下载与编译
- android编译源码生成emulator
- 使用HAXM 与 KVM 给emulator加速
- android大项目运行中出现问题汇总
非常感谢,这边文章对我帮助很大