当前位置: 首页 > news >正文

免抵退税在哪个网站做深圳短视频推广

免抵退税在哪个网站做,深圳短视频推广,株洲定制型网站建设,起名网站怎么做背景 得物Apm系统本身包含网络接口性能监控的能力#xff0c;但接口监控主要关注的是接口的耗时、异常率等信息#xff0c;没有流量消耗相关维度的统计信息#xff0c;并且一部分流量消耗可能来自于音视频等其他特殊场景#xff0c;在接口监控的盲区外。 为了了解用户目前…背景 得物Apm系统本身包含网络接口性能监控的能力但接口监控主要关注的是接口的耗时、异常率等信息没有流量消耗相关维度的统计信息并且一部分流量消耗可能来自于音视频等其他特殊场景在接口监控的盲区外。 为了了解用户目前使用App时的流量消耗情况并支持分析用户是存在异常的流量使用情况还需要从流量消耗的角度进行相关监控功能的建设。本文主要介绍流量监控实现过程中的一些技术实现及平台能力。 流量消耗信息获取 xt_qtaguid模块 xt_qtaguid 模块 是android 内核3.0 引入的流量统计模块在Android系统9以下的版本可以通过直接读取 /proc/net/xt_qtaguid/stats 文件获取对应应用的 流量消耗信息。其内容如下 nimdanoob:/ $ cat proc/net/xt_qtaguid/stats | grep 10027 idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets 10 rmnet_data0 0x0 10027 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 rmnet_data0 0x0 10027 1 451662 2320 1193948 3888 451662 2320 0 0 0 0 1193948 3888 0 0 0 0 40 wlan0 0x0 10027 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 wlan0 0x0 10027 1 38829 166 77083 208 38829 166 0 0 0 0 77083 208 0 0 0 0在结果中根据 uid_tag_int 可以区分不同的应用程序这个值对应代码中 android.os.Process.myUid()获取的值。 第二列的 iface 表示所使用的网络接口比如 wlan 表示Wi-Fi网络适配器的物理接口 rmnet_data 表示手机数据网络接口 l0表示本地回环接口 。 通过读取 rx_bytes、tx_bytes 就可以获取不同网络接口累计使用的上下行流量大小。 除了通过直接读取 xt_qtaguid/stats文件的方式也可以直接通过调用系统封装TrafficStats类提供的相关Api获取流量消耗信息该类在 Android API8 版本开始就被引入了。 相关Api 如下 getUidTxBytes(int uid) :返回指定uid的上行流量消耗getUidRxBytes(int uid): 返回指定uid的下行流量getMobileTxBytes(): 返回整机的上行流量消耗getMobileRxBytes(): 返回整机下行流量消耗 TrafficStats的限制 在Android 9 版本开始google 逐步取消了对 xt_qtaguid模块的支持开始采用基于 eBPF的网络流量监控实现所以在高版本设备中无法再通过读取xt_qtaguid文件获取流量使用信息。 而直接使用TrafficStats读取流量消耗信息又由于其提供的Api有限存在一些限制比如TrafficStats 虽然支持查看指定程序的整体流量消耗信息但不支持根据iface端口进行区分因而无法明确wifi和移动分别消耗了多少流量。 在一些开源项目的实现中 通过ConnectivityManager 获取当前网络连接状态判断采样间隔内流量消耗来自于wifi还是移动。但是实际上在采样间隔内设备可能同时在使用wifi和移动进行进行网络通信因此这种方式采集的数据精准度有限。 另外采用基于TrafficStats Api的方案在接入得物后还发现TrafficStats统计的流量消耗比实际的流量消耗大了非常多实际流量消耗的5倍最后定位发现是由于得物的音视频场景 使用了本地Socket提供媒体数据,而TrafficStats.getUidTxBytes接口包含了所有iface的数据本地Socket的通信数据也会被包含在内。 NetworkStatsManager 在Android6.0 (API 23)版中系统新增了NetworkStatsManager类查询网络历史使用信息其提供的Api 能力相比TrafficStats 强大很多比如其可以获取指定时间内的流量消耗并且 通过指定networkType 可以区分流量消耗的类型。 NetworkStatsManager statsManager (NetworkStatsManager) getSystemService(Context.NETWORK_STATS_SERVICE); //查询自身进程 蜂窝网络消耗 statsManager.querySummary(ConnectivityManager.TYPE_MOBILE, , startTime, endTime); //查询整机 蜂窝网络消耗 statsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, startTime, endTime); 然而在实际的测试过程中以10s为采样间隔为例经常会发现采样间隔内统计的数值未发生变化在测试TrafficStats相关Api时发现没有类似的限制其返回的数值是是实时的。 通过跟踪NetworkStatsService相关的实现后发现原因可能是2个方面的问题导致的。 当应用层通过本地NetworkStatsManager调用相应Api获取消耗大小时会创建一个NetworkStats对象而NetworkStats对象构造时会创建一个本地的 INetworkStatsSession对象 首先需要了解NetworkStatsService 主要提供的是历史流量消耗记录的能力它的计算方式是周期性的读取ebpf相应的虚拟文件中从中获得最新的流量消耗大小。 NetworkStatsService为了尽量保证应用层获取的是最新的数据在每次openSession时会尝试进行一次poll不过这里的poll动作触发存在一定限制15秒内只能触发一次。 另一个原因是其底层实际负责流量记录的 NetworkStatsRecorder 会先将变化的流量信息统计在一个mPending对象中当pending 记录超出一定阈值后才会将这个数据落盘而这个阈值默认情况下为2MB。 为了验证这个问题保证每次采样时获取到的wifi及移动消耗数据是最新的我们可以创建一组LocalSocket进行本地的端对端通信在每次采样之前进行一次数据数据通信从而触发系统底层的数据合并操作保证我们获取的数值是最新的。 当然这种方案会消耗不必要的系统资源包括Socket资源的浪费并且会导致触发系统流量统计服务的数据合并及持久化操作从节省系统资源的角度并不是一个好的方式如果对数据采集结果的失效及准确性要求不高的话不建议进行此类行为。 跟踪流量消耗明细 当发现用户流量消耗不合理时我们还需要提供流量消耗的明细。比如接口的流量消耗、图片、音视频的流量消耗、直连Socket的流量消耗。 网络库Hook 大部分的网络请求发起依赖于现成的网络框架如 OkHttp、HttpURLConnection,因此需要Hook这些网络库追踪具体的流量消耗信息。 OkHttp 针对OkHttp库OkHttp本身提供了EventListener机制通过注册EventListner可以监听获取每个请求的阶段过程以及请求响应信息。 因此这里不做过多阐述。 HttpURLConnection 针对HttpURLConnection进行的网络请求这里参考的是AndroidStudio中网络监控的方案具体代码详见aosp,这里简单做下原理阐述。 首先需要字节码插桩代理 URLConnection的 openConnection函数代理原始URL.openConnection返回的URLConnection对象。这里需要注意由于Https 和Http协议会返回不同的URLConnection类型实例因此需要做下判断。 以HttpURLConnectionWrapper实现为例具体跟踪代码 其内部会再创建一个专门负责流量统计的TrackHttpURLConnection实例这里又包装了一层是因为 该类的实现 可以在HttpsURLConnection的代理中进行复用。 继续跟踪TrackedHttpURLConnection 实现。 针对请求体、响应体流量的跟踪其主要实现是返回一个代理包装类型的InputStream或OutputStream 以OutputStream为例继续代理内部的write函数当write函数被调用时记录相应的流量消耗。 在整个对HttpURLConnection Hook实现的过程中有一些需要额外注意的点。 拿到URLConnection对象后业务层会调用connect触发实际的网络请求调用我们在connect函数中可以进行请求头和请求体流量的记录但实际上业务层不主动调用connect函数比如直接调用getInputStream()或getOutputStream时 底层也会触发connect操作但此时它直接触发的是被代理的原始对象的connect函数而我们自身的connect函数是不会被触发的因此如果只在connect函数中记录信息就可能出现遗漏的情况。 因此AS在实现这块逻辑时会包装一个trackPreConnect()函数并同时在这3处进行调度。 类似的直接调用获取响应内容的一些函数比如获取响应头信息也会触发底层的conenct操作因此其也封装了一个trackResponse函数内部会调用conenct函数(如果判断没调用过的话)并记录响应头的一些信息 基于Socket Api Hook 在部分业务场景中可能会存在使用Socket进行网络通信的情况比如自研长连协议此时需要能够实现直接对原生Java Socket层数据通信的监控。 这里介绍2中针对Java Socket通信的监控方式。 基于字节码替换 和URLConnection监控的方案类似Socket的数据读写是通过其InputStream和OutputStream对象实现的因此通过ASM全局替换Socket的getInputStream和getOutPutStream对象对其数据读写进行监控即可。 自定义SocketImplFactory 在Java层 创建Socket的方式是直接构造 java.net.Socket对象我们先跟踪其构造函数的实现。 在构造函数中会调用setImpl()函数继续跟踪setImple()实现 setImpl()函数先判断 factory是否为空如果不为空则 使用factory创建SocketImpl实例否则直接通过 SocksSocketImple()构造函数创建。 观察整个 java.net.Socket类的代码可以发现其有关Socket的实际操作其实都是转发到 内部的SocksSocketImple对象中以getInputStream()为例在java.net.Socket实现中只是简单做了下状态的判断最后直接调用impl的getInputStream函数。 java.net.Socket 类的factory是一个静态常量SocketImpleFactory接口的实现如下 而 SocketImple抽象类实现如下 因此可以通过设置自定义的SocketImpleFactory 返回一个包装过的SokcetImpl实例从而对Socket进行监控。 //1.反射获取原始的Factory SocketImplFactory oldFactory .... if (oldFacotry!null){//反射修改 Socket.class 的facotry字段设置为新的FactoryReflectionUtil.of(Socket.class).field(factory).set(null, new TrafficSocketImplFactory(oldFactory)); } else {//设置新的factorySocket.setSocketImplFactory(new TrafficSocketImplFactory(null)); } public class TrafficSocketImplFactory implements SocketImplFactory {public TrafficSocketImplFactory(SocketImplFactory originalFactory) {this.mOldFactory originalFactory;}// ... public SocketImpl createSocketImpl() {if (this.mOldFactory ! null){return new TrafficSocketImpl(this.mOldFactory.createSocketImpl());}try {if (isCreateServerSocket())return (SocketImpl)sConstructor_SocketImpl.newInstance(new Object[0]);return new TrafficSocketImpl((SocketImpl)sConstructor_SocketImpl.newInstance(new Object[0]));} catch (Throwable tr) {//should never happendApmSafety.handleException(tr);return null;}} }基于Native Sokcet Api Hook 除了Java层 Hook Sokcet Api的方式也可以在Native 层使用 PLT Hook Socket 的相关读写API包括 ssize_t send(int sockfd, const void *buf, size_t len, int flags)ssize_t write(int fd, const void *buf, size_t count);ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t read(int fd, void *buf, size_t count);… 具体实现可以参考开源项目matrix中的代码 上报数据内容及数据处理 在每次采样间隔内会上报流量消耗的以下信息 总流量消耗上/下行流量消耗、移动网络上/下行流量消耗、wifi网络上/下行流量消耗网络库请求信息 及上下行流量消耗按照域名维度分组统计的流量消耗信息 另外针对部分直接在Java层无法监控到的流量消耗比如音视频、直播等业务域的网络请求是在native层直接触发的要求相应业务提供流量统计接口在每次采样上报时附带这些特殊场景的流量消耗信息。 当发现用户流量使用异常时为了方便回溯用户操作并判断流量消耗是否合理在每次采样周期的埋点上报中还包含以下信息 页面路径信息包括打开页面、页面可见、页面不可见状态变化视频播放行为包括播放视频的url、播放时长、视频总时长 流量监控平台设计 流量消耗趋势 在流量监控首页展示线上用户的流量平均及分位值的流量消耗趋势及接口请求次数。 用户维度Top流量消耗 在单用户维度直接根据设备、用户单次启动等维度进行数据聚合统计单用户的流量消耗。 用户流量消耗分析 当发现用户流量消耗和用户使用时长及行为不符时提供流量消耗的深入分析。 首先会将用户这段时间内的流量进行一些统计 包括不同host维度的流量消耗 及用户行为 流量日志详情分析 定位具体的流量消耗时可以根据采样样本进行排序找出较高流量消耗的样本。 点击日志 可以查看日志收集的详细信息具体的流量消耗接口、用户行为
http://www.w-s-a.com/news/919792/

相关文章:

  • 网站建设第三方沈阳工程最新动态
  • 兰州做网站客户上海企业在线登记
  • 新乡公司做网站wordpress被大量注册
  • 小语种服务网站公众号平台建设网站
  • 免费做mc皮肤网站企业网站建设合同模板
  • 做网站可以申请个体户么网站的定位分析
  • jsp做的零食网站下载wordpress侧边栏折叠
  • 帝国网站单页做301南京旅游网站建设公司
  • 网站sem优化怎么做网站建设推广安徽
  • 比较好的室内设计网站潍坊网络科技
  • 南宁网站建设公设计联盟网站
  • 多个图表统计的网站怎么做百度推广费2800元每年都有吗
  • 连江县住房和城乡建设局网站企业类网站模版
  • 临沂seo整站优化厂家网站建设 大公司排名
  • 网站开发有哪些方式百度导航怎么下载
  • 网站认证免费视频直播网站建设方案
  • 瀑布流分享网站源代码下载网站构建的一般流程是什么
  • wordpress 4.9 多站wordpress邮箱解析
  • 微信网站开发企业汽车网站设计模板
  • 如何提升网站转化率遵义市公共资源交易平台
  • 网站目录管理模板企业解决方案部
  • 建设网站上申请劳务资质吗珠海哪个公司建设网站好
  • c2c商城网站建设在微信怎么开发公众号
  • 美的公司网站建设的目的做个网站要钱吗
  • 和县建设局网站孟州网站建设
  • 网站与规划设计思路竞价培训课程
  • 网站建设设计视频专业设计企业网站
  • 湖南省建设工程网站cerntos wordpress
  • 主机屋的免费空间怎么上传网站广告公司的经营范围有哪些
  • 门户网站建设公司案例门户建设是什么意思