1. 程式人生 > >Mac編譯android原始碼的坑

Mac編譯android原始碼的坑

Mac編譯android原始碼

因為專案需要在程式碼線上編譯app,想在mac上直接編譯,省時省力。不過,配置環境過程中遇到不少坑,現在逐一記錄下來。

主要有以下幾點:

  • android開發環境
  • 建立大小寫敏感的分割槽
  • MacPorts
  • Xcode
  • proguard
  • 其他坑
  1. android開發環境自不必說;
  2. mac本身對大小寫不敏感,但android原始碼編譯必須要對大小寫敏感,所以必須要建立一塊大小寫敏感的分割槽,以供在上面進行編譯;
  3. Xcode是個坑,版本不同會帶來一些問題;
  4. MacPorts安裝比較簡單;
  5. 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 [[email protected]121a9334] (Can't process class [okhttp3/Address.class] (Unsupported version number [51.0] for class format))
其實這就是proguard版本過舊的問題,需要替換原始碼目錄下的proguard版本:/external/proguard

我這裡把4.4的替換為了5.21,可以暫時解決此問題。
替換之後同樣會導致其他問題,最好還是保持原有版本,需要的時候再替換。

其他坑

  1. 錯誤: 程式包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”換成你自己的版本