Chromium Android编译指南
先決條件
需要有一臺(tái)裝有Linux操作系統(tǒng)環(huán)境的主機(jī)來(lái)做編譯,這個(gè)環(huán)境的搭建配置方法可以參考Linux-specific build instructions。目前還不支持在其它(Mac/Windows)平臺(tái)上來(lái)為Android編譯Chromium。
獲取代碼
首先需要下載并安裝depot_tools包。在一個(gè)適當(dāng)?shù)媚夸浵耤lone depot_tools包:
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git然后修改.bashrc文件,將depot_tools的路徑加進(jìn)環(huán)境變量PATH中:
export PATH=$PATH:/path/to/depot_tools如果從來(lái)沒(méi)有下載過(guò)Chromium的代碼的話,為源碼創(chuàng)建一個(gè)文件夾并下載源碼:
mkdir ~/chromium && cd ~/chromium fetch --nohooks android # This will take 30 minutes on a fast connection如果之前下載過(guò)Linux版的Chromium代碼,則可以通過(guò)給.gclient文件(在上面的源碼根目錄下,即~/chromium目錄)附上target_os = ['android']來(lái)添加對(duì)Android的支持:
cat > .gclient <<EOFsolutions = [ ...existing stuff in here... ]target_os = [ 'android' ] # Add this to get Android stuff checked out. EOF執(zhí)行g(shù)client sync 來(lái)獲取Android版的代碼:
gclient sync(可選)下載LKGR
如果想編譯某個(gè)良好狀態(tài)下的Chromium,則可以同步LKGR(“l(fā)ast known good revision”)的代碼。可以在這里找到它,還可以在這里找到最近的100個(gè)版本。然后運(yùn)行:
gclient sync --nohooks -r <lkgr-sha1>這不是一個(gè)典型的開(kāi)發(fā)者工作流所需要的;而只是用于Chromium的一次性編譯。
為編譯做配置
Chromium的整個(gè)編譯流程為:通過(guò)GYP或GN產(chǎn)生最終編譯所需的ninja配置文件,然后由ninja根據(jù)產(chǎn)生的這些配置文件做編譯。為Android編譯Chromium可以通過(guò)GYP或GN來(lái)做配置,但GN增量編譯最快,不久之后這也將成為唯一的編譯配置方式。它們都是給Chromium的Android編譯產(chǎn)生ninja文件的元構(gòu)建系統(tǒng)。在構(gòu)建瀑布中這兩種構(gòu)建都會(huì)被經(jīng)常測(cè)試。
GYP配置 (已廢棄 -- 使用GN來(lái)代替)
如果你在使用GYP,則在與.gclient位置相同的文件夾下,創(chuàng)建一個(gè)名為‘chromium.gyp_env’的文件,其中具有如下的內(nèi)容:
echo "{ 'GYP_DEFINES': 'OS=android target_arch=arm', }" > chromium.gyp_env注意, “arm”是默認(rèn)的體系架構(gòu),它可以省略。如果是給x86或MIPS編譯,則可以將target_arch改成“ia32”或“mipsel”。
注意:如果在使用GYP_DEFINES環(huán)境變量,則它將覆蓋這個(gè)文件中的設(shè)置。或者清除它,或者把它設(shè)置為上面的值,然后執(zhí)行g(shù)client runhooks。
參考 build/android/developer_recommended_flags.gypi 來(lái)了解其它建議的GYP設(shè)置。創(chuàng)建了chromium.gyp_env之后,你需要運(yùn)行下面的命令來(lái)為gyp文件更新工程。你也需要在添加新的gyp文件、更新gyp文件或同步代碼庫(kù)時(shí),再次執(zhí)行這個(gè)命令。
gclient runhooks這將下載更多東西,并提示你接受Terms of Service for Android SDK packages。
GN配置(建議采用)
如果你使用GN,則創(chuàng)建一個(gè)編譯目錄,并通過(guò)如下命令設(shè)置編譯標(biāo)記:
$ gn args out/Default直接執(zhí)行這個(gè)命令會(huì)報(bào)錯(cuò),比如:
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配置那樣,需要執(zhí)行 gclient runhooks 。
可以選擇out目錄內(nèi)其它的名字來(lái)替代out/Default。但不要使用GYP的out/Debug或out/Release,它們可能與GYP構(gòu)建沖突。
同時(shí)要知道某些腳本(比如tombstones.py,adb_gdb.py)需要設(shè)置CHROMIUM_OUTPUT_DIR=out/Default。
這個(gè)命令(gn args out/Default)將用GN構(gòu)建參數(shù)文件啟動(dòng)編輯器。在這個(gè)文件中添加:
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”。以后可以在那個(gè)目錄下重新運(yùn)行g(shù)n args來(lái)編輯標(biāo)記。參考GN構(gòu)建配置來(lái)了解你可能想要設(shè)置的其它標(biāo)記。
這個(gè)命令啟動(dòng)系統(tǒng)默認(rèn)的編輯器,創(chuàng)建chromium/src/out/Default/args.gn文件,并根據(jù)這個(gè)文件的內(nèi)容來(lái)產(chǎn)生ninja文件。也就是在對(duì)這個(gè)文件做了修改,保存退出之后,gn會(huì)根據(jù)這個(gè)文件的內(nèi)容來(lái)產(chǎn)生ninja文件。
但這個(gè)文件本身不一定非要通過(guò)系統(tǒng)默認(rèn)的編輯器來(lái)創(chuàng)建,也可以用任意一款自己用起來(lái)順手的編輯器創(chuàng)建。只是在創(chuàng)建完了之后,需要再次運(yùn)行g(shù)n args out/Default,然后保存直接退出,以便于讓gn工具產(chǎn)生后續(xù)編譯所需要的ninja文件。
安裝依賴
通過(guò)如下的命令來(lái)更新編譯所需的系統(tǒng)包:
./build/install-build-deps-android.sh還要確保OpenJDK 1.7被選為了默認(rèn)得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下產(chǎn)生這些模塊的BUILD.gn文件中定義得targets,比如net和url的共享庫(kù),zlib得靜態(tài)庫(kù)等。
參考文檔
Android Build Instructions
總結(jié)
以上是生活随笔為你收集整理的Chromium Android编译指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: EventBus设计与实现分析——订阅者
- 下一篇: Netty HTTP on Androi