先決條件
需要有一臺裝有Linux操作系統環境的主機來做編譯,這個環境的搭建配置方法可以參考Linux-specific build instructions。目前還不支持在其它(Mac/Windows)平臺上來爲Android編譯Chromium。
獲取代碼
首先需要下載並安裝depot_tools包。在一個適當得目錄下clone depot_tools包:
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
然後修改.bashrc文件,將depot_tools的路徑加進環境變量PATH中:
export PATH=$PATH:/path/to/depot_tools
如果從來沒有下載過Chromium的代碼的話,爲源碼創建一個文件夾並下載源碼:
mkdir ~/chromium && cd ~/chromium
fetch --nohooks android # This will take 30 minutes on a fast connection
如果之前下載過Linux版的Chromium代碼,則可以通過給.gclient文件(在上面的源碼根目錄下,即~/chromium
目錄)附上target_os = ['android']來添加對Android的支持:
cat > .gclient <<EOF
solutions = [ ...existing stuff in here... ]
target_os = [ 'android' ] # Add this to get Android stuff checked out.
EOF
執行gclient sync 來獲取Android版的代碼:
gclient sync
(可選)下載LKGR
如果想編譯某個良好狀態下的Chromium,則可以同步LKGR(“last known good revision”)的代碼。可以在這裏找到它,還可以在這裏找到最近的100個版本。然後運行:
gclient sync --nohooks -r <lkgr-sha1>
這不是一個典型的開發者工作流所需要的;而只是用於Chromium的一次性編譯。
爲編譯做配置
Chromium的整個編譯流程爲:通過GYP或GN產生最終編譯所需的ninja配置文件,然後由ninja根據產生的這些配置文件做編譯。爲Android編譯Chromium可以通過GYP或GN來做配置,但GN增量編譯最快,不久之後這也將成爲唯一的編譯配置方式。它們都是給Chromium的Android編譯產生ninja文件的元構建系統。在構建瀑布中這兩種構建都會被經常測試。
GYP配置 (已廢棄 -- 使用GN來代替)
如果你在使用GYP,則在與.gclient位置相同的文件夾下,創建一個名爲‘chromium.gyp_env’的文件,其中具有如下的內容:
echo "{ 'GYP_DEFINES': 'OS=android target_arch=arm', }" > chromium.gyp_env
注意, “arm”是默認的體系架構,它可以省略。如果是給x86或MIPS編譯,則可以將target_arch改成“ia32”或“mipsel”。
注意:如果在使用GYP_DEFINES環境變量,則它將覆蓋這個文件中的設置。或者清除它,或者把它設置爲上面的值,然後執行gclient runhooks
。
參考 build/android/developer_recommended_flags.gypi 來了解其它建議的GYP設置。創建了chromium.gyp_env之後,你需要運行下面的命令來爲gyp文件更新工程。你也需要在添加新的gyp文件、更新gyp文件或同步代碼庫時,再次執行這個命令。
gclient runhooks
這將下載更多東西,並提示你接受Terms of Service for Android SDK packages
。
GN配置(建議採用)
如果你使用GN,則創建一個編譯目錄,並通過如下命令設置編譯標記:
$ gn args out/Default
直接執行這個命令會報錯,比如:
hanpfei0306@hanpfei0306:/media/data/Projects/OpenSource/chromium/src$ gn args out/Default
gn.py: Could not find gn executable at: /media/data/Projects/OpenSource/chromium/src/buildtools/linux64/gn
提示找不到chromium/src/buildtools/linux64/gn
命令,如同GYP配置那樣,需要執行 gclient runhooks 。
可以選擇out目錄內其它的名字來替代out/Default。但不要使用GYP的out/Debug或out/Release,它們可能與GYP構建衝突。
同時要知道某些腳本(比如tombstones.py,adb_gdb.py)需要設置CHROMIUM_OUTPUT_DIR=out/Default。
這個命令(gn args out/Default
)將用GN構建參數文件啓動編輯器。在這個文件中添加:
target_os = "android"
target_cpu = "arm" # (default)
is_debug = true # (default)
# Other args you may want to set:
is_component_build = true
is_clang = true
symbol_level = 1 # Faster build with fewer symbols. -g1 rather than -g2
enable_incremental_javac = true # Much faster; experimental
也可以指定target_cpu的值爲“x86”和“mipsel”。以後可以在那個目錄下重新運行gn args來編輯標記。參考GN構建配置來了解你可能想要設置的其它標記。
這個命令啓動系統默認的編輯器,創建chromium/src/out/Default/args.gn文件,並根據這個文件的內容來產生ninja文件。也就是在對這個文件做了修改,保存退出之後,gn會根據這個文件的內容來產生ninja文件。
但這個文件本身不一定非要通過系統默認的編輯器來創建,也可以用任意一款自己用起來順手的編輯器創建。只是在創建完了之後,需要再次運行gn args out/Default
,然後保存直接退出,以便於讓gn工具產生後續編譯所需要的ninja文件。
安裝依賴
通過如下的命令來更新編譯所需的系統包:
./build/install-build-deps-android.sh
還要確保OpenJDK 1.7被選爲了默認得JDK:
sudo update-alternatives --config javac
sudo update-alternatives --config java
sudo update-alternatives --config javaws
sudo update-alternatives --config javap
sudo update-alternatives --config jar
sudo update-alternatives --config jarsigner
同步子目錄
gclient sync
編譯
模塊編譯,如:
$ ninja -C out/Default/ net
$ ninja -C out/Default/ url
$ ninja -C out/Default/ zlib
這將在chromium/src/out/Default
下產生這些模塊的BUILD.gn文件中定義得targets,比如net和url的共享庫,zlib得靜態庫等。