Mac编译android源码
因为项目需要在代码线上编译app,想在mac上直接编译,省时省力。不过,配置环境过程中遇到不少坑,现在逐一记录下来。
主要有以下几点:
- android开发环境
- 创建大小写敏感的分区
- MacPorts
- Xcode
- proguard
- 其他坑
- android开发环境自不必说;
- mac本身对大小写不敏感,但android源码编译必须要对大小写敏感,所以必须要创建一块大小写敏感的分区,以供在上面进行编译;
- Xcode是个坑,版本不同会带来一些问题;
- MacPorts安装比较简单;
- proguard这个坑藏得比较深;
创建大小写敏感的分区
创建分区:
sudo hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 55g ~/android.dmg
55g是我自己分的大小,官方推荐至少40g,硬盘空间足够的尽量分得大一些;
加载分区:
sudo hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android
打开分区:
cd /Volumes/android/
MacPorts
两步搞定:
1.下载安装MacPorts;
2.通过MacPorts安装相应工具:
- POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
- 这一步可能比较耗时,耐心等待
源码下载
代码线是通过公司vpn用repo下载的
Xcode版本
我这里要编译的是android4.4,对应的是Xcode5,然而我的mac上是Xcode7;
经过我的各种尝试和google,得出结论:Xcode7不适合编译4.4,改来改去太麻烦,不如降级;
然后我就卸载Xcode7,下载并安装Xcode6,并源码中对以下文件作修改:
build/core/combo/HOST_darwin-x86.mk
mac_sdk_versions_supported := 10.9 10.10
ifeq ($(mac_sdk_version),10.9)
Mac SDK 10.8 no longer has stdarg.h, etc
host_toolchain_header := $(HOST_TOOLCHAIN_ROOT)/lib/gcc/i686-apple
darwin$(gcc_darwin_version)/4.2.1/include
HOST_GLOBAL_CFLAGS += -isystem $(host_toolchain_header)
endif
其实就是修改相关mac_sdk_version,因为4.4是基于Xcode5的,相关mac_sdk_version是不同的;
总结:Xcode最好按需选择版本
开始编译
进入新分区
cd /Volumes/android/
打开代码线
cd CodeLineName/
开始编译
source build/envsetup.sh
lunch(记得选对平台,不然出现各种问题就和我一样了)
make/mmm/mm
proguard遇到的坑
其他项目都正常编译成功了,但是当我编译一个使用了okhttp3的项目的时候,出现以下错误:
Error: Can't read [proguard.ClassPathEntry@121a9334] (Can't process class [okhttp3/Address.class] (Unsupported version number [51.0] for class format))
其实这就是proguard版本过旧的问题,需要替换源码目录下的proguard版本:/external/proguard
我这里把4.4的替换为了5.21,可以暂时解决此问题。
替换之后同样会导致其他问题,最好还是保持原有版本,需要的时候再替换。
其他坑
- 错误: 程序包com.sun.javadoc不存在;错误: 找不到符号
错误分析:jdk路径有问题
正确的(OSX下):
export PATH=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin:$PATH
错误的:
export PATH=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/:$PATH
区别就在于bin后面有没有“/”,“jdk1.7.0_79.jdk”换成你自己的版本