X5-工作人员 器粉新人
版主
2015-06-26 16:58:12 

腾讯浏览服务TBS接入常见问题

 本帖最后由 X5-工作人员 于 2015-06-26 17:17:26 编辑FAQ 
一、SDK相关
1、如何判断当前掉起的是系统WebView还是x5 WebView
程序代码里可以通过下述代码判断:

package com.tencent.x5sdk.demo;

 

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.view.View;

 

import com.tencent.smtt.sdk.WebView;

 

public class DemoWebView extends WebView

{

 

public DemoWebView(Context context)

{

super(context);

}

@Override

protected boolean drawChild(Canvas canvas, View child, long drawingTime)

{

boolean ret = super.drawChild(canvas, child, drawingTime);

canvas.save();

Paint paint = new Paint();

paint.setColor(0x7fff0000);

paint.setTextSize(24.f);

paint.setAntiAlias(true);

if(getX5WebViewExtension() != null)

canvas.drawText("X5 Core", 10, 50, paint);

else

canvas.drawText("Sys Core", 10, 50, paint);

canvas.restore();

return ret;

}

 

}



UI效果上,在拉起x5 WebView显示网页文字时,可通过选择文字的标识判断,如下水滴状选择效果是 x5 webview

 


 
2、 X5内核在怎样的条件下加载?
现在X5内核调用成功需要满足下面一些条件,否则走系统内核:

  1、ROM内存500兆以上
  2、机型2.2以上
 3、满足App自己后台配置的开关条件
 
 
3、 X5内核与系统内核的差异有哪些?
X5内核与系统的4.2版本保持一致。目前的主要差异有:
1、由于X5内核SDK中WebView并非继承于系统android.webkit.WebView,而是对系统android.webkit.WebView的聚合包装,所以需要原本对系统WebView的一些方法调用,需要修改一下,变成对webview.getView()相关方法的调用,参见前文接入步骤。
2、CookieManagerCookieSyncManager的相关接口的调用,在接入SDK后,需要放到创建X5的WebView之后(也就是X5内核加载完成)进行;否则,cookie的相关操作只能影响系统内核。
3、在视频架构上有出入:
系统的视频播放有页面内播放和全屏播放两种模式,且两种模式都在当前进程完成。播放流程中,会有对onShowCustomView的调用。
X5内核在视频播放上支持全屏播放一种模式,且在com.tencent.mtt:VideoService进程完成。播放流程中,不会对onShowCustomView进行调用。另外需要注意的是,在应用使用X5内核播放视频时,由于是在另外的进程进行播放,App进程会收到onPause消息,此时请不要做销毁网页所在进程或者网页所在WebView的操作,否则视频播放进程会因拿不到视频源而播放中断。解决办法是:在X5内核下,当应用切后台时,如果发现是因为视频播放而切换入后台,那么不要做销毁操作。为了让App判断当前是否有前台的视频播放在进行,我们在QbSdk.java里封装了接口:
public static boolean isSdkVideoServiceFg(Context ctx)
 
4、 openFileChooser 不是原生有的,这个有什么用?
该方法主要是用于文件上传的,是为了支持<input type="file"/>标签的。例如,网页上希望用户选择一个本地文件传递给后台该方法在Android各个版本上,存在参数不同的问题;在Android4.4上,甚至废除了该方法。
我们的SDK统一了该方法的参数,不管系统使用那个版本,也不管是否使用X5内核,参数是一致的。
 
5、WebSettings有没有什么标配,还是都要进行设置
TBS 里的类和方法,除个别细节外(例如前文步骤四里提到的使用WebView时需要调用getView),其它地方与系统原生用法和功能定义一致。可直接参考google的文档进行使用。具体到WebSettings,google链接是http://developer.android.com/reference/android/webkit/WebSettings.html。保险起见,开发者可直接使用Demo里给出的示例代码即可。
 
6、WebView.destroy() called while still attached 问题的解决方案

    @Override

    protected void onDestroy() {

        if(mWebView != null ) {

            mWebView.destroy();

        }

        super.onDestroy();

    }


 

结果,如果出现以下错误:

05-05 16:17:11.545: E/webview(10941): java.lang.Throwable: Error: WebView.destroy() called while still attached!

05-05 16:17:11.545: E/webview(10941):  at android.webkit.WebViewClassic.destroy(WebViewClassic.java:4140)

05-05 16:17:11.545: E/webview(10941):  at android.webkit.WebView.destroy(WebView.java:707)

05-05 16:17:11.545: E/webview(10941):  at com.tencent.smtt.sdk.WebView.destroy(WebView.java:545)

05-05 16:17:11.545: E/webview(10941):  at com.tencent.msdk.webview.WVMActivity.onDestroy(WVMActivity.java:148)

05-05 16:17:11.545: E/webview(10941):  at android.app.Activity.performDestroy(Activity.java:5543)

05-05 16:17:11.545: E/webview(10941):  at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1134)

05-05 16:17:11.545: E/webview(10941):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3619)

05-05 16:17:11.545: E/webview(10941):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3654)

05-05 16:17:11.545: E/webview(10941):  at android.app.ActivityThread.access$1300(ActivityThread.java:159)

05-05 16:17:11.545: E/webview(10941):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1369)

05-05 16:17:11.545: E/webview(10941):  at android.os.Handler.dispatchMessage(Handler.java:99)

05-05 16:17:11.545: E/webview(10941):  at android.os.Looper.loop(Looper.java:137)

05-05 16:17:11.545: E/webview(10941):  at android.app.ActivityThread.main(ActivityThread.java:5419)

05-05 16:17:11.545: E/webview(10941):  at java.lang.reflect.Method.invokeNative(Native Method)

05-05 16:17:11.545: E/webview(10941):  at java.lang.reflect.Method.invoke(Method.java:525)

05-05 16:17:11.545: E/webview(10941):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)

05-05 16:17:11.545: E/webview(10941):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

05-05 16:17:11.545: E/webview(10941):  at dalvik.system.NativeStart.main(Native Method)



该问题的解决办法:
Destroy webview 之前需要先移除 webview
webViewPlaceholder.removeView(mWebView);
mWebView.removeAllViews();
mWebView.destroy();
 
 
7、为什么我注册了downLoadListener后,点击QQ浏览器内核展示的文件链接时,走了文件下载,没有直接打开文件?
为了不与APP争抢链接点击后的处理,x5内核的文件打开功能使用的前提是----APP并未注册downLoadListener。
如果APP希望获得这样的产品行为:当前是系统内核时,走APP的downLoadListener,如果是x5内核时,走x5的文件打开。那么,APP可以通过“if(getX5WebViewExtension() != null)判断当前是否是x5内核来决定是否注册downLoadListener。
 
8、 App加载浏览器的内核,会否因为其它App伪装成浏览器内核而发生安全问题?
不会。因为TBS 在加载X5内核之前,会做安全校验,只有通过校验时才加载浏览器内核,否则只加载系统内核。
 
9、当前有哪些产品已经接入TBS?是否有发生严重问题?
截止目前,微信,手Q、空间等多款 app、第三方例如凤凰网、豆瓣东西都已接入。事故数目是0.
 
10、 针对不能使用X5的用户来说,SDK除了提供X5外,其SDK对原生Webview的封装是否做了某些兼容性和安全性上的处理。如果有, 是否会导致兼容性问题. 最好不要修改系统的原生webview
我们基本兼容系统webview接口个别不兼容的参考本文档其它说明
 
11、云端优化技术是否可以详细介绍下?是否会影响微博客户端正常的H5&APP之间的数据交互,例如:消息提醒、登录态、地理位置以及相互之间的跳转、返回等
云端优化只是透传,是避免目标服务器的速度不足而做的抓取提速,不会修改业务逻辑,所以不会有任何影响。并且我们这里也设置了白名单策略,对于浏览器代理发生问题的地方,通过白名单等其它措施规避。


12、特色能力很赞,但是也存在一些疑惑。特色能力是否可以被接入方程序控制。例如:特殊能力里的Cache机制, 是否有外部控制不cache立即更新的机制或方法
特殊能力的cache机制是允许应用程序控制页面缓存数目,最大限度节省内存和及时更新网页,设置为0.可以让用户每次打开都从网络重新拉取。
 
13、使用X5内核时,useragent 字段是否有特殊标记?
有的,判断UA里是否存在MQQBrowser
 
14、是否可以设置夜间模式?
SDK在WebView.java里提供了控制日间夜间模式的接口,如下:
/**

* 设置日夜间模式。需要注意的是,该设置是全局设置,影响所有WebView。
* 且内核切换时,设置也是不会丢失的。
* @Param true 浏览器进入日间模式,false 浏览器进入夜间模式.
* @note
* @Default 不调用这个函数设置时,默认值为true,默认日间模式.
*
* */
public void setDayOrNight(boolean isDayMode)
 
15、SDK的PV统计是怎么做的?
我们SDK内部会对用户浏览网页的次数进行统计,在onPageFinish里,对pv数目进行++,选择合适的时机进行上报。
 
 
 
37 条回复
肖洋中國 器粉跑堂
2015-07-17 02:05:31 沙发
该楼层已被删除
Mark.zhu 器粉跑堂
2015-08-24 10:15:56 板凳
该楼层已被删除
213429 器粉跑堂
2015-08-25 08:04:59 发自手机 地板
x5内核兼容性渣渣,完全不遵循标准,我们应该集体抗议,网页停止为其适配,对于QQ浏览器不能正常显示的网页直接做个弹窗让用户换浏览器
℡天晴か雨停 器粉跑堂
2015-10-16 20:36:06 4#
该楼层已被删除
23463 器粉跑堂
2015-10-16 22:44:15 发自手机 5#
qq
23463 器粉跑堂
2015-10-16 22:44:33 发自手机 6#
23463 发表于 2015-10-16 22:44:15 
qq

http://aq.qq.com/cn2/login_limit/index_smart
℡天晴か雨停 器粉跑堂
2015-10-18 19:14:21 7#
该楼层已被删除
espilce 器粉跑堂
2015-10-28 10:12:27 8#
我在官方的demo里发现了内存泄漏的问题,另外在嵌入到自己项目里也会出现该问题。但我对微信进行分析时发现微信并没有WebView的内存泄漏问题,还请回复下解决方案! 谢谢。
espilce 器粉跑堂
2015-10-28 10:12:45 9#
espilce 发表于 2015-10-28 10:12:27 
我在官方的demo里发现了内存泄漏的问题,另外在嵌入到自己项目里也会出现该问题。但我对微信进行分析时发现微信并没有Web ...

风吹过淡蓝色天空 狂热器粉
中秋节勋章
2015-10-28 10:29:28 发自手机 10#
espilce 发表于 2015-10-28 10:12:27 
我在官方的demo里发现了内存泄漏的问题,另外在嵌入到自己项目里也会出现该问题。但我对微信进行分析时发现微信并没有Web ...

请发帖反馈,我进行收集递交。发帖格式请看首页置顶帖:x5反馈必看贴。发帖尽量详细,确保工作人员一看就知道问题所在,不需要二次询问,否则可能不会处理。x5开发人员很忙,对此造成的不便请见谅
吧唧吧唧思密达 器粉跑堂
2015-10-31 08:30:53 11#
怎么弄
Uouo、Minions 器粉跑堂
2015-11-17 16:33:55 12#
太渣了!!!!!!!!!!连css3都支持不好,
╔══╗ ♪ ║██║ ♫ 器粉跑堂
2015-11-19 22:05:40 发自手机 13#
该楼层已被删除
大道至简_vR0Za9 器粉跑堂
2015-12-01 14:54:29 14#
为什么安卓手机QQ浏览器的键盘事件的keyCode都是0?

大烧包 器粉跑堂
2015-12-02 14:25:03 15#
 本帖最后由 大烧包 于 2015-12-02 14:34:04 编辑对于5.0以上的系统,必须覆写onShowFileChooser方法才能出现文件选择界面(你们的演示程序由于没有覆写。所以在我的演示机型上无法调出文件选择器)。那么问题来了,我覆写了onShowFileChooser方法后,在activity的onActivityResult方法里回调valueCallback方法出错:Duplicate showFileChooser result。我通过断点调试发现问题如下:1、我再代码里覆写onShowFileChooser方法是传入的ValueCallback<Uri[]> valueCallback是:
///////////////////////

package com.tencent.smtt.sdk;
public interface ValueCallback《T》 extends android.webkit.ValueCallback<T> {     void onReceiveValue(T var1);}
但是一旦编译打包后到机器上运行,通过调试发现实际生成并传入的ValueCallback<Uri[]> valueCallback是:
///////////////////////
package com.tencent.smtt.sdk;
import android.net.Uri;
import com.tencent.smtt.sdk.SystemWebChromeClient;
import com.tencent.smtt.sdk.ValueCallback;

class implements ValueCallback《Uri[]》 {    p(SystemWebChromeClient var1, android.webkit.ValueCallback var2) {        this.b = var1;        this.a = var2;    }public void a(Uri[] var1) {       this.a.onReceiveValue(var1);    }}
也就是说你们打包实际调用和SDK封装暴露出来给我们用户的是不一致的东西。请解决这个问题。

尖括号居然不支持,只好用《》代替了
大烧包 器粉跑堂
2015-12-02 15:09:14 16#
 本帖最后由 大烧包 于 2015-12-02 15:10:11 编辑你们的开发者后台出现严重的问题:我用你们的X5演示程序能够调用到X5内核,而我自己的就不行,我折腾了半天,最后怀疑是KEY的问题。于是我进入到开发者后台并登录,让我吃惊的是居然需要我再次填写登记信息,但是我填了后却提示我们已经注册登记了。网页打开关闭几次,居然神奇般的不需要我登记了,然而我前天建立的应用申请的key都消失不见了。我建立新的引用又提示我该应用应用已经被使用,这个怎么办,我的应用就是那个包名那个签名,我还能天天改?如此不稳定的后台这不是坑人吗?既然推出了服务就要做到这些最基本的东西稳定!无语
大烧包 器粉跑堂
2015-12-02 15:22:22 17#
 本帖最后由 大烧包 于 2015-12-02 15:29:59 编辑请问下:手机已经安装了QQ其他产品,为啥你们的X5功能演示程序能够不需要TBSDemo就能使用X5内核,而我自己的程序只有在安装并启动过TBSDemo后才能调用到X5内核?
风吹过淡蓝色天空 狂热器粉
中秋节勋章
2015-12-02 16:52:14 发自手机 18#
大烧包 发表于 2015-12-02 14:25:03 
对于5.0以上的系统,必须覆写onShowFileChooser方法才能出现文件选择界面(你们的演示程序由于没有覆写。所 ...

麻烦按格式去专帖反馈,谢谢
http://bbs.mb.qq.com/thread-376224-1-1.html
欧农 器粉跑堂
2015-12-02 16:59:08 19#
大烧包 发表于 2015-12-02 15:09:14 
你们的开发者后台出现严重的问题:我用你们的X5演示程序能够调用到X5内核,而我自己的就不行,我折腾了半天,最后怀疑是 ...

表示遇到了同样的问题,这个网站本身就各种奇葩
12>
回复

您需要 登录 后才可以回帖