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

news/2024/9/13 20:41:28 标签: android studio, android, ide

【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 ,那确实是加载慢呀!


http://www.niftyadmin.cn/n/5622259.html

相关文章

Android Studio(3) 使用 Kotlin DSL和 Gradle 8.7 打包远程库到 AAR 的自定义方法

背景介绍 在 Gradle 7.3 及更早版本中,通常使用 com.kezong.fat-aar 插件来打包远程库到 AAR 中,随着 Gradle 的不断升级,尤其是到 8.7 版本后,Kotlin DSL开发逐渐成为主流,fat-aar 社区没有更新,插件的兼容性问题逐渐显现。我探索一种新的自定义方法,能够在 Kotlin DS…

Clickhouse和MySQL的区别以及适用业务场景

Clickhouse和MySQL的区别 ClickHouse 和 MySQL 是两种不同类型的数据库管理系统,它们在设计理念、数据处理方式和应用场景上有着明显的区别。 区别和特点 1.设计目标 ClickHouse ClickHouse 是一种面向分析的列式存储数据库,旨在处理大规模数据的高性…

无人机之云台的重要性

无人机云台在无人机技术中占据着举足轻重的地位,其重要性体现在多个方面: 首先,无人机云台是确保拍摄稳定性的关键组件。无人机在飞行过程中,尤其是遇到风力干扰或进行复杂飞行动作时,机身容易产生震动和晃动。而云台的…

《花100块做个摸鱼小网站! 》第四篇—前端应用搭建和完成第一个热搜组件

一、前言 在本系列文章的早期章节中,我们已经成功地购买了服务器并配置了MySQL、Redis等核心中间件。紧接着,我们不仅建立了后端服务,还开发了我们的首个爬虫程序。后面我们还把爬取到的数据进行了保存,生成了一整套MVC的后端代码…

探索 Linux 内核启动过程

目录 1. Linux 内核启动过程概述2. start_kernel (内核初始化)3. rest_init4. kernel_init5. kthreadd总结 1. Linux 内核启动过程概述 在 Linux (2.6.39.4)系统的启动过程中,内核扮演了至关重要的角色。它负责从系统启动开始,初始化硬件、管理内存、加…

SpringBoot集成kafka-消息转发@sendTo()注解

SpringBoot集成kafka-消息转发sendTo 1、消费者2、生产者3、实体类对象4、JSON工具类5、配置文件application.yml6、测试类7、测试 1、消费者 启动消费者进行消息监听,消费者A监听到生产者发送的消息使用sendTo()注解将消息转发给消费者B package com.power.consu…

提升学术论文质量的智能助手:ChatGPT

提升学术论文质量的智能助手:ChatGPT 前言ChatGPT的核心功能ChatGPT的优势具体应用案例局限性与最佳实践结语 前言 在这个知识爆炸的时代,学术研究已成为推动社会进步和科技发展的重要力量。每一篇论文的撰写,都是对人类知识边界的一次探索和…

Vulkan 学习(5)---- Vulkan 内存分配

目录 Overview枚举内存信息分配内存内存映射 Overview Vulkan 将内存管理的工作交给了开发者自己负责,如何分配内存,如何指定内存策略都是由开发者自己决定的,当然处理问题也是由开发者自己负责的 Vulkan 将内存划分为两大类:主…