【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() {
@Override
public void run() {
getNetSpeed();
}
},0,2000);
}
最后发现确实是那么一回事,就只有10几KB ,那确实是加载慢呀!