1. 程式人生 > >第三方瀏覽器核心嵌入一、Crosswalk

第三方瀏覽器核心嵌入一、Crosswalk

本篇分為三部分:

  1. 介紹Crosswalk背景

  2. 介紹Crosswalk整合步驟

  3. 為了減小體積,僅整合相容ARM的Crosswalk(針對X86同理)

PART_A Crosswalk背景介紹

Web技術的優勢可想而知.

  1. 當下app開發模式偏向Android/IOS原生殼+Web. 瀏覽器核心效能至關重要
  2. 這樣開發的優勢很明顯,當出現bug或者app要升級時不需要使用者下載安裝包,而是在伺服器後臺維護即可,極大的增強了開發的靈活性和使用者粘性
  • Crosswalk的優勢

    1. 採用Chromium核心並持續更新維護,使基於Crosswalk的Web應用充分享有Chromium的功能與效能優勢,以及較好的平臺一致性. 同時,支援最新的H5的API(WebGL,WebAudio,WebRTC,Gamepad,WebSocket,Presentation等)。並且在低端Android裝置上也能流暢執行

    2. 支援通過編寫原生的Java程式碼來建立新的Web API

    3. 支援與Cordova的整合(已有大量的成熟的API實現供開發者使用)

    4. 允許Web開發者將他們的應用打包成系統的應用安裝包,獲得與本地應用一致的體驗. 同時也支援多個應用同時使用一個Crosswalk庫的共享模式,僅當應用第一次啟動並且發現系統還沒有相應的Crosswalk庫時才提示使用者下載安裝. 目前是大多數情況下開發者將Crosswalk直接嵌入到應用本身。在這種嵌入模式下Web應用開發者可以完全控制Crosswalk的更新

  • 與WebView的區別

    • 系統自帶的WebView元件在H5的解析能力上相比Safari for iOS、Chrome for Android都要差很多. 另外在Android平臺上,由於系統碎片化比較嚴重,不同Android版本的WebView的H5解析能力也有較大差異,導致相應的HTML5應用一致性難以保證. 作為第三方的獨立引擎Crosswalk有較好的H5性、功能支援,較好的平臺一致性,以及近似原生應用的系統整合體驗. 另外Crosswalk提供了共享模式來減少應用的大小
  • 補充

    • WebView自Android 4.4起已經採用了Chromium核心,但這與Crosswalk比起來目前仍存在兩大缺陷:1.不被4.4之前的Android支援;2.性、功能(效能和功能)與Crosswalk有較大差別
  • Crosswalk與Cordova

    • Cordova(PhoneGap)作為第三方的H5應用開發框架工具的代表,極大促進了H5應用的發展. 提供了方便的跨平臺應用打包/釋出服務、實用的API、靈活的擴充套件機制、以及積累下來的豐富的第三方API實現. 然而Cordova使用的web引擎是系統的WebView. 如果開發者正在使用Cordova並且渴望更好的效能和更新的功能,如WebGL,那麼Crosswalk是一個很好的選擇! Crosswalk支援開發者在Cordova中用Crosswalk替換原生的WebView,並將兩者完美的融合. 當然,它也支援Crodova的擴充套件機制. 目前Crosswalk採用提供定製過的Cordova開發包來支援Cordova中Crosswalk引擎的使用

PART_B Crosswalk整合步驟

  • 新建專案

    Minimum SDK 選擇 "API 19"

  • 配置gradle

    repositories {
        maven {
            url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'
        }
    }
    compile 'org.xwalk:xwalk_core_library:10.39.235.15'

    配置結果參考下圖

    這裡寫圖片描述

  • 配置許可權

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  • 在application標籤中宣告開啟硬體加速

    android:hardwareAccelerated="true"

  • 佈局檔案

    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000000"
        android:orientation="vertical">
    
        <org.xwalk.core.XWalkView
            android:id="@+id/xWalkWebView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#000000"
            android:orientation="vertical" />
    
    </LinearLayout>
  • Activity中

    • 需要監聽系統事件(生命週期、Intent、ActivityResult)

    • 必須顯示呼叫 onDestroy(),防止瀏覽器引擎的記憶體洩漏

      public class MainActivity extends Activity {
      
          @Bind(R.id.xWalkWebView) XWalkView xWalkWebView;
      
          @Override protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              ButterKnife.bind(this);
      
              xWalkWebView.load("http://sina.com.cn", null);
      
              // 開啟除錯
              XWalkPreferences.setValue(XWalkPreferences.REMOTE_DEBUGGING, true);
          }
      
          /**通過Activity管理XWalkWebView的宣告週期*/
          @Override protected void onPause() {
              super.onPause();
              if (xWalkWebView != null) {
                  xWalkWebView.pauseTimers();
                  xWalkWebView.onHide();
              }
          }
      
          @Override protected void onResume() {
              super.onResume();
              if (xWalkWebView != null) {
                  xWalkWebView.resumeTimers();
                  xWalkWebView.onShow();
              }
          }
      
          @Override protected void onDestroy() {
              super.onDestroy();
              if (xWalkWebView != null) {
                  xWalkWebView.onDestroy();
              }
          }
      
          @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
              if (xwv != null) {
                  xwv.onActivityResult(requestCode, resultCode, data);
              }
          }
      
          @Override protected void onNewIntent(Intent intent) {
              super.onNewIntent(intent);
              if (xwv != null) {
                  xwv.onNewIntent(intent);
              }
          }
      }

PART_C 相容ARM的Crosswalk整合簡要

  1. 可以看到完整包39m,arm包20m. 我們在此選擇第一個arm包

    這裡寫圖片描述

  2. 將下載好的arm.aar包放入工程的libs目錄下

  3. 在builde.gradle中新增配置

    flatDir {
        dirs 'libs'
    }
    compile 'org.xwalk:xwalk_core_library:15.44.384.13-arm@aar'

    配置結果參考下圖

    這裡寫圖片描述

  4. 重新編譯打包,可見結果如下(整合完整Crosswalk與僅整合ARM包)

    這裡寫圖片描述

第三部分小結

  • 1.眾所周知,Crosswalk的體積是個惱人的問題. 可以針對針對ARM、X86分別引入對應的庫檔案,減少不必要的空間浪費

  • 2.可以使用動態庫載入