小说接入UC浏览器内核技术对话(一)

质辛
@灿岩 

质辛
跟我们说一下那个删除文件的逻辑吧

质辛
@灿岩  应该不是删除cache下所有文件吧?

质辛
@智鹰  提供一下我们的临时文件完整路径给 灿岩吧

质辛
@智鹰  是负责我们ucsdk的 技术对接

灿岩
我们不会删除cache下的所有文件的
1人未读

灿岩
@智鹰  是不是下班啦
全部已读

质辛
没有,他坐在我后面

质辛
图片

灿岩
又等于1了?
全部已读

灿岩
书旗不会主动删除你们的文件,都是谁想删除文件,调用 deleteFile(File file)方法,才会删除的
全部已读

质辛
没看出什么规律

灿岩
我们删除的是自己的打点文件
全部已读

质辛
了解

灿岩
可是,我这边一次都没有出现过
全部已读

灿岩
你是怎么弄出来1的
全部已读

灿岩

全部已读

质辛
重启,退出,重启,退出,直到看到1

灿岩

全部已读

灿岩
图片
全部已读

灿岩
点击第二个tab的任何项目,都是打开失败
全部已读

灿岩
你试试
全部已读
智鹰

有一个猜想。
智鹰

因为书旗有两个进程,一个controller,一个push

灿岩
现在的现象是不流畅,还不如原生的问view
全部已读
智鹰

代码写在Appication.onCreate里面去,所以估计两个进程都有执行到该代码。
智鹰

所以建议你们将初始化的代码不要写到app.create,如果只有一个activity,建议写在activity里面。

灿岩
可以
全部已读
智鹰

如果有多个activity,建议写成一个单例wrapper类,在第一个activity创建时初始化就好。

灿岩
我们有一个总的Activity,mainActivity
全部已读

灿岩
我想写到mainActivity中
1人未读

灿岩
两个问题: 
1、点击第二个tab的任何项目,都是打开失败
2、现在的现象是不流畅,还不如原生的问view
全部已读

灿岩
这两个问题,我们这边再调试一下
全部已读

质辛
先调整好初始化这个问题先

灿岩
好的
全部已读

质辛
等初始化没问题,正常流程走通,我们再看看这个 页面加载是什么原因

灿岩

全部已读

质辛
因为我们是默认走中转服务器的,后面可能要加一些 适配开关

灿岩

全部已读

质辛
今晚就先到这里咯,明天你那边如果实现好初始化时机,我们再对下

灿岩
好的,ok
全部已读
灿岩把 方巍 加入群
05-20 10:45

质辛
@灿岩 调整初始化的时机后还有问题吗

灿岩
现在能够下载成功了
1人未读

灿岩
基本第二次启动就能加载uc内核
1人未读

灿岩
不过有问题,我给你发个包,你看看
1人未读

质辛
昨天的加载问题还有吗

灿岩
shuqi_android-debug.apk
(15.3 MB)
下载文件转存钉盘预览群文件
1人未查收

灿岩
这次放到MainActivity中了,暂时没看到昨天的问题
1人未读

灿岩
你跑一下这个包,第二页,点击任何书籍封面项,都是打开失败,没有响应
另外,第三个tab,加载不出来
1人未读

灿岩
这两个问题,需要你看看
1人未读

质辛
应该都是一个问题

质辛
就是加载不出来

质辛
你们加载有特殊适配什么代码吗?

灿岩
没有,就是loadurl
1人未读

质辛
可以把那个url发给我一下吗

灿岩
好的
1人未读

方巍
我们这边还有一些关于WebSetting的设置,是完全按照之前原生webview 的方式来的,这个会不会有问题呢

质辛
@方巍 一般不会有太大问题,主要看看是不是对某些重载后的接口有特殊的适配,要具体看看问题是什么

灿岩
质辛,书旗输出的log用SqBrowserView过滤一下
1人未读

质辛


灿岩
图片
1人未读

灿岩
url就都看到了
2人未读

灿岩
每加载一个url,都有log输出的
1人未读

灿岩
质辛,今天我和方巍和你一起调试,谢谢
1人未读

灿岩
http://appsou.demohz.shuqi.com/route.php?sq_pg_param=defin  这个url,是第二个tab的url
1人未读

方巍

是的,第二个,搜书

方巍
网页中点击某一项的话“打开失败”的显示应该是UC内核给出的,实现是调用了webview的JavascriptInterface,现在相当于是没有调通

质辛
好的,稍等

质辛
这个页面我用 chrome打开也是弹出打开失败,是需要依赖apk客户端吗

方巍
是需要回调客户端的Javascript接口

质辛
图片

质辛
用的是我们的这个接口吧?

灿岩
这个我们再看一下
1人未读

质辛
第三个Tab,书城,是不是进入那个url的时候,也要注入js?

灿岩
图片
1人未读

灿岩
现在是页面js没注入,是吧?
1人未读

质辛
你们是  import com.uc.webview.export.JavascriptInterface吗

灿岩
我们用的注解
1人未读

质辛
能否用全名试试

灿岩
图片
1人未读

质辛
可能还要考虑降级为系统内核的时候

质辛
兼容这种情况

灿岩
图片
1人未读

灿岩
图片
1人未读

灿岩
js桥,是这样实现的,是不是这样用的是原生的?
1人未读

质辛
有可能用到了原生的那个

灿岩
图片
1人未读

质辛
这个是你们现在引用的吗?

灿岩
恩,我们改了一下,改成import com.uc.webview.export.JavascriptInterface,就都ok了
1人未读

质辛
如果你们本身有的话

质辛
可以兼容两个

灿岩
怎么兼容两个呢?
1人未读

质辛
因为也要考虑到降级为系统的情况

质辛
注解两个包名

质辛
同时  import  android 跟  uc的

质辛
然后注解那边注解2个全名的 javascriptInterface

质辛
兼容没有UC的情况

灿岩
恩,应该这么弄
全部已读

灿岩
图片
全部已读

方巍
现在是这样的。
我们引用原生的JavascriptInterface注解的话,用咱们的UC内核无法成功调用;用原生内核的话UCJavascriptInterface无法成功调用

方巍
图片

方巍
两个都引用编译器会报错

灿岩
图片
1人未读
智鹰

[阴笑]
智鹰

[OK]

灿岩
怎么注解两个,哈哈,智鹰出现了
全部已读

灿岩
怎么注解两个,亲们
1人未读
智鹰

图片

灿岩
恩,ok的
全部已读

方巍
图片

方巍
图片

方巍
现在就是在写JavascriptInterface接口时会出现这种情况

质辛
import 我们那个吧

灿岩
原生的不用import了,是么?
1人未读
智鹰

同名类都只能import一个的呀,另外一个用包名+类名直接引用
智鹰

或者都不import,全部用全路径。

方巍
我们是这样的,写了一套JavascriptInterface的接口,但是用UC内核和原生内核来切换

灿岩
我理解智鹰的意思,我们做一下试试
全部已读

灿岩
我们想,引入 uc的,原生的用全路径搞一下
全部已读
05-20 11:48
智鹰

好的。

灿岩
刚才测试了一下,这种方式是ok的
全部已读

灿岩
页面都可以加载出来了
全部已读

灿岩
但是,现在uc内核加载搜书Tab,流畅度还不如原生WebView
全部已读

灿岩
这个是什么情况?[阴笑]
全部已读

质辛
加载流畅度?

灿岩
嗯嗯
1人未读

质辛
是指加载速度?

灿岩
滑动的流畅度
1人未读

质辛
滑动的流畅度

质辛


灿岩
这个是我们最需要的
全部已读

灿岩
也是接入的最本质需求
全部已读

方巍
还有请问下咱们这个第一次进入下载完成的话会静默切换吗?还是必须要第二次启动才会切到UC内核

质辛
静默‘但需要第二次new webview

质辛
发个包过来‘我们看看流畅度问题

灿岩

全部已读

灿岩
这个包,试试
全部已读

灿岩
shuqi_android-debug(1).apk
(15.3 MB)
下载文件转存钉盘预览群文件
2人未查收
05-20 13:39
智鹰

有开ac的么?初始化选项可否贴一下?

质辛
.setup(UCCore.OPTION_HARDWARE_ACCELERATED, true)

质辛
要用这个
05-20 13:53

灿岩
需要写到初始化那段代码里,是吧?
1人未读

质辛
是的,要增加这个OPTION

质辛
图片

质辛
这个是你那边的适配代码,是没有开启AC的

灿岩
因为原生WebView开启了硬件加速,会在某些机型上有crash等适配问题
1人未读

灿岩
咱们的UC内核,不会有这种问题,是吧?
1人未读

质辛
我们会有兼容,如果你手头上有已知机器,你可以用来测试下

灿岩
对特定机型做了处理么?
1人未读

灿岩
某些特定机型,就不开启硬件加速么?
1人未读

质辛
我们会对运行环境做判断

灿岩
好的
1人未读

灿岩
不过我感觉挺奇怪的,使用了UC内核,还需要开启硬件加速?
1人未读

质辛
开跟不开,是两种体验。

质辛
你可以先试试

灿岩
shuqi_android-debug(2).apk
(15.3 MB)
下载文件转存钉盘预览群文件
2人未查收

灿岩
图片
全部已读

灿岩
我在魅族pro手机上,还是不流畅
全部已读

灿岩
开启了硬件加速
全部已读

灿岩
质辛,你试试
全部已读

质辛
恩,最新包开启了的,发我

灿岩
包已经在群里了,请查收一下
全部已读
05-20 14:18
智鹰

@灿岩 硬件加速还要求窗口系统开启的,不知道是否也设置了?

灿岩
是在相应的Activity开启么?
全部已读
智鹰

Activity.onCreate() {

        // Setup hardware acceleration
        if (sSystemSettings.mUseHardwareAC) {
            final int FLAG_HARDWARE_ACCELERATED = 0x01000000;
            getWindow().setFlags(FLAG_HARDWARE_ACCELERATED, FLAG_HARDWARE_ACCELERATED);
        }
}
智鹰

对的。

灿岩
完整代码,给贴出来一下
全部已读

灿岩
   if (sSystemSettings.mUseHardwareAC) {
            final int FLAG_HARDWARE_ACCELERATED = 0x01000000;
全部已读

灿岩
不用了
全部已读
智鹰

新的4.x以上手机都基本支持硬件加速的,这个选项做细了可以做很复杂

灿岩
是的
全部已读

灿岩
用原生的WebView,如果开启了硬件加速,基本也可以满足需求
全部已读

灿岩
现在浏览内核也需要开启硬件加速,我就提出了 是否会有各个系统和机型的兼容性问题
全部已读

灿岩
会不会引起崩溃等问题
全部已读
05-20 14:40

灿岩
图片
全部已读

灿岩
MainActivity 已经开启了硬件加速
全部已读

灿岩
原来就已经开启了
全部已读

灿岩
图片
1人未读

灿岩
给Layout和MainActivity都添加了硬件加速
1人未读

灿岩
shuqi_android-debug(3).apk
(15.3 MB)
下载文件转存钉盘预览群文件
2人未查收

质辛
你用的手机是 魅族MX5?

灿岩
质辛,看看这个包,加载速度应该够了,只是滑动速度,还是不流畅
全部已读

灿岩
魅族4 pro
全部已读

质辛
我有个问题

灿岩
恩,
全部已读

质辛
书旗的页面,在UC浏览器上,流畅吗

质辛
就是你可能要对比一下,你当前这个手机

质辛
在UC浏览器上,同样的页面,滑动是否一样

灿岩
bs.demowx.shuqi.com/route.php?appfunction=an_bmk,1_clo,1_smjs,1&soft_id=1&ver=160429&appVer=9.7.0.31&platform=an&placeid=1073&imei=865863027509616&mac=&cellid=13&lac=-1&sdk=22&wh=1536x2560&imsi=460025107057243&msv=3&enc=302491463727811921&sn=1447292150187740&vc=ae2b&mod=MX4+Pro&manufacturer=Meizu&brand=Meizu&net_type=wifi&first_placeid=src1073&aak=643332&user_id=267752155&session=Fj9PFKFQhq9kQGN9PoTPQqMhTTNPN&utype=pre_vip&net=4&net_env=4&writer_switch=1&sq_pg_param=bsrc
全部已读

灿岩
要比书旗上的好一点
全部已读

灿岩
图片
全部已读

灿岩
这个是搜书TAB的二维码
全部已读

灿岩
你可以扫一下
全部已读

灿岩
有的手机很顺滑,有的手机比如我的魅族pro4,就不顺滑
全部已读

质辛
@灿岩 搜书那边一直划是吧?

灿岩
刚才我说的有问题,是原生的WebView开了硬件加速后,很顺滑,切换到UC的WebView就没有那么顺滑了
全部已读

灿岩
是的
全部已读

灿岩
把搜书的url放到uc浏览器中,就很顺滑
全部已读

灿岩
[阴笑]
全部已读

方巍
现在用UC内核加载的速度还是挺快的,就是滑动会感觉到明显卡顿

灿岩
@质辛  这个是新包,你看看
1人未读

灿岩
shuqi_android-debug(4).apk
(15.3 MB)
下载文件转存钉盘预览群文件
2人未查收

质辛
@方巍  缓慢的情况我看到了,但这种页面要调调看才知道是什么问题

灿岩
好的
1人未读

方巍
ok

灿岩
帮忙看看,刚才在群里发了一个包
1人未读

质辛
魅族MX5上看到的是你们用的还是软AC

灿岩
在哪里用的软ac
1人未读

质辛
或者能否在shuqi上先确认 你们的activity在 魅族就是用了AC的

质辛
图片

质辛
这个是MX5上的运行情况,我们通过这个调试开关看到 还是 SF,软AC

灿岩
流畅了
1人未读

灿岩
图片
全部已读

灿岩
把这块儿关了,就流畅了
全部已读

灿岩
以前开着
全部已读

灿岩
这个包,质辛 你试试
全部已读

灿岩
shuqi_android-debug(5).apk
(15.3 MB)
下载文件转存钉盘预览群文件
3人未查收
05-20 15:45

灿岩
@质辛  我们在view级别,开启硬件加速,可以么?
全部已读

质辛
@智鹰 

质辛
要activity

方巍
现在的测试在view级别的硬件加速效果还不错,activity级别的话,会不会成本比较大,因为我们涉及到webview的activity还是挺多的

质辛
从现象看的话,就是搜书那边的webview还是受到了适配层影响,用了sf

质辛
这个你们评估吧,但不流畅问题基本上就是这个

灿岩
我们在Activity里边加上,不在View级别添加硬件加速。这边需要添加的Activity大约10个以内,大多都是继承base
全部已读
05-20 16:09

灿岩
@质辛 @智鹰   
问几个问题:
书旗小说现在要支持2.3及以上的手机

1、现在在Activity上添加硬件加速,可能会在不支持硬件加速的手机上,会引起WebView以外的控件渲染出问题?如果UC内核下载失败,使用sdk中的原生WebView,开启硬件加速会不会引起问题?

2、如果我们这边在View级别添加硬件加速,例如:只对UC的WebView添加硬件加速,会引起什么问题?为什么非要在Activity级别?

全部已读
智鹰

1.1.4 View级别

  我们可以对单独的View在运行时阶段禁用硬件加速。我们可以使用如下代码:

  myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

  注意:现阶段不能够在View级别进行硬件加速。
智鹰

本质上,你的Activity启用了硬件加速,但一些view,不想单独作为一个层来处理,可以禁用,这样,一些层将使用软件合成,类似ps里面将多个层合并成一个位图,从而形成硬件加速里面的一个层,和其他硬件加速层进行合成。

方巍
在Activity级别开硬件加速的话,主要担心对Activity中非Webview控件有影响,因为要兼容一些低端手机,会造成无法渲染
智鹰

所以我说硬件加速选项的设置是一个比较复杂的过程。
智鹰

按照个人版的经验,主要由三个步骤组成。

灿岩
就是说,你们的sdk的机制,对整体开硬件加速,都有很好的处理策略,是吧?
全部已读

灿岩
我们放心用就行了?
全部已读
智鹰

1、根据内提供的接口,com.uc.webview.export.utility.Utils.checkSupportSamplerExternalOES()判断机器是否支持硬件加速。并设置到Activity。

2、通过View的dispatchDraw(Canvas canvas)接口所得到的canvas参数(第一次绘制),判断canvas是不是一个硬件canvas,如果不是,则禁用AC。

3、使用最终的ac值初始化内核。

灿岩
有文档么?共享一份儿
全部已读

灿岩
我也研读一下
全部已读

灿岩
[阴笑]
全部已读
智鹰

没有,这是跟个人版合作过程整理的。
智鹰

它们的实现也有bug,因为内核是在第一次绘制之前就初始化的,也就是3和2是反过来的,因此这里依然有bug。
智鹰

在Activity级别开硬件加速的话,主要担心对Activity中非Webview控件有影响,因为要兼容一些低端手机,会造成无法渲染
@方巍 这个我没有经验,不知道设置这个选项是否会造成其他view的问题,不过应该不至于吧?因为只有14版本以上才能支持硬件加速的。

灿岩
如果我在ac中开启了硬件加速,如果sdk中下载uc内核失败,这时候使用的是内核中的原生WebView,这时候开启硬件加速也没有问题,是吧?
全部已读
智鹰

1、根据内提供的接口,com.uc.webview.export.utility.Utils.checkSupportSamplerExternalOES()判断机器是否支持硬件加速。并设置到Activity。

这第一个步骤,个人版的实现中,除了内核接口,它们还有很多条件,例如sdk版本,例如内存大小,例如屏幕大小,例如别的要求
智鹰

@灿岩 不用担心系统的硬件加速代码的。
智鹰

@灿岩 我看你们是设置到AndroidManifest去,建议是动态设置,通过和个人版沟通经验,通过一系列条件判断是否合适开硬件加速。

灿岩
我们需要 通过 Utils.checkSupportSamplerExternalOES()这个方法,来判断当前机器,是否适合开启硬件加速,是吧?
全部已读

灿岩
适合就用代码开启ac的硬件加速,不适合,就不开启,对吧?
全部已读

方巍
请问:
sdk中下载uc内核失败或者我第一次加载SDK,这时候使用的是内核中的原生WebView
在该场景下,Utils.checkSupportSamplerExternalOES()这个方法里能进行判断我是否适合开启硬件加速吗?(此种场景下因用的是原生WebView,并不想开启硬件加速)
智鹰

@张灿岩 checkSupportSamplerExternalOES()只是站在内核角度,检查内核使用到的gl api是否满足要求。
智鹰

@灿岩 理论上来说,可能activity可以工作在硬件加速模式,但由于不支持内核的opengl api,因此webview使用软件绘制,也是可以的。
智鹰

@方巍 checkSupportSamplerExternalOES()不需要uc内核执行,它只是一些检查。

灿岩
如果webview使用软件绘制,即使用了uc内核,也会很不流畅
全部已读
智鹰

一般是4.0以下的低端机了
05-20 17:10
智鹰

1、设置到窗口系统是否应该开硬件加速(api版本、内存、屏幕、稳定性等考虑),建议该条件也加上checkSupportSamplerExternalOES。

2、第一屏绘制,确定绘制Canvas是否是硬件的。

3、检查UC内核的条件,checkSupportSamplerExternalOES,符合条件且2为硬件canvas的情况下,设置UC内核使用硬件加速,否则其它条件设置为false。
05-20 17:51

灿岩
@质辛  手淘那边,硬件加速相关的功能,是怎么设置的啊?
全部已读

质辛
手淘是4.0以上才能安装

质辛
没有上面的顾虑

灿岩
就是 无所顾忌的 AC都开启了硬件加速呗
全部已读

质辛


灿岩
图片
全部已读

灿岩
我懂了,4.0以上,我们就开启硬件加速,4.0以下,我们就不开启硬件加速
全部已读
11:46

方巍
@质辛 你好,我们现在在做关于Android这块儿浏览框架的SDK化,引入UC内核的目前存在两个问题:
1,文档上说4.0以下不支持硬件加速,因为我们的SDK需要兼容4.0以下,所以需要有一个判断当前版本再开启硬件加速,带来的问题是如果硬件加速是Activity级别的话,每一个想用到我们SDK的Activity都需要做判断,因为不知道除Webview外的其他控件是否需要硬件加速,这样的话SDK的抽象性并不是太好!疑问就是能否用View级别的硬件加速?或者View级别和Acitvity级别的话咱们内核底层的区别具体是什么?
2, 4.0以上开启硬件加速,第一次进入应用加载UC内核,此时还是原生WebView,硬件加速也会影响原生WebView。此时是不是还需要一个判断就是UC内核加载完成后再开启硬件加速?
智鹰

硬件加速,不是你想开就开的。
智鹰

第一屏绘制之前,必须确定。

方巍
是的,所以在Activity加载之前需要确定
智鹰

我们作为sdk提供对外的,就是一个加速选项设定,外加一个检查接口。
智鹰

同理,你们也可以这样设定,一个是否ac的初始化选项,提供一个api检查(里面建议加上你们的检查逻辑,以及我们对外的checkSamples接口),即可。

方巍
那咱们这边View级别和Acitvity级别硬件加速内核底层的区别具体是什么?
智鹰

建议你先看看渲染架构的文档。
智鹰

Activity的渲染,是从ViewRoot
智鹰

开始的。
智鹰

下面的View树节点中,按照一些规则,可以组织成多个可单独表示的层。

方巍
但是有一些的具体的View我如果不需要加速渲染,就必须要逐个设定了
智鹰

而某些view,可以显示声明,自己不想作为单独显示的层(即不是硬件加速层),它的渲染是先和别的层合并成为一张位图,最后成为一个硬件加速层,最后和别的硬件加速层在gpu进行合成。

方巍
好的
智鹰

我拉个渲染大神解答你的问题会更专业。

方巍
第一次进入的话,原生WebView我也是要显示声明,不做硬件加速吧
智鹰把 易旭昕 加入群

方巍
了解,多谢
智鹰

其实很简单的。你无非就是确定Activity是否要开AC而已嘛,那就使用一个算法:(自有开启条件 && UC内核开启条件 && 系统内核开启条件)
智鹰

其中你自有开启条件,可以是内存大小的判断,cpu核数的判断,system版本的判断。
智鹰

UC内核的条件,就是那个checkSamplesXXXXXX接口。
智鹰

系统内核的条件,就是你们过滤掉发现了稳定性问题的那些机型特征。

灿岩
系统内核的条件 这个,我们不好判断,机型太多适配起来太复杂,或者会有遗漏的机型,如果能够判断好,我们早就给原生WebView开硬件加速了
全部已读
智鹰

同理,你要做sdk,你将上面三个条件,放到一个函数里,提供给你的客户,并告知对方,这是你们书旗sdk支持ac的必要条件。
智鹰

@灿岩 这个是靠积累的,通过一个个灰度版本发布,慢慢积累机型特征数据。

灿岩
这个U
全部已读

灿岩
UC
全部已读

灿岩
那边有比较成熟的积累么?
全部已读

灿岩
你们就是做浏览器的,在你们的UC浏览器中,是如何接入的UC内核呢?
全部已读
智鹰

Roger大神是我们这边负责渲染架构的技术专家,他应该有权威的意见。
智鹰

@灿岩 跟你们现在接入的差不多。

灿岩
我们需要一个成熟的方案,来判断是否开启硬件加速?这个是我们之所以接入UC内核,也是最需要的
全部已读
12:27
易旭昕 12:27:49

内核本身没有限制,就是产品从内存占用考虑,限制低内存的手机使用软件渲染

上一篇:iOS播放器、Flutter高仿书旗小说、卡片动画、二维码扫码、菜单弹窗效果等源码


下一篇:【leetcode】70. 爬楼梯(Java)