Crosswalk 開發(fā)淺析

最近的項(xiàng)目中箫措,有用到phonegap,并需要展示一些需要高效渲染的網(wǎng)頁衬潦,同情況下斤蔓,IOS跑起來輕松無比,但是Webview镀岛。弦牡。。漂羊。(淚奔)驾锰,在焦頭爛額的機(jī)型及版本適配中,發(fā)現(xiàn)了Crosswalk項(xiàng)目走越。

一椭豫、 在使用 Crosswalk框架之前,我們必須得了解 Crosswalk


1. Crosswalk是一款開源的Web引擎旨指,其基于 Chromium/Blink 的應(yīng)用運(yùn)行環(huán)境捻悯,對于混合開發(fā)的輕量級(jí)應(yīng)用尤為受歡迎。

2. crosswalk官網(wǎng)https://crosswalk-project.org/index_zh.html,很貼心的中文選項(xiàng)

3. 同時(shí)在使用前的聲明淤毛,如果你不能承受APK激增 20M~ OR 40M~ 體積的話今缚,你懂得。當(dāng)然如果大家有好的APK瘦身方法低淡,希望能得到指點(diǎn)姓言。

4. 最近搞項(xiàng)目有嘗試過許多框架,這里Tencent X5也非常棒蔗蹋,至于ChromiumView貌似不再維護(hù)了

?二何荚、開始應(yīng)用到項(xiàng)目


題主現(xiàn)階段給出為嵌入模式XWalkView 的一些api使用介紹,crosswalk有支持phonegap的插件替換其中系統(tǒng)webview猪杭,以獲取更強(qiáng)大功能餐塘,這個(gè)后續(xù)有時(shí)間會(huì)再次分享

1.首先在greadle 中聲明 maven倉庫,并添加庫的依賴

repositories {

? ? ? ? maven {

? ? ? ? ? ? ?url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'

? ? ? ? ?}

?}

compile 'org.xwalk:xwalk_core_library:18.48.477.13'

2 . 接下來使用的XwalkView我們有幾點(diǎn)注意的地方

1. 要求最低版本 minSdkVersion 14

2. 硬件加速:android:hardwareAccelerated="true"

3. 權(quán)限要求:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

4.

<org.xwalk.core.XWalkView android:id="@+id/xw"

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

ndroid:layout_height="fill_parent">

</org.xwalk.core.XWalkView>

?三皂吮、API使用


1. XWalkPreferences配置(API 文檔地址)

//添加對javascript支持

XWalkPreferences.setValue("enable-javascript", true);

//開啟調(diào)式,支持谷歌瀏覽器調(diào)式

XWalkPreferences.setValue(XWalkPreferences.REMOTE_DEBUGGING, true);

//置是否允許通過file url加載的Javascript可以訪問其他的源,包括其他的文件和http,https等其他的源XWalkPreferences.setValue(XWalkPreferences.ALLOW_UNIVERSAL_ACCESS_FROM_FILE, true);

//JAVASCRIPT_CAN_OPEN_WINDOW

XWalkPreferences.setValue(XWalkPreferences.JAVASCRIPT_CAN_OPEN_WINDOW, true);

// enable multiple windows.

XWalkPreferences.setValue(XWalkPreferences.SUPPORT_MULTIPLE_WINDOWS, true);


2. 一些基本的api和webview類似

//設(shè)置滑動(dòng)樣式戒傻。税手。。

Xwalkview mXwview.setHorizontalScrollBarEnabled(false);

mXwview.setVerticalScrollBarEnabled(false);

mXwview.setScrollBarStyle(XWalkView.SCROLLBARS_OUTSIDE_INSET);

mXwview.setScrollbarFadingEnabled(true);

//獲取setting

mMSettings = mXwview.getSettings();

//支持空間導(dǎo)航

mMSettings.setSupportSpatialNavigation(true);

mMSettings.setBuiltInZoomControls(true);

mMSettings.setSupportZoom(true);

3. 加載

mXwview.load(url, null);

mXwview.setDrawingCacheEnabled(false);//不使用緩存

mXwview.getNavigationHistory().clear();//清除歷史記錄

mXwview.clearCache(true);//清楚包括磁盤緩存

4. XWalkView沒了webview的setwebviewclient api 增加了setUIClient 和setResourceClient

顧名思義需纳,UI變化及資源加載

1 .我們可以在XWalkUIClient中覆蓋方法onPageLoadStarted及onPageLoadStopped處理頁面開始加載及加載完畢

同時(shí)在頁面縮放onScaleChanged或調(diào)用JsAlert中進(jìn)行相應(yīng)操作

mXwview.setUIClient(new XWalkUIClient(mXwview) {

? ? ? ? ? ? @Override

? ? ? ? ? ? ?public void onPageLoadStarted(XWalkView view, String url) {

? ? ? ? ? ? ? ? ? ?super.onPageLoadStarted(view, url);

? ? ? ? ? ? ?}

? ? ? ? ? ? @Override

? ? ? ? ? ? public boolean onJsAlert(XWalkView view, String url, String message, XWalkJavascriptResult result) {

? ? ? ? ? ? ? ? ? ? ? ? ?return super.onJsAlert(view, url, message, result);

? ? ? ? ? ? ?}

? ? ? ? ? ? ?@Override

? ? ? ? ? ? ?public void onScaleChanged(XWalkView view, float oldScale, float newScale) {

? ? ? ? ? ? ? ? ? ? ? ? ? if (view != null) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?view.invalidate();

? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? super.onScaleChanged(view, oldScale, newScale);

? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?@Override

? ? ? ? ? ? ? public void onPageLoadStopped(XWalkView view, String url, LoadStatus status) {

? ? ? ? ? ? ? ? ? ? ? ? ? super.onPageLoadStopped(view, url, status);

? ? ? ? ? ? ? ? }

});

2 .在XWalkResourceClient中同樣有我們熟悉的onReceivedLoadError()錯(cuò)誤回調(diào)及shouldOverrideUrlLoading()方法芦倒,同時(shí)相比webview增加的有shouldInterceptLoadRequest,可以對url進(jìn)行監(jiān)聽及攔截操作

mXwview.setResourceClient(new XWalkResourceClient(mXwview) {

? ? ? ? ?@Override

? ? ? ? ?public void onReceivedLoadError(XWalkView view, int errorCode, String description, String failingUrl) {

? ? ? ? ? ? ? ? ? ? ? ?super.onReceivedLoadError(view, errorCode, description, failingUrl);

}

? ? ? ? ? ? @Override

? ? ? ? ? ? public WebResourceResponse shouldInterceptLoadRequest(XWalkView view, String url) {

? ? ? ? ? ? ? ? LogUtils.d("http", "shouldOverrideUrlLoading-url=" + url);

? ? ? ? ? ? ? ? return super.shouldInterceptLoadRequest(view, url);

}

? ? ? ? ? ?@Override

? ? ? ? ? ?public boolean shouldOverrideUrlLoading(XWalkView view, String url) {

? ? ? ? ? ? ? ? ? ? ? odlurl= url;

? ? ? ? ? ? ? ? ? ? ? return super.shouldOverrideUrlLoading(view, url);

? ? ? ? ? ? ?}

});

5. 監(jiān)聽back按鈕點(diǎn)擊事件

//改寫物理按鍵——返回的邏輯

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

? ? ? ? ? ? if (keyCode == KeyEvent.KEYCODE_BACK) {

? ? ? ? ? ? ? ? ? ? ? if (mXwview.getNavigationHistory().canGoBack()) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mXwview.getNavigationHistory().navigate(XWalkNavigationHistory.Direction.BACKWARD, 1);?//返回上一頁面

? ? ? ? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ? ?/*finish();*/

? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? return true;

? ? ? ? ? }

? ? ? ? ? ?return super.onKeyDown(keyCode, event);

}

6. 同時(shí)不忘XWalkView令人心動(dòng)的一點(diǎn)不翩,與Activity生命周期的綁定兵扬,對資源的更好回收和處理

@Override

protected void onDestroy() {

? ? ? ? ? ? super.onDestroy();

? ? ? ? ? ? ?if (mXwview != null) {

? ? ? ? ? ? ? ?mXwview.onDestroy();

? ? ? ? ? ? ?}

? ? ? ? ? ? ? android.os.Process.killProcess(android.os.Process.myPid());

}

@Override

protected void onPause() {

? ? ? ? ? ? ? ? super.onPause();

? ? ? ? ? ? ? ?if (mXwview != null) {

? ? ? ? ? ? ? ? mXwview.pauseTimers();

? ? ? ? ? ? ? ? mXwview.onHide();

? ? ? ? ? ? ? }

}

@Override

protected void onResume() {

? ? ? ? ? ? ? ?super.onResume();

? ? ? ? ? ? ? ?if (mXwview != null) {

? ? ? ? ? ? ? ? ? ? ? mXwview.resumeTimers();

? ? ? ? ? ? ? ? ? ? ? ?mXwview.onShow();

? ? ? ? ? ? ? ? }

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

? ? ? ? ?if (mXwalkView != null) {

? ? ? ? ? ? ? ? ?mXwalkView.onActivityResult(requestCode, resultCode, data);

? ? ? ? ? }

}

@Override

protected void onNewIntent(Intent intent) {

? ? ? ? ?if (mXwalkView != null) {

? ? ? ? ? ? ? ? mXwalkView.onNewIntent(intent);

? ? ? ? ? }

}

7.XWalkView可直接執(zhí)行js

js調(diào)java用@JavascriptInterface注解聲明即可

public class FromJs{

? ? ? ? public ? FromJs(){}

? ? ? ? @JavascriptInterface

? ? ? ? ?public String fromJsMethod() {

? ? ? ? ? ? ? ? ? ?return "js-------------";

? ? ? ? ? }

}

mXWalkView.addJavascriptInterface(new FromJs(),"NativeInterface");


8. cookies使用

XWalkCookieManager xm = new XWalkCookieManager();

xm.setAcceptCookie(true);

xm.setCookie(url,?cookie);



四、好的口蝠,做好這一步器钟,讓我們來混淆打包吧

混淆:

-keep class org.xwalk.core.** { *;}

-keep class org.chromium.** { *;}

-keepattributes **

以上是其官網(wǎng)提示混淆規(guī)則,但打包時(shí)仍存在問題妙蔗,添加下方后解決

-keep? class? junit.framework.**{*;}


喲喲喲俱箱,切克鬧

接下來會(huì)發(fā)現(xiàn),apk大了40M~有木有灭必,讓我們打開apk



Arm和X86多出來的兩個(gè).so動(dòng)態(tài)庫,每個(gè)大概占了20m大小乃摹,這邊官方推薦的是分別打包上傳到谷歌市場禁漓,不同用戶手機(jī)處理器下載不同版本,但是這邊項(xiàng)目非上線版的孵睬,故而沒有去選擇

當(dāng)然播歼,還有官網(wǎng)共享模式可以選擇

分別打包時(shí),在gradle中聲明即可

productFlavors {

? ? ? ? ? ? ?armv7 {

? ? ? ? ? ? ? ? ? ? ndk {

? ? ? ? ? ? ? ? ? ? ? ? ? ?abiFilters "armeabi-v7a"

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ?}

? ? ? ? ? ? x86 {

? ? ? ? ? ? ? ? ?ndk {

? ? ? ? ? ? ? ? ? ? abiFilters "x86"

? ? ? ? ? ? ? ? ?}

? ? ? ? ? ?}

}

依賴中添加(可去官網(wǎng)下載不同版本庫導(dǎo)入即可)

X86Compile ?project ''

Armv7Compile project ''



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掰读,一起剝皮案震驚了整個(gè)濱河市秘狞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹈集,老刑警劉巖烁试,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拢肆,居然都是意外死亡减响,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門郭怪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來支示,“玉大人,你說我怎么就攤上這事鄙才∷毯瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵攒庵,是天一觀的道長嘴纺。 經(jīng)常有香客問我败晴,道長,這世上最難降的妖魔是什么颖医? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任位衩,我火速辦了婚禮,結(jié)果婚禮上熔萧,老公的妹妹穿的比我還像新娘糖驴。我一直安慰自己,他們只是感情好佛致,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布贮缕。 她就那樣靜靜地躺著,像睡著了一般俺榆。 火紅的嫁衣襯著肌膚如雪感昼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天罐脊,我揣著相機(jī)與錄音定嗓,去河邊找鬼。 笑死萍桌,一個(gè)胖子當(dāng)著我的面吹牛宵溅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播上炎,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼恃逻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了藕施?” 一聲冷哼從身側(cè)響起寇损,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裳食,沒想到半個(gè)月后矛市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诲祸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年尘盼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烦绳。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卿捎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出径密,到底是詐尸還是另有隱情午阵,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站底桂,受9級(jí)特大地震影響植袍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜籽懦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一于个、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暮顺,春花似錦厅篓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惫恼,卻和暖如春档押,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祈纯。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工令宿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腕窥。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓粒没,卻偏偏與公主長得像,于是被迫代替她去往敵國和親油昂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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