Chromium Android編譯指南 頂 原

先決條件

需要有一臺裝有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得靜態庫等。

參考文檔

Android Build Instructions

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章