背景
网络质量是移动端开发很关注的指标,典型场景宝贝详情展示,在网速好的时候出宝贝高清大图片,网络不好的时候出小图片,保证用户的体验和流量付出的平衡。
Network Connection Class是一个由Facebook公司出品的Android类库,用于监听App当前网络流量以及将其按照网络质量进行分类,其是如何做到呢?
原理
android是基于linux的,搞过服务端监控都知道,tsar等统计工具,也都是读取下内核记录的相关各种stat数据,那其实这个库也是一样的,其读取了/proc/net/xt_qtaguid/stats记录的信息
如上图例子,rx_bytes是接受到的数据字节数,tx_bytes则是发送出去的数量,其他参数可以自己看看就能明白,下面每一行代表一个用户下的流量情况。既然有这数据,那要做app对网络质量的监控,就有米了。
功能原理
1、用android的loop,hander,message机制,每1秒异步的去捞取数据分析,此库还是自己去读取文件,逐行过滤用户,选取自己Process.myUid()的数据进行统计,其实Android API8 以后提供了getUidRxBytes以及getUidTxBytes,也是读取这文件。在android.net.TrafficStats里面提供了完善的数据
这样可以直接利用,也可以忽略不同平台的差异性,比如有些版本是要读取/proc/uid_stat/***(uid)/tcp_rcv和tcp_snd文件等,可以等这系统接口取不到数据的时候,再自己想办法去捞取数据。不需先自己进行复杂的文件解析,轻松可以捞取tcp、udb、总量等各个维度数据。可以自己app,和总数据等进行比对分析
2、同时可添加个实现ConnectionClassManager.ConnectionClassStateChangeListener接口的listener,当网络变化的时候去进行回调。默认规则是,连续5次以上,新采样的网络质量一直恒定新值,与当前网络质量不同,才会触发listener回调。这里其实是对网络波动的灵敏度控制。
算法
网络质量定义:
/**
* Bandwidth under 150 kbps.
*/
POOR,
/**
* Bandwidth between 150 and 550 kbps.
*/
MODERATE,
/**
* Bandwidth between 550 and 2000 kbps.
*/
GOOD,
/**
* EXCELLENT - Bandwidth over 2000 kbps.
*/
EXCELLENT,
/**
* Placeholder for unknown bandwidth. This is the initial value and will stay at this value
* if a bandwidth cannot be accurately found.
*/
UNKNOWN
那怎么确定网络质量,因为从文件捞取的数据是字节数,因此都需要*8转换为每秒的比特位,如果每秒小于10的数据会被忽略,然后再去运算。
当app刚刚启动的时候,怎么样才能更精确反应当前的网速呢,其定义了个重要的常量
/**
* The factor used to calculate the current bandwidth
* depending upon the previous calculated value for bandwidth.
*
* The smaller this value is, the less responsive to new samples the moving average becomes.
*/
private static final double DEFAULT_DECAY_CONSTANT = 0.05;
对确定了另外两个常量
double mDecayConstant=
DEFAULT_DECAY_CONSTANT;
int mCutover=
decayConstant == 0.0? Integer.MAX_VALUE: (int) Math.ceil(1 / decayConstant);
核心算法:
/* * Adds a new measurement to the moving average.
* @param measurement - Bandwidth measurement in bits/ms to add to the moving average.
*/
public void addMeasurement(double measurement) {
double keepConstant = 1 - mDecayConstant;
if (mCount > mCutover) {
mValue = Math.exp(keepConstant * Math.log(mValue) + mDecayConstant * Math.log(measurement));
} else if (mCount > 0) {
double retained = keepConstant * mCount / (mCount + 1.0);
double newcomer = 1.0 - retained;
mValue = Math.exp(retained * Math.log(mValue) + newcomer * Math.log(measurement));
} else {
mValue = measurement;
}
mCount++;
}
看上去是否很高大上啊,还用math.exp和log,自然指数、欧拉数,还记得吗?我已经还给学校的体育老师了。自己补脑了
而计算的公式换个矮穷挫的类似写法就是
网速=之前平均值网速*旧权重比例 + 新采样的速度*新采样的权重值
那之前定义的两常量干啥呢,其实就是mDecayConstant=0.05 mCutover=20
再看就很明了了,在统计前二十次,第一次取采样值,后续旧权重比例逐步的增加,当超过20次后,就权重比例就恒定为0.95,新采样的权重为0.05了。
其实之前DEFAULT_DECAY_CONSTANT注释上说的很明白了,这个值越小,刚启动时候,旧权重比例会更慢的累计,当超过阀值后,新采样的权重值越小,对网络波动可能就不敏感了。因此这个值,是需要好好权衡。
同时这个库只统计了下行,在一些特定业务需要,也可以对上行进行监控,甚至可以区分tcp ,udp等数据统计分析
相关推荐
在`facebook-network-connection-class-570065a` 这个压缩包中,很可能包含了Facebook开源的网络连接类实现,你可以从中学习和借鉴其设计思路和代码实现。这个类可能已经集成了上述的网络监控和质量分类功能,通过...
7. **广告集成**:包括Facebook Audience Network,可以在应用中展示广告,为开发者创造收入。 二、SDK安装与配置: 1. **添加依赖**:在你的Android项目的build.gradle文件中,添加Facebook SDK的依赖库。 2. **...
包含以下资源: 1、android-appcompat-v7 2、facebook-ads-4.27.0 3、facebook-common-4.29.0 4、facebook-core 5、facebook-login-4.29.0 6、facebook-share
这份源码学习资料,"应用源码之facebook--sdk-master.zip",将带你深入了解这个SDK的内部工作机制,帮助你提升在Android平台上进行社交应用开发的能力。 首先,我们要明确Facebook SDK的主要功能,它涵盖了用户登录...
Facebook Audience Network是Facebook提供的广告平台,SDK中的`AudienceNetwork`模块允许开发者在应用内展示原生广告、横幅广告、插屏广告等。通过集成`AdController`和`AdView`,开发者可以轻松地在应用的关键位置...
1. **facebook-common**:这个模块提供了通用的功能和类,比如基础的Facebook API调用,数据模型和常量定义。它为其他模块提供基础支持,确保整个SDK的一致性。 2. **facebook-places**:此模块专注于与Facebook ...
在本文中,我们将深入探讨如何在 Laravel 框架中集成并使用 Facebook PHP SDK,以实现与 Facebook API 的无缝对接。Laravel 是一个基于 PHP 的流行开源 Web 应用框架,以其优雅的语法和强大的功能深受开发者喜爱。...
《Facebook位置预测:基于K近邻算法的实践》 数据科学在当今社会中扮演着越来越重要的角色,尤其在社交媒体领域,如Facebook。Facebook用户产生的大量数据为预测分析提供了丰富的资源。本篇将聚焦于一项挑战——...
**PyPI 官网下载 | facebook-wda-1.0.1.tar.gz** PyPI(Python Package Index)是Python开发者最常使用的软件包仓库,它提供了丰富的Python库供用户下载和使用。`facebook-wda-1.0.1.tar.gz` 是一个在PyPI上发布的...
7. **广告集成**:SDK支持在应用中展示Facebook Audience Network的广告,包括横幅广告、插屏广告和原生广告。这为开发者提供了一种增加收入的方式。 8. **Deep Linking**:SDK支持深度链接,当用户点击一个...
在本压缩包“Android应用源码之facebook--sdk-master_应用.zip”中,包含的是Facebook为Android平台提供的SDK源码。这个SDK是Facebook为开发者设计的,用于在Android应用程序中集成Facebook的功能,如登录、分享、...
对于想要在应用中插入广告的开发者,Facebook Audience Network提供了一种方式来展示有针对性的广告,并从中获得收益。4.11.0可能包含了广告格式的更新或性能提升。 6. **Demo App**: 压缩包中的Demo App是一个...
《Facebook数据抓取利器——Python库facebook-scraper详解》 在当今互联网时代,社交媒体平台如Facebook成为了信息传播的重要载体,而对这些平台的数据进行分析和挖掘则成为了许多研究者、营销人员以及开发者的重要...
PyTorch是Facebook开源的一个Python库,其特点是动态图和灵活的API,适合快速实验和研究。它的核心概念包括张量(Tensor)和自动求导(Autograd)。张量是PyTorch的数据结构,可以进行数学运算;自动求导系统则允许...
【Android应用源码之facebook--sdk-master.rar】这个压缩包文件包含了Facebook SDK的源代码,这对于Android开发者来说是一个宝贵的学习资源。Facebook SDK是Facebook提供给开发者用于集成其服务到Android应用的一个...
安装`facebook-scraper`库非常简单,只需在命令行中输入`pip install facebook-scraper`即可。然后,通过导入`facebook_scraper`模块,就可以开始编写抓取代码了。 然而,值得注意的是,由于Facebook不断更新其网站...
为了顺利集成Facebook-objc-sdk-5.0.2,开发者需要配置Xcode项目,包括设置Info.plist文件中的Facebook App ID,导入必要的库,以及在Build Phases中链接框架。此外,还需要在真机或模拟器上进行测试,因为有些功能...
Facebook Android SDK 4.6.0 是Facebook提供的一款开发工具包,专为Android开发者设计,以便在他们的应用程序中集成Facebook的功能。这个SDK允许开发者轻松地实现Facebook登录、分享内容、获取用户信息以及与用户的...
首先,SDK中的核心组件是`facebook-android-sdk.jar`,它包含了Facebook API的核心类和方法。开发者可以通过创建`Facebook`对象并调用其提供的方法,如`login()`、`request()`等,来执行用户登录、获取用户信息或...
适用于Facebook受众群体网络的Android演示应用程序 新闻订阅源应用程序可演示与原生广告集成。 入门 请按照本为Audience Network注册一个帐户并设置广告展示位置。 从获取News API的API密钥。 替换fb-audience-...