打造專屬的Chromium for Android

打造專屬的Chromium for Android

自從寫(xiě)了上篇《chrome源碼研究啟航篇》后柑蛇,到今天已經(jīng)有了近一個(gè)月的時(shí)間芥挣,這段時(shí)間做了啥呢?研究到啥程度了呢耻台?后續(xù)節(jié)奏是否有調(diào)整呢空免?

針對(duì)上邊疑問(wèn),下面做逐個(gè)解答:

這段時(shí)間做了啥盆耽?

總體來(lái)講蹋砚,這段時(shí)間主要利用閑余在編譯和熟悉源碼扼菠,完成了對(duì)源碼的編譯和Gradle構(gòu)建,并將項(xiàng)目開(kāi)源坝咐,命名為:公英小蒲循榆。Git地址:https://github.com/derry/delion.git

具體的:

1,獲得源碼

和預(yù)期計(jì)劃的一樣墨坚,要深入研究Chrome首先要拿到完整的代碼秧饮,進(jìn)行完整的編譯,先從宏觀上搞清楚他的整體結(jié)構(gòu)泽篮,搞清楚他開(kāi)源的代碼是否完整可用盗尸,進(jìn)而確定下一步研究思路。

獲取源碼官方有文檔帽撑,http://dev.chromium.org/developers/how-tos/get-the-code泼各,獲取過(guò)程雖然等待時(shí)間漫長(zhǎng)但總體還算比較順利。fetch --nohooks android完成后油狂,代碼基本就都拉下來(lái)了历恐。過(guò)程中如果中斷了,可以執(zhí)行g(shù)client sync繼續(xù)专筷。

因?yàn)檫@時(shí)候使用的—nohooks弱贼,所以真正編譯需要的資源這時(shí)候還沒(méi)有下。這一步一般沒(méi)啥問(wèn)題磷蛹。

2吮旅,編譯

代碼下完后,下一步選擇編譯方式:使用GYP或GN味咳。

GYP的編譯方式出來(lái)的比較早(網(wǎng)上查找也基本都是GYP的編譯庇勃,我們現(xiàn)在項(xiàng)目里的編譯方式就是GYP,市面上開(kāi)源的如365瀏覽器也是槽驶,早期版本GYP方式確實(shí)可行责嚷,為什么說(shuō)早期可行看后邊)。我優(yōu)先選擇了使用GYP方式編掂铐,考慮這樣的話還有成功的案例可以參考罕拂。(后來(lái)為此決定付出了折騰一晚上的代價(jià))

根據(jù)官方說(shuō)明:

echo "{'GYP_DEFINES': 'OS=android target_arch=arm', }" > chromium.gyp_env

指定編譯類型。

然后運(yùn)行g(shù)client runhooks獲取真正的GYP需要的構(gòu)建所需的資源全陨。

正常情況執(zhí)行后會(huì)把需要的所有資源下載下來(lái)爆班。但是實(shí)踐過(guò)程中發(fā)現(xiàn)里面有坑。

經(jīng)歷的那些坑:

a辱姨,運(yùn)行g(shù)client runhooks

If you really want to run this, either run

`python build/gyp_chromium.py`explicitly by hand

or set the environment variableGYP_CHROMIUM_NO_ACTION=0.

b柿菩,You have PROXYvalues set in your environment, but gsutil in depot_tools does not (yet) obeythem.

c,設(shè)置GYP編譯雨涛,運(yùn)行g(shù)client

runhooks報(bào)文件找不到(most_visited_sites.cc,most_visited_sites.h)IOError:[Errno 2] No such file or directory:'browser/android/ntp/most_visited_sites.cc'

折騰一圈后總會(huì)回到找不到most_visited_sites.cc這個(gè)文件這枢舶。具體去查這個(gè)文件懦胞,在歷史版本里確實(shí)是有的,在新版本里也確實(shí)沒(méi)有祟辟。查看GIT記錄有發(fā)現(xiàn)有刪除了該文件的記錄医瘫,排除了各種可能后,最后決定放棄這種編譯方式旧困,現(xiàn)在Google也不推崇這種方式醇份,建議使用GN編譯。(推測(cè)是從google推崇了GN后,后續(xù)新的版本GYP的編譯腳本沒(méi)有同步上)

在GYP編譯的問(wèn)題上折騰了一晚無(wú)果后吼具,選擇GN來(lái)編譯(官方推薦使用該種方式僚纷,構(gòu)建效率大大提高且較強(qiáng)的支持增量編譯),根據(jù)官方文檔拗盒,使用GN編一路走下來(lái)非常順利怖竭。

開(kāi)始使用分支最新的代碼編,后來(lái)發(fā)現(xiàn)打出APK安裝運(yùn)行有問(wèn)題(beta版本不穩(wěn)定的原因)陡蝇,最后切到了最新Tag嘗試編譯(54.0.2789.1)痊臭。結(jié)果比較理想,編譯OK登夫,運(yùn)行OK广匙。

3,使用gradle構(gòu)建Chromium項(xiàng)目

完整編譯完整個(gè)項(xiàng)目還是比較興奮的恼策,但這只是開(kāi)始鸦致,如何構(gòu)建成開(kāi)發(fā)環(huán)境下可調(diào)的呢?(總不能靠sublime查著看涣楷,那只能滿足研究的需求分唾,解決不了要方便的調(diào)試和開(kāi)發(fā)的需求)

開(kāi)始考慮使用簡(jiǎn)單直接的方式,保持原有的源碼結(jié)構(gòu)狮斗,在各項(xiàng)目里添加gradle文件绽乔,順著腳本構(gòu)建的流程,把項(xiàng)目整理理順碳褒,實(shí)現(xiàn)整體的項(xiàng)目Control迄汛。

但是真正實(shí)踐起來(lái),感覺(jué)比較吃力骤视,主要原因是一方面涉及的構(gòu)建問(wèn)題太多,另外就是對(duì)項(xiàng)目代碼還不太了解鹃觉。并且中間因?yàn)榻鉀Q編譯問(wèn)題做得改動(dòng)不容易記錄,即使最后構(gòu)建成功,以后想升級(jí)版本也會(huì)比較被動(dòng)亚脆。所以折騰了一晚上,把整體架子搭出來(lái)但是編譯還各種問(wèn)題的時(shí)候沉填,果斷放棄了這條路。想一口氣吃個(gè)胖子真心沒(méi)那么容易佑笋。

還有一種方式就是:不基于原有的項(xiàng)目結(jié)構(gòu)搞了翼闹,單獨(dú)構(gòu)建一套簡(jiǎn)單的。通過(guò)摘取有用的資源蒋纬,直接使用編譯過(guò)程中生成的中間文件(jar,so,src等)猎荠,最小限度的改動(dòng)項(xiàng)目的原有代碼。這樣等整體構(gòu)建成功后蜀备,再根據(jù)研究進(jìn)度关摇,需要研究哪塊,把哪快源碼形式構(gòu)建進(jìn)來(lái)碾阁。

這樣可以最大限度的使用源碼自己構(gòu)建的結(jié)果输虱,減少代碼層面改動(dòng),在構(gòu)建成本上能省不少功夫脂凶。通過(guò)搭起大框架宪睹,填充編譯結(jié)果文件,然后遇到啥問(wèn)題解決啥問(wèn)題蚕钦。整體來(lái)講亭病,這條路絕對(duì)是最簡(jiǎn)單的。如果這條路走不通冠桃,也就沒(méi)得其他路可走了命贴。

通過(guò)開(kāi)始的分析發(fā)現(xiàn)了因?yàn)槊臻g的原因,資源放置分開(kāi)是比較合適的食听,比對(duì)了下最新的代碼胸蛛,結(jié)構(gòu)變化不大,所以最后延用了365的結(jié)構(gòu)樱报。(有365這個(gè)前行者感覺(jué)還是蠻好的葬项。雖然該踩的坑還是要自己去踩,但是比看不到方向的往前走感覺(jué)好多了迹蛤,由他證明了這條路是可行的民珍,并給出了思路,對(duì)此心存感激)

使用的項(xiàng)目的結(jié)構(gòu)如下:

4盗飒,編譯過(guò)程中趟的那些坑

構(gòu)建方向確定了嚷量,剩下就是一步步趟坑了(最耗時(shí)間的就耗在了這一步)

根據(jù)構(gòu)建過(guò)程中遇到的問(wèn)題順序:

1,org.chromium.base.BuildConfig找不到

修復(fù)方式:

創(chuàng)建base Modules逆趣,最后提示:NoSuchMethodError:org.chromium.base.BuildConfig.isMultidexEnabled

發(fā)現(xiàn)該文件是動(dòng)態(tài)生成的(具體參考

https://groups.google.com/a/chromium.org/forum/#!topic/chromium-checkins/auM6vUukpno

文件在Gen文件夾找到并拷貝

2蝶溶,缺少local_paks(ChromeApplication.Class中報(bào)array.locale_paks找不到)

修復(fù)方式:

新建locales.xml添加array.locale_paks,指定

@raw/zhcn

@raw/enus

3, floats找不到(NoClassDefFoundError:org.chromium.chrome.R$floats)

而代碼中查看floats作為resource type使用,編譯環(huán)境下直接報(bào)錯(cuò)

修復(fù)方式:floats改為dimen抖所。

本來(lái)想先不用代碼梨州,直接使用chrome_jar,但是因?yàn)閒loats的問(wèn)題不得不改代碼,所以接下來(lái)使用工程代碼替換chrome_jar田轧。

4暴匠,使用工程代碼替換chrome_jar會(huì)報(bào)一些列的類找不到,原因是很多配置類是在構(gòu)建過(guò)程總動(dòng)態(tài)生成的傻粘,所以想編譯成功必須要類倒進(jìn)來(lái)每窖。(缺的類有很多,但都在chrome_jar中能找到抹腿,所以處理起來(lái)比較簡(jiǎn)單)

5岛请,styleable.AppCompatTheme找不到

都使用最新的support包(具體參照項(xiàng)目)

6, ?NativeLibraries類找不到

發(fā)現(xiàn)該類是動(dòng)態(tài)生成的,新建文件警绩,把值填充進(jìn)去崇败。

7, Unable to load library:libaccessibility.cr.so

更新so文件,使用未壓縮的文件

8, Unable to instantiate

application com.android.tools.fd.runtime.BootstrapApplication:

Disable Instant Run(Preferences -> Build,

Execution, Deployment -> Instant Run -> Enable Instant Run)

9肩祥,locale_paks資源找不到:排查一圈發(fā)現(xiàn)問(wèn)題出現(xiàn)在問(wèn)題2的修復(fù)上后室,通過(guò)搜腳本(locale_pak_resources.py)發(fā)現(xiàn)需要文件小寫(xiě),并改'-’變’_’ 最終改資源名需為“zh_cn.lpak”,”en_us.lpak"

10混狠,Suppressed:java.lang.ClassNotFoundException: org.chromium.mojom.device.BatteryMonitor

引入相應(yīng)文件

解決上述問(wèn)題后岸霹,編譯運(yùn)行,OK一切正常将饺。

5贡避,解決了完整編譯的工作,下面就是打造專屬瀏覽器了

制定包名:com.delion.browser

瀏覽器命名:公英小蒲

取名公英小蒲予弧,寓意該項(xiàng)目是基于Chromium衍生的一枚“蒲公英“的種子刮吧,希望能秉承Chromium的開(kāi)源精神和強(qiáng)大的技術(shù)基因,以及做為種子的傳播使命掖蛤,在國(guó)內(nèi)生根發(fā)芽杀捻,茁壯成長(zhǎng),能夠?qū)⑶把氐南嚓P(guān)知識(shí)分享擴(kuò)散出去蚓庭,應(yīng)用在更多的場(chǎng)景和領(lǐng)域致讥。

至此,公英小蒲瀏覽器正式誕生器赞。

二垢袱,目前研究到啥程度了呢?

所謂萬(wàn)事開(kāi)頭難港柜,目前階段還出在剛開(kāi)完了頭的階段惶桐。實(shí)現(xiàn)了項(xiàng)目的完整編譯,并將項(xiàng)目開(kāi)源。

剩下的就是一步步分析和定制了姚糊。當(dāng)然定期跟進(jìn)最新代碼也是必不可少的工作。

過(guò)程中熟悉了Chromium源碼的整體結(jié)構(gòu)授舟,但也感受到了他的發(fā)展速度救恨,相比對(duì)比早期的版本,他的代碼的改動(dòng)量和頻率都還是很大的释树。萬(wàn)里長(zhǎng)征這才剛剛開(kāi)始肠槽。

過(guò)程中遇到的問(wèn)題的前期修復(fù)主要靠全局查找,到后期發(fā)現(xiàn)順著GN的構(gòu)建流程是最有效的奢啥,很多中間文件配置文件都是通過(guò)腳本動(dòng)態(tài)生成的秸仙。順著腳本的實(shí)現(xiàn)思路走,是最有效的桩盲。相關(guān)構(gòu)建資料目前可以說(shuō)還沒(méi)有寂纪,要縷順構(gòu)建過(guò)程,腳本就是最好的老師赌结。而通過(guò)他們也可以看出捞蛋,超過(guò)百人的開(kāi)發(fā)團(tuán)隊(duì)去維護(hù)的項(xiàng)目,強(qiáng)大的腳本能力是必不可少的柬姚。所幸這點(diǎn)是我的強(qiáng)項(xiàng)(Ant構(gòu)建拟杉,Gradle構(gòu)建,Python腳本等在平時(shí)的項(xiàng)目管理過(guò)程中都會(huì)用到量承,所以煉出來(lái)了)搬设。

后邊用到腳本的地方還會(huì)很多,比如:

1撕捍,最理想功能的改動(dòng)就是靠腳本去改拿穴,這樣以后更新代碼,沖突會(huì)降到最低卦洽。

2贞言,最理想的構(gòu)建過(guò)程也是靠腳本,只要能人工操作的流程阀蒂,需要頻繁操作的该窗,都可以寫(xiě)成腳本,操作成本降到最低蚤霞。

針對(duì)這一點(diǎn)酗失,后續(xù)的各功能開(kāi)發(fā)和維護(hù)過(guò)程中會(huì)逐步的體現(xiàn)出來(lái)。

三昧绣,后續(xù)節(jié)奏是否會(huì)有調(diào)整呢规肴?

目前來(lái)看節(jié)奏不會(huì)變,延續(xù)開(kāi)始構(gòu)想的思路,以研究和解決問(wèn)題為目的拖刃,過(guò)程會(huì)比較難删壮,但會(huì)做到底。

另外講一下要把過(guò)程寫(xiě)出來(lái)和開(kāi)源的目的:

1兑牡,項(xiàng)目龐大央碟,不是一個(gè)人就可以完全Hold住的,學(xué)習(xí)的速度趕不上谷歌一百多號(hào)技術(shù)開(kāi)發(fā)變化的速度均函,需要一幫志同道合的人一起研究一起弄亿虽。共同成長(zhǎng)。(最好是有這方面基礎(chǔ)在研究這方面的人)

2苞也,準(zhǔn)備把專屬的項(xiàng)目《公英小蒲》持續(xù)做下去洛勉,無(wú)任何商業(yè)目的和功利摻雜,自驅(qū)動(dòng)的純把瀏覽器作為一個(gè)中立的工具性產(chǎn)品去打磨如迟。以簡(jiǎn)單好用為第一宗旨去發(fā)展收毫。打造專屬品牌。

3氓涣,瀏覽器開(kāi)發(fā)涉及的技術(shù)非常廣牛哺,有很高的研究?jī)r(jià)值,對(duì)谷歌而言這也是戰(zhàn)略級(jí)的產(chǎn)品劳吠。跟進(jìn)他的發(fā)展節(jié)奏持續(xù)研究和開(kāi)發(fā)引润,可以接觸到谷歌第一手的技術(shù)資料和使用這樣的世界級(jí)應(yīng)用框架。

4,《公英小蒲》項(xiàng)目構(gòu)建初衷是方便研究Chromium源碼痒玩,推廣相關(guān)前沿技術(shù)淳附,構(gòu)建獨(dú)立應(yīng)用的同時(shí),將成果應(yīng)用到其他項(xiàng)目蠢古。目前筆者負(fù)責(zé)著國(guó)內(nèi)某手機(jī)瀏覽器的項(xiàng)目管理和開(kāi)發(fā)工作奴曙。針對(duì)線上應(yīng)用的業(yè)務(wù)和實(shí)現(xiàn)技術(shù)不便透露(有研究成果也會(huì)體現(xiàn)到公司專利上),這也是為什么之前博客不撰寫(xiě)這方面文章的原因草讶,技術(shù)交流沒(méi)有問(wèn)題洽糟。《公英小蒲》基于最新的chromium構(gòu)建堕战,基于源碼分享源碼坤溃,秉承開(kāi)源開(kāi)放的天性,最為適合作為研究性應(yīng)用開(kāi)源嘱丢。

具體的:

1薪介,完整編譯構(gòu)建chromium_Android項(xiàng)目

2,項(xiàng)目開(kāi)源越驻,攜手更多的同行者

3汁政,業(yè)務(wù)定制道偷,通過(guò)分析各主要模塊,并實(shí)現(xiàn)痛點(diǎn)問(wèn)題的逐步定制记劈。(過(guò)程都體現(xiàn)在開(kāi)源項(xiàng)目上)

4勺鸦,深度挖掘,針對(duì)V8引擎目木,硬件加速祝旷,VR等逐步挖掘

附CSDN地址:http://blog.csdn.net/yangdeli888/article/details/52060088

歡迎關(guān)注博客:delion研發(fā)專欄

歡迎關(guān)注項(xiàng)目:公英小蒲(delion)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嘶窄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌距贷,老刑警劉巖柄冲,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異忠蝗,居然都是意外死亡现横,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門阁最,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)戒祠,“玉大人,你說(shuō)我怎么就攤上這事速种〗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵配阵,是天一觀的道長(zhǎng)馏颂。 經(jīng)常有香客問(wèn)我,道長(zhǎng)棋傍,這世上最難降的妖魔是什么救拉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮瘫拣,結(jié)果婚禮上亿絮,老公的妹妹穿的比我還像新娘。我一直安慰自己麸拄,他們只是感情好派昧,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著感帅,像睡著了一般斗锭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上失球,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天岖是,我揣著相機(jī)與錄音帮毁,去河邊找鬼。 笑死豺撑,一個(gè)胖子當(dāng)著我的面吹牛烈疚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播聪轿,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼爷肝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陆错?” 一聲冷哼從身側(cè)響起灯抛,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎音瓷,沒(méi)想到半個(gè)月后对嚼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绳慎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年纵竖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杏愤。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靡砌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出珊楼,到底是詐尸還是另有隱情通殃,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布亥曹,位于F島的核電站邓了,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏媳瞪。R本人自食惡果不足惜骗炉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛇受。 院中可真熱鬧句葵,春花似錦、人聲如沸兢仰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)把将。三九已至轻专,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間察蹲,已是汗流浹背请垛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工催训, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宗收。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓漫拭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親混稽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子采驻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,322評(píng)論 25 707
  • 一起過(guò)年的第一天,睡到下午才起~
    NCNeverland閱讀 90評(píng)論 0 0
  • 你心里匈勋,有沒(méi)有秘密礼旅?肯定是有的吧?不是有那么一句話么洽洁,要掩飾多少秘密各淀,才能順利的過(guò)完一生。而你的那些秘密诡挂,有多少是...
    夜行醉歸閱讀 393評(píng)論 1 0
  • 兒時(shí)很喜歡結(jié)伴去偷 樓頂晾曬的鹽水花生 吃得津津有味 多年后 咸干花生成了配角 主角總是那一瓶接一瓶的...
    辣妹事多店閱讀 304評(píng)論 0 0