热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

chromiumcronet库的编译用于Android和ios平台实现quic协议

chromium-cronet文档原文文档写的已经很清楚,最好还是参考官方文档,避免由于版本原因导致的问题。Cronet开发者文档:htt

 


chromium-cronet文档 原文文档写的已经很清楚,最好还是参考官方文档,避免由于版本原因导致的问题。

Cronet开发者文档:https://developer.android.com/guide/topics/connectivity/cronet

博客中的git地址:https://github.com/bgylde/chromium-cornet



环境配置


  1. chromium源码环境;
  2. 已经配置好相关环境,安装好相关依赖;
  3. 这里是在linux环境下对Android库的编译,在macos环境下会直接编译为ios平台库;

编译开发和debug环境的Cronet库


Android / IOS build

$ ./components/cronet/tools/cr_cronet.py gn --out_dir=out/Cronet

如果build主机是在linux环境下,build的是android的库。如果build主机是macOS,build的是ios库。

$ ninja -C out/Cronet cronet_package

编译Cronet库,最终文件可以在out/Cronet/cornet中寻找。


使用cronet库


  1. 创建CronetEngine,最好整个应用使用一个CronetEngine,这里可以理解为OkHttpClient;
  2. 创建自己的线程池给Cronet使用,Cronet的网络请求都会在线程池中,避免主线程阻塞;
  3. 实现回调UrlRequest.Callback,在UrlRequest调用start以后,网络请求开始,之后产生请求回调;

public class UrlRequestCallback extends UrlRequest.Callback {private static final String TAG = "UrlRequestCallback";private long startTime;private ByteBuffer mByteBuffer = ByteBuffer.allocateDirect(102400);private ByteArrayOutputStream mBytesReceived = new ByteArrayOutputStream();private WritableByteChannel mReceiveChannel = Channels.newChannel(mBytesReceived);@Overridepublic void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) {LogUtils.i(TAG, "onRedirectReceived method called.");// You should call the request.followRedirect() method to continue// processing the request.request.followRedirect();}@Overridepublic void onResponseStarted(UrlRequest request, UrlResponseInfo info) {LogUtils.i(TAG, "onResponseStarted method called.");// You should call the request.read() method before the request can be// further processed. The following instruction provides a ByteBuffer object// with a capacity of 102400 bytes to the read() method.//ByteBuffer byteBuffer = ByteBuffer.allocateDirect(102400);startTime = System.currentTimeMillis();request.read(mByteBuffer);}@Overridepublic void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) {LogUtils.i(TAG, "onReadCompleted method called.");// You should keep reading the request until there's no more data.try {byteBuffer.flip();mReceiveChannel.write(byteBuffer);byteBuffer.clear();} catch (IOException e) {LogUtils.e(TAG, e);}request.read(mByteBuffer);}@Overridepublic void onSucceeded(UrlRequest request, UrlResponseInfo info) {LogUtils.i(TAG, "onSucceeded method called: " + info.toString());LogUtils.d(TAG, "cost time: " + (System.currentTimeMillis() - startTime) + " ms");//byte[] bytes = mBytesReceived.toByteArray();String receivedData = null;try {receivedData = mBytesReceived.toString("GBK");} catch (UnsupportedEncodingException e) {LogUtils.e(TAG, e);}final String url = info.getUrl();final String text = "Completed " + url + " (" + info.getHttpStatusCode() + ")";//LogUtils.i(TAG, "text: " + text);//LogUtils.i(TAG, "receivedData: " + receivedData);}@Overridepublic void onFailed(UrlRequest urlRequest, UrlResponseInfo urlResponseInfo, CronetException e) {//LogUtils.d(TAG, "url: " + urlResponseInfo.getUrl());LogUtils.e(TAG, "onFailed method called.", e);}@Overridepublic void onCanceled(UrlRequest request, UrlResponseInfo info) {LogUtils.d(TAG, "onCanceled method called.");}
}

  • onRedirectReceived 顾名思义,是重定向的回调,这里直接选择继续访问重定向的地址,也可以调用UrlRequest的cancel方法,取消访问;
  • onResponseStarted 从google文档上面来看是请求完header以后开始请求body部分会回调这里,每次请求只会回调一次;
  • onReadCompleted 这是读取body一定数据时会回调这个方法,这里request.read读取的数据不一定会填满缓冲区,请求生命周期中会有多次回调发生;
  • onSucceeded 最终请求成功回调,可以作为数据处理阶段;
  • onFailed 请求失败回调,例如网络不通,或者没有网络访问权限之类的错误;
  • onCanceled 请求取消回调,只会在cancel后才会回调,回调这个意味着整个请求完成;

https://ssl.gstatic.com/gb/images/qi2_00ed8ca1.png 实现quic访问,可作为测试地址。


 这是通过抓包看到的quic协议,进一步的性能对比就需要自己搭建一个支持quic协议的服务器。


推荐阅读
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
author-avatar
终结者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有