【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-HookAndroid插件化原理解析——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 ,那确实是加载慢呀!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻傻虎虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值