您的位置:首页 > 房产 > 建筑 > 【Android Studio】Webview 内核升级得三种方法(续)

【Android Studio】Webview 内核升级得三种方法(续)

2024/10/5 20:25:50 来源:https://blog.csdn.net/weixin_48618536/article/details/141470933  浏览:    关键词:【Android Studio】Webview 内核升级得三种方法(续)

【Android Studio】Webview 内核升级得三种方法(续)

  • 前言
  • 对原理学习中对应的重点进行一个记录
  • 针对网页加载流量进行一个监控

前言

在之前的博文【Android Studio】Webview 内核升级得三种方法中,介绍了内核升级的三种方法,并提出了对应的demo,针对当时推荐的方案,即webview升级加载的内核(完美解决) 当时主要是使用了大神提供的库,没关注具体的实现原理。本期主要是对原理学习中对应的重点进行一个记录,其次针对网页加载流量进行一个监控

对原理学习中对应的重点进行一个记录

首先,当时了解到这个库是来源与库开发者的博文Android免安装升级系统WebView内核探索 ,然后从GitHub上JonaNorman/WebViewUpgrade下载了源码,根据里面的实例进行使用,结果很成功。

其次,根据博文中的原理介绍,进行了原理学习。由于下载的Android Studio 是Android Studio Koala | 2024.1.1 Patch 1,直接打开源码版本有点问题,因此进行了相关类的移植,主要的变动就在于build.gradle.kts中第三方库文件的导入,如导入下载文件的框架Aria ,应该用implementation("me.laoyuyu.aria:core:3.8.16")。关于这个库最大的特点就在于可以支持断点续传,具体使用可以直接看官方文档,网上相关资料还挺多的。

最后,就是库的实现原理,就像开发者博文中说的,就是把WebViewUpdateService和PacakgeManagerService Hook 一下就行,但实操时,很建议先了解一下Hook 机制使用,主要学习的博文有Hook机制之Binder-Hook 和 Android插件化原理解析——Hook机制之动态代理,感觉这些博文讲得很清楚了,然后就是用好Ctrl +B 快捷键,查找接口的实现类,以及多打印日志,当然也可以调试模式一步步走。

在这里插入图片描述

针对网页加载流量进行一个监控

看完了原理,发现原来第一次完成后,会将地址存共享内存,下次如果能找到,就直接默认成功了,所以这个也就解释了为什么第二次进入内核更新,直接就进度条拉满了。最初网页打开慢,虽然发现是已经成功的load 了网址,但依旧需要很久才加载出来,因为不了解底层实现,当时怀疑是内核升级的问题,导致改变了webview,但看了库的底层,发现其实基本使用还是跟之前的一样:第一次进入内核升级一下,然后下次再进入就直接跳出内核升级了,进入了WebViewUpdateService和PacakgeManagerService重写的方法。后来还是一个前端大佬给出了方向,浏览器加载默认是无节能模式的,而手机内嵌带宽很窄,导致加载慢。如果加载网页切到低俗4G 或者3G 其实依旧很慢。

在这里插入图片描述

为了验证这个方向,进行了APP流量的检测,用得是TrafficStats类里面的方法,它提供了一些获取设备从本次开机到目前为止传输/接收的流量的接口,如下:
在这里插入图片描述
当然也可以参考官方文档,介绍都很详细的。针对流量检测的使用,封装了一下类,用于计算单位时间内,该应用的传输、接收字节总数:

private TextView tvSpeed;
private long lastTotalRxBytes=0;
private long lastTotalTxBytes=0;
private long lastTimeStamp =System.currentTimeMillis();private void getNetSpeed() {String netSpeed = "0 kb/s";long nowTotalRxBytes = TrafficStats.getUidRxBytes(getApplicationInfo().uid)==TrafficStats.UNSUPPORTED? 0 :(TrafficStats.getUidRxBytes(getApplicationInfo().uid)/1024);//转为KB;long nowTotalTxBytes = TrafficStats.getUidTxBytes(getApplicationInfo().uid)==TrafficStats.UNSUPPORTED? 0 :(TrafficStats.getUidTxBytes(getApplicationInfo().uid)/1024);//转为KB;long nowTimeStamp = System.currentTimeMillis();long speedRx = ((nowTotalRxBytes - lastTotalRxBytes) * 1000 / (nowTimeStamp - lastTimeStamp));//毫秒转换long speedTx = ((nowTotalTxBytes - lastTotalTxBytes) * 1000 / (nowTimeStamp - lastTimeStamp));//毫秒转换lastTotalRxBytes = nowTotalRxBytes;lastTotalTxBytes = nowTotalTxBytes;lastTimeStamp =nowTimeStamp;netSpeed  = "传输速度:"+speedTx + " kb/s ----" +"接收速度:"+speedRx + " kb/s " ;tvSpeed.setText(netSpeed);}

然后加个定时器循环调用就行

private Timer timer;private void calSpeed() {timer =new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {getNetSpeed();}},0,2000);}

最后发现确实是那么一回事,就只有10几KB ,那确实是加载慢呀!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com