腾讯X5内核集成-解决遇到的问题(ABI平台匹配加载理解)

上周项目有需要,集成了“腾讯X5浏览器内核”过程中,也遇到了一些问题。经过摸索,也顺带补充解决了之前ABI方面的理解。

一、需求描述 

APP,内容模块视频部分,使用时夏正流行H5技术。

二、初步技术方案

1、打开网页,用WebView控件。

2、初步技术方案遇到的问题

Html5的Video控件播放视频,在Android平台的WebView中播放的效果,和IOS播放效果有差异。IOS点击视频部分,会用系统自带的浏览器全屏播放视频,体验效果佳;而Android的WebView无法全屏。至少体验效果比IOS上的差一些。

3、技术尝试

①Html5页面使用一些开源封装过的Video,带全屏等。

结果:产品部,认为体验不佳。提出疑问:“为什么在QQ上播放那么好呢?”,这,毕竟我们是技术方, 也不好直接说“别人技术牛”。

②重写WebChromeClient的onShowCustomView开启全屏;onHideCustomView退出全屏。

结果:相信有朋友也折腾过这玩意,在Android 4.4开始的手机,大部分不会进入该回调方法。

③技术体验上,不懂技术的同事等, 都是用QQ,微信举例。那就使用腾讯X5内核吧。

三、腾讯X5内核接入

1、阅读其文档,知晓:

①成功调用x5内核条件是安装腾讯三个常见产品之一:1、手机QQ;2、微信;3、QQ浏览器。当然版本也有限制,到这里,我们至少知道,三者中一个,是很有可能成功的,只要版本不太低,至少身边朋友的版本,都不至于太低了。

②第一次安装集成该SDK的版本必须预热(从SDK接入文档中理解,理论上是, 大部分情况第一次是启动失败的,从试验中,是kill了进程,再开启才成功)。

③ABI只提供armeabi的.so

2、搬砖小分队,施工

①导入相应的.jar,  .so 文件:

libs: tbs_sdk_v1.5.1.1057_25436_obfs_20160331_144900.jar

armeabi:liblbs.so

②预热X5内核:

/**

* 开启额外进程 服务 预加载X5内核, 此操作必须在主进程调起X5内核前进行,否则将不会实现预加载

*/

private voidpreinitX5WithService() {

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

startService(intent);

}

/**

* X5内核在使用preinit接口之后,对于首次安装首次加载没有效果

* 实际上,X5webview的preinit接口只是降低了webview的冷启动时间;

* 因此,现阶段要想做到首次安装首次加载X5内核,必须要让X5内核提前获取到内核的加载条件

*/

private voidpreinitX5WebCore() {

if(!QbSdk.isTbsCoreInited()) {

// preinit只需要调用一次,如果已经完成了初始化,那么就直接构造view

QbSdk.preInit(MainActivity.this, null);// 设置X5初始化完成的回调接口

}

}

③用多台手机测试:华为4A, 华为荣耀(忘记什么型号,是64位CPU),google nenux4, 小米4C, 华为mate 7, 红米Note2 等等。APP打包测试。

结果:只有我的华为4A能播放。 为什么别的,就不正常呢?

------------------------------以下-解决篇--------------------------------

四、ABI知识理解得一知半解的时候, 有如下疑问:

一、只有armeabi的.so是否别的平台遇到问题?为什么只有华为4A可以呢?

①CPU方面,华为4A是比较老的CPU, 估计就是armeabi的了,由于别的机型,我都有对应的abi目录,都各自找到相应的平台目录, 所以无法加载“liblbs.so”。

②尝试将“liblbs.so”放在各个abi目录中, 结果还是没办法启动x5。

③通过百度,google等搜索,再次进行ABI方面的理解加深,获取解决方案:

项目的“build.gradle”文件defaultConfig,增加配置

ndk {

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

}

结果:确实解决了问题。

二、加上那玩意,为什么就解决问题呢?请原谅我ABI知识弱, 在进一步学习之前,我有以下疑问: 加上那段配置, 任何平台都找到了armeabi目录下的“liblbs.so”。是什么机制?请让我假象,一下:

①难道是别的平台都指向了最低兼容的armeabi目录? 噢,如果这样做的话,在APP中性能会有极大的损失。如arm-v7中的  浮点运算,这就损失极大。更何况64位的CPU。

②难道是机器是智能化了?先找相应平台的.so, 不行,再逐个查看向下的兼容平台?如果是这样,那就太好了。

③什么优先顺序呢?这个Android选取ABI的机制?我也想了解。 顺带这个问题一起学习。

三、解决了X5问题,知道了配置一下ABI兼容。但是还是得知其然知其所以然, 如何证实以上猜想?得找个小文章证实一下

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

鬼老很务实, 他也有这种的疑问,从假象的提出,到论证,到结论。佩服。

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

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!" ?

从这对话中, 至少至少,都是能证明挺有料子的人。

OK,接下来,我也实验。

②项目中,有用到,信鸽,地图等一系列的.so文件。

我把armeabi的目录,只剩下腾讯x5内核的"liblbs.so"文件。用除了我手里的华为4A的,设备来安装apk, 非armeabi基础平台的设备,都能顺利加载x5内核。这是其次,最重要的是 armeabi目录删除的所有.so包的,功能存在。

结论:手机读取了对应手机平台的.so, 找不到"liblbs.so"的时候, 才去armeabi目录,找它。这样就很完美。符合提前提出的 疑问②。

五、SDK预热问题

一、能用,体验方面,还是跑不掉的。遇到如下问题:

①集成X5的APP, 第一次安装,多数手机是加载X5内核失败,取到sys core。

②back back 关闭应用,再打开仍然失败。要按 任务,“划掉“这个进程任务才成功。哎,这点,腾讯又不说,怎么做了。

二、如何提高体验

启动 TBSDemo,等待几秒钟后看到提示框“x5内核安装成功,是否重启”,此时点击“重启”. 这句话是引用腾讯X5内核SDK接入文档(http://x5.tencent.com/doc?id=1003)

②重启体验不好吧,最后使用的方案是在 "关闭APP首页",时候彻底关闭这个进程。

@Override

public voidonBackPressed() {

//是否新装应用、或者刚更新到本次版本的应用

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(); 

}

③上述虽然解决了,第一次安装,不用关闭进程,而让用户back首页关闭应用而杀进程。然而体验并不是非常好。 (这玩意测试过,对是否有问题,没有影响。只是第二次就好)

三、X5案例的APP

合作伙伴

微信,手机QQ,QQ空间,京东58,同城,搜狐视频,新浪新闻

这些”合作伙伴“,别人都是安装完,就正常使用的?如何做到呢?朋友们,一起讨论哦。


六、腾讯X5内核集成完毕, 也顺便给ABI方面的使用,学习到新知识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容