騰訊X5內(nèi)核集成-解決遇到的問題(ABI平臺(tái)匹配加載理解)

上周項(xiàng)目有需要称近,集成了“騰訊X5瀏覽器內(nèi)核”過程中,也遇到了一些問題哮塞。經(jīng)過摸索刨秆,也順帶補(bǔ)充解決了之前ABI方面的理解。

一忆畅、需求描述?

APP衡未,內(nèi)容模塊視頻部分,使用時(shí)夏正流行H5技術(shù)。

二缓醋、初步技術(shù)方案

1如失、打開網(wǎng)頁,用WebView控件送粱。

2褪贵、初步技術(shù)方案遇到的問題

Html5的Video控件播放視頻,在Android平臺(tái)的WebView中播放的效果抗俄,和IOS播放效果有差異脆丁。IOS點(diǎn)擊視頻部分,會(huì)用系統(tǒng)自帶的瀏覽器全屏播放視頻动雹,體驗(yàn)效果佳槽卫;而Android的WebView無法全屏。至少體驗(yàn)效果比IOS上的差一些胰蝠。

3歼培、技術(shù)嘗試

①Html5頁面使用一些開源封裝過的Video,帶全屏等茸塞。

結(jié)果:產(chǎn)品部丐怯,認(rèn)為體驗(yàn)不佳。提出疑問:“為什么在QQ上播放那么好呢翔横?”读跷,這,畢竟我們是技術(shù)方禾唁, 也不好直接說“別人技術(shù)判Ю溃”。

②重寫WebChromeClient的onShowCustomView開啟全屏荡短;onHideCustomView退出全屏丐枉。

結(jié)果:相信有朋友也折騰過這玩意,在Android 4.4開始的手機(jī)掘托,大部分不會(huì)進(jìn)入該回調(diào)方法瘦锹。

③技術(shù)體驗(yàn)上,不懂技術(shù)的同事等闪盔, 都是用QQ弯院,微信舉例。那就使用騰訊X5內(nèi)核吧泪掀。

三听绳、騰訊X5內(nèi)核接入

1、閱讀其文檔异赫,知曉:

①成功調(diào)用x5內(nèi)核條件是安裝騰訊三個(gè)常見產(chǎn)品之一:1椅挣、手機(jī)QQ头岔;2、微信峡竣;3、QQ瀏覽器量九。當(dāng)然版本也有限制适掰,到這里娩鹉,我們至少知道稚伍,三者中一個(gè),是很有可能成功的个曙,只要版本不太低垦搬,至少身邊朋友的版本呼寸,都不至于太低了。

②第一次安裝集成該SDK的版本必須預(yù)熱(從SDK接入文檔中理解猴贰,理論上是对雪, 大部分情況第一次是啟動(dòng)失敗的,從試驗(yàn)中米绕,是kill了進(jìn)程瑟捣,再開啟才成功)。

③ABI只提供armeabi的.so

2栅干、搬磚小分隊(duì)迈套,施工

①導(dǎo)入相應(yīng)的.jar, ?.so 文件:

libs: tbs_sdk_v1.5.1.1057_25436_obfs_20160331_144900.jar

armeabi:liblbs.so

②預(yù)熱X5內(nèi)核:

/**

* 開啟額外進(jìn)程 服務(wù) 預(yù)加載X5內(nèi)核, 此操作必須在主進(jìn)程調(diào)起X5內(nèi)核前進(jìn)行碱鳞,否則將不會(huì)實(shí)現(xiàn)預(yù)加載

*/

private voidpreinitX5WithService() {

Intent intent =newIntent(this,FirstLoadingX5Service.class);

startService(intent);

}

/**

* X5內(nèi)核在使用preinit接口之后桑李,對(duì)于首次安裝首次加載沒有效果

* 實(shí)際上,X5webview的preinit接口只是降低了webview的冷啟動(dòng)時(shí)間窿给;

* 因此贵白,現(xiàn)階段要想做到首次安裝首次加載X5內(nèi)核,必須要讓X5內(nèi)核提前獲取到內(nèi)核的加載條件

*/

private voidpreinitX5WebCore() {

if(!QbSdk.isTbsCoreInited()) {

// preinit只需要調(diào)用一次崩泡,如果已經(jīng)完成了初始化戒洼,那么就直接構(gòu)造view

QbSdk.preInit(MainActivity.this, null);// 設(shè)置X5初始化完成的回調(diào)接口

}

}

③用多臺(tái)手機(jī)測(cè)試:華為4A, 華為榮耀(忘記什么型號(hào)允华,是64位CPU)圈浇,google nenux4寥掐, 小米4C, 華為mate 7磷蜀, 紅米Note2 等等召耘。APP打包測(cè)試。

結(jié)果:只有我的華為4A能播放褐隆。 為什么別的污它,就不正常呢?

------------------------------以下-解決篇--------------------------------

四庶弃、ABI知識(shí)理解得一知半解的時(shí)候衫贬, 有如下疑問:

一、只有armeabi的.so是否別的平臺(tái)遇到問題歇攻?為什么只有華為4A可以呢固惯?

①CPU方面,華為4A是比較老的CPU缴守, 估計(jì)就是armeabi的了葬毫,由于別的機(jī)型,我都有對(duì)應(yīng)的abi目錄屡穗,都各自找到相應(yīng)的平臺(tái)目錄贴捡, 所以無法加載“l(fā)iblbs.so”。

②嘗試將“l(fā)iblbs.so”放在各個(gè)abi目錄中村砂, 結(jié)果還是沒辦法啟動(dòng)x5烂斋。

③通過百度,google等搜索,再次進(jìn)行ABI方面的理解加深础废,獲取解決方案:

項(xiàng)目的“build.gradle”文件defaultConfig源祈,增加配置

ndk {

abiFilters"armeabi","armeabi-v7a","x86","mips"

}

結(jié)果:確實(shí)解決了問題。

二色迂、加上那玩意香缺,為什么就解決問題呢?請(qǐng)?jiān)徫褹BI知識(shí)弱歇僧, 在進(jìn)一步學(xué)習(xí)之前图张,我有以下疑問:?加上那段配置, 任何平臺(tái)都找到了armeabi目錄下的“l(fā)iblbs.so”诈悍。是什么機(jī)制祸轮?請(qǐng)讓我假象,一下:

①難道是別的平臺(tái)都指向了最低兼容的armeabi目錄侥钳? 噢适袜,如果這樣做的話,在APP中性能會(huì)有極大的損失舷夺。如arm-v7中的 ?浮點(diǎn)運(yùn)算苦酱,這就損失極大售貌。更何況64位的CPU。

②難道是機(jī)器是智能化了疫萤?先找相應(yīng)平臺(tái)的.so颂跨, 不行,再逐個(gè)查看向下的兼容平臺(tái)扯饶?如果是這樣恒削,那就太好了。

③什么優(yōu)先順序呢尾序?這個(gè)Android選取ABI的機(jī)制钓丰?我也想了解。 順帶這個(gè)問題一起學(xué)習(xí)每币。

三携丁、解決了X5問題,知道了配置一下ABI兼容脯爪。但是還是得知其然知其所以然则北, 如何證實(shí)以上猜想矿微?得找個(gè)小文章證實(shí)一下

①google一些資料痕慢,在overflow上,找到挺好的http://stackoverflow.com/questions/20674650/how-to-configure-ndk-with-android-gradle-plugin-0-7/21413011#21413011涌矢。

鬼老很務(wù)實(shí)掖举, 他也有這種的疑問,從假象的提出娜庇,到論證塔次,到結(jié)論。佩服名秀。

文中的一些片段励负,我摘取一下:

To simply Link in Prebuilt Native Libraries, just add an ndk section to your task. For instance, I added it below in productFlavors. The abiFilter is the folder name the libs are stored in. abiFilters means both libs from the comma separated list will be added to your final APK (so you could theoretically have "armeabi", "armeabi-v7a", "x86", and "mips" all in one APK, and the O/S would choose the supported architecture lib on install):


Very helpful. Thanks indeed. BTW, do you know the default search directory for user static libraries? I opt not to use the trick of "-I" in ldLibs, if possible. – weidongxu Apr 16 '14 at 20:10

how does one explore/download the files listed here?: docs.google.com/… – Cliff Apr 26 '14 at 17:47

Found the example download but now I'm facing another issue w/ Gradle 1.11. The generated Androud.mk file uses absolute paths: stackoverflow.com/questions/23344567/… – Cliff Apr 28 '14 at 16:09

Thanks for the ldlibs tricking - I just found out that ldlibs are not kept in the order you type them in, which makes using multiple static libraries just about completely unusable. Unless they're "one" argument, after which it works. Awesome! – dascandy Jan 1 '15 at 22:15

2

This is the most detailed step-by-step introduction I've ever seen for ndk setup. Google should have hired you to rewrite all their documentations. – John Jul 15 '15 at 16:53

Thanks @John, nice of you to say. The closest interview to google I had was at Microsoft, but they told me I wasn't "the right fit for Microsoft" when I couldn't write a bubble sort algorithm on the board (who the frick would want to memorize that...). Actually, that was just 1 of 3 interviews, the other 2 offered me jobs, but I declined and started my own business. :) – reactive-core Oct 14 '15 at 18:49

@reactive-core, No wonder why Windows so fxxx up, they judge programmer by bubble sort algorithm! :) – John Oct 15 '15 at 7:17

add a comment

up vote

26

down vote

accepted

Found the answer. Including ndk.dir=path/to/ndk in the local.properties file did the trick.

Update: On the latest versions of Android Studio, you can set the value directly in the Project Structure > SDK location.

shareimprove this answer

edited Oct 8 '15 at 10:25

answered Dec 19 '13 at 7:13

user1906

1,1311920

Don't forget to accept your answer – orip Dec 23 '13 at 9:54

3

Is it a good idea to put something manually into the local.properties file, since it says "This file is automatically generated by Android Studio. Do not modify this file -- YOUR CHANGES WILL BE ERASED!" ?

從這對(duì)話中, 至少至少匕得,都是能證明挺有料子的人继榆。

OK,接下來汁掠,我也實(shí)驗(yàn)略吨。

②項(xiàng)目中,有用到考阱,信鴿翠忠,地圖等一系列的.so文件。

我把a(bǔ)rmeabi的目錄乞榨,只剩下騰訊x5內(nèi)核的"liblbs.so"文件秽之。用除了我手里的華為4A的当娱,設(shè)備來安裝apk, 非armeabi基礎(chǔ)平臺(tái)的設(shè)備政溃,都能順利加載x5內(nèi)核趾访。這是其次,最重要的是 armeabi目錄刪除的所有.so包的董虱,功能存在扼鞋。

結(jié)論:手機(jī)讀取了對(duì)應(yīng)手機(jī)平臺(tái)的.so, 找不到"liblbs.so"的時(shí)候愤诱, 才去armeabi目錄云头,找它。這樣就很完美淫半。符合提前提出的 疑問②溃槐。

五、SDK預(yù)熱問題

一科吭、能用昏滴,體驗(yàn)方面,還是跑不掉的对人。遇到如下問題:

①集成X5的APP谣殊, 第一次安裝,多數(shù)手機(jī)是加載X5內(nèi)核失敗牺弄,取到sys core姻几。

②back back 關(guān)閉應(yīng)用,再打開仍然失敗势告。要按 任務(wù)蛇捌,“劃掉“這個(gè)進(jìn)程任務(wù)才成功。哎咱台,這點(diǎn)络拌,騰訊又不說,怎么做了回溺。

二春贸、如何提高體驗(yàn)

啟動(dòng) TBSDemo,等待幾秒鐘后看到提示框“x5內(nèi)核安裝成功馅而,是否重啟”祥诽,此時(shí)點(diǎn)擊“重啟”. 這句話是引用騰訊X5內(nèi)核SDK接入文檔(http://x5.tencent.com/doc?id=1003)

②重啟體驗(yàn)不好吧,最后使用的方案是在 "關(guān)閉APP首頁"瓮恭,時(shí)候徹底關(guān)閉這個(gè)進(jìn)程雄坪。

@Override

public voidonBackPressed() {

//是否新裝應(yīng)用、或者剛更新到本次版本的應(yīng)用

booleanisFist4Video = SharePreferenceUtil.getBooleanDataByKey(this,"isFist4Video", true);

if(isFist4Video){

SharePreferenceUtil.saveBooleanDataToSharePreference(this,"isFist4Video", false);

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

super.onBackPressed();

}

super.onBackPressed();?

}

③上述雖然解決了屯蹦,第一次安裝维哈,不用關(guān)閉進(jìn)程绳姨,而讓用戶back首頁關(guān)閉應(yīng)用而殺進(jìn)程。然而體驗(yàn)并不是非常好阔挠。 (這玩意測(cè)試過飘庄,對(duì)是否有問題,沒有影響购撼。只是第二次就好)

三跪削、X5案例的APP

合作伙伴

微信,手機(jī)QQ迂求,QQ空間碾盐,京東58,同城揩局,搜狐視頻毫玖,新浪新聞

這些”合作伙伴“,別人都是安裝完凌盯,就正常使用的付枫?如何做到呢?朋友們驰怎,一起討論哦阐滩。


六、騰訊X5內(nèi)核集成完畢砸西, 也順便給ABI方面的使用叶眉,學(xué)習(xí)到新知識(shí)址儒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芹枷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子莲趣,更是在濱河造成了極大的恐慌鸳慈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喧伞,死亡現(xiàn)場(chǎng)離奇詭異走芋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)潘鲫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門翁逞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溉仑,你說我怎么就攤上這事挖函。” “怎么了浊竟?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵怨喘,是天一觀的道長津畸。 經(jīng)常有香客問我,道長必怜,這世上最難降的妖魔是什么肉拓? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮梳庆,結(jié)果婚禮上暖途,老公的妹妹穿的比我還像新娘。我一直安慰自己膏执,他們只是感情好丧肴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胧后,像睡著了一般芋浮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壳快,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天纸巷,我揣著相機(jī)與錄音,去河邊找鬼眶痰。 笑死瘤旨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竖伯。 我是一名探鬼主播存哲,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼七婴!你這毒婦竟也來了祟偷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤打厘,失蹤者是張志新(化名)和其女友劉穎修肠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體户盯,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嵌施,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莽鸭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吗伤。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡期升,死狀恐怖喻鳄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苗傅,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布缸浦,位于F島的核電站夕冲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏裂逐。R本人自食惡果不足惜歹鱼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卜高。 院中可真熱鬧弥姻,春花似錦、人聲如沸掺涛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薪缆。三九已至秧廉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拣帽,已是汗流浹背疼电。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留减拭,地道東北人蔽豺。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像拧粪,于是被迫代替她去往敵國和親修陡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評(píng)論 25 707
  • 一般情況下可霎,我們不需要關(guān)心so魄鸦。但是當(dāng)APP使用的第三方SDK中包含了so文件,或者自己需要使用NDK開發(fā)某些功能...
    凡諾依曼閱讀 3,897評(píng)論 5 20
  • 一啥纸、NDK產(chǎn)生的背景 Android平臺(tái)從誕生起号杏,就已經(jīng)支持C婴氮、C++開發(fā)斯棒。眾所周知,Android的SDK基于J...
    Ten_Minutes閱讀 3,479評(píng)論 1 27
  • 2016年12月2日星期五 18點(diǎn)51分 日里主经,去外地祭拜一位同事的老人回返時(shí)荣暮,幾位同事在車中閑聊,談到了我曾經(jīng)熟...
    悅者閱讀 299評(píng)論 3 4
  • Everybody's talking about, Bagism, Shagism, Dragism, Madi...
    大鉑娛論閱讀 390評(píng)論 0 0