1. 程式人生 > >[chromium][browser][idea][closed] Part1 : 把AwContent和Chrome_shell編譯成一個so

[chromium][browser][idea][closed] Part1 : 把AwContent和Chrome_shell編譯成一個so

因為AwContent和ChromeShell各有一套ContentMainDelegate,所以要選擇以誰為基礎,

這裡為確保ChromeShell端的完整性,以ChromeShell為主編譯物件,然後把AwContent的東西加進去


以Android4.4.2的Chromium_org為例,所以編譯命令是ninja -C out/Release chromium_testshell

主動修改

1、先解決gyp編譯指令碼問題:

chrome\chrome_android.gypi中新增上Awcontent的編譯target

'../android_webview/android_webview.gyp:android_webview_common',


2、加上JNI註冊部分

chrome\browser\android\chrome_jni_registrar.cc中新增

android_webview\native\android_webview_jni_registrar.h

  { "AndroidWebview",
    android_webview::RegisterJni },


3、ChromeMainDelegateTestShellAndroid和aw_main_delegate的結合,把aw_main_delegate的內容合入ChromeMainDelegateTestShellAndroid中

從CreateContentBrowserClient到CreateWebPreferencesPopulater


4、AwContentBrowserClient pulic chrome_content_browser_client 1)刪除重複CreateBrowserMainParts 2)增加static的getJniDependencyFactory,同時把構造中的new AwBrowserContext去掉。 3)AwContentBrowserClient::RenderProcessHostCreated中去掉CHECK,否則後面執行的時候奔潰啦
5、android_webview\renderer\aw_content_renderer_client.h aw_content_renderer_client public  from  chrome_content_renderer_client.h
1)visited_link_slave_定義重複,去掉aw_content_renderer_client的visited_link_slave_
2)刪除重複實現GetDefaultEncoding到IsLinkVisited 3)RenderThreadStarted加上chrome域的執行,刪除visited_link_slave_執行 4)RenderViewCreated加上chrome域的執行,並去掉print部分

編譯錯誤

1、去掉android_webview.gyp:android_webview_common中下面重複編譯程式碼

Printing部分、content_app_both和aw_main_delegate

2、android_webview\common\android_webview_message_generator.h中把重複的print message也去掉

3、android_webview\native\aw_form_database.cc中刪除重複定義

AutofillWebDataService::FromBrowserContext

4、android_webview\native\aw_pdf_exporter.cc中的編譯錯誤,先刪除ExportToPdf的實現

5、native\aw_web_contents_delegate 從chrome_web_contents_delegate_android去繼承

刪除:GetJavaScriptDialogManager 和 FindReply

CloseContents的時候加上Chrome域的CloseContents

FilesSelectedInChooser中間部分編譯錯誤,先註釋掉實現程式碼

cc檔案中刪除:LazyInstance<AwJavaScriptDialogManager>::Leaky兩行


啟動錯誤

1、BrowserContext建立問題

因為chome-shell建立的是ProfileImpl,所以要把AwBrowserContext部分合入

(應該是AwBrowserContext  public from ProfileImpl)


2、存在一個建立時機問題

要在Profile CreateProfile的時候改為AwBrowserContext,但是這樣程式碼結構就變得非常差勁


3、AwBrowserContext構造最後加上

InitializeBeforeThreadCreation();
PreMainMessageLoopRun();


4、還存在JniDependencyFactory* native_factory取不到的問題,用chrome_content_browser_client增加的static方法


5、刪除從GetRequestContext到GetResourceContext的重複實現部分



經過上面的整合,編譯出來的so運行於android_webview_apk是ok的,能否再用於chromium_testshell還沒驗證。

接下來就是通過更改渲染機制,把SurfaceView用起來,以提高效能。