具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。
实施例一:
图1示出了本发明实施例提供的一种数据流量统计方法的流程,为了便于说明仅示出了与本发明实施例相关的部分。
在步骤S101中,当产生网络连接时,获取当前进行网络连接的单应用并开始计算数据流量值。
其中,每个单应用都有唯一一个应用包名,本步骤中需要监控网络连接,当产生网络连接时,根据网络端口的连接请求获取当前进行网络连接的单应用的包名,并根据所述包名确定当前进行网络连接的单应用。在获取当前进行网络连接的单应用之后,开始计算数据流量值。
在步骤S102中,当所述单应用停止使用网络连接时,获取本次网络连接产生的数据流量值。
在本步骤中,获取到当前进行网络连接的单应用后,开始计算该单应用实际产生的数据流量值,直至该单应用停止使用网络连接,那么就可以获取到本次网络连接所产生的数据流量值。
在步骤S103中,将所述本次网络连接产生的数据流量值计入所述单应用的数据流量总值。
每个单应用都在数据库中对应一个数据流量总值,所述数据流量总值表明了该单应用总共产生了多少数据流量。在本步骤中,每次网络连接都可以获取到发起该次网络连接的单应用在本次网络连接中所产生的数据流量值,再将所述数据流量值计入到所述单应用的数据流量总值,这样根据所述数据库中的数据流量总值就可以知晓每个单应用总共产生了多少数据流量。
在本发明实施例1中,通过获取产生网络连接的各个单应用,再对各个单应用产生的网络流量进行统计,得到各个单应用产生的数据流量总值,解决了现有技术中只能统计每个UID所产生的数据流量,无法统计单个应用产生的数据流量的技术问题。在本发明实施例中,用户可以根据各个单应用所产生的数据流量总值,可以进一步确定哪些单应用是后台吸费软件并做后续处理。
实施例二:
图2示出了本发明第二实施例提供的一种数据流量统计方法的流程,为了便于说明仅示出了与本发明实施例相关的部分。
在步骤S201中,建立流量数据库,为每个有网络连接权限的单应用分别建立数据流量总值。
在本步骤中,首先需要分析出安装的单应用中哪些具有网络连接权限,并建立流量数据库,为这些单应用分别建立数据流量总值。本步骤通过建立数据库实现存储数据流量总值,便于流量数据的统一管理和调用。
在步骤S202中,当产生网络连接时,获取当前产生数据流量的单应用并开始计算数据流量值。
在本步骤中,通常需要单独监控各个单应用,当监控到有单应用产生网络连接时,获取所述单应用即可。进一步的,为了提高监控效率,只需监控数据流量端口,当监控到有网络连接时,根据数据包中的包头标示位即可找到对应的产生该网络连接的单应用。在获取产生数据流量的单应用后,开始计算数据流量值。具体来说,为了实现获取到产生数据流量的单应用,首先需要获取产生数据流量的当前线程所在单应用的包名(PackageName),并根据所述包名确定当前进行网络连接的单应用,根据所述获取的单应用开始计算数据流量值。
所述包名的获取可以通过以下方式实现:每一个单应用都有一个唯一包名,通常一个单应用的程序包中可以包括多个线程,这些线程有可能有不同的创建方法和运行上下文,如Activity线程,Service线程,Content Provider线程,Java类线程,以及JNI(Java Native Interface,Java本机接口)直接调C创建的线程等。单应用在执行不同的线程时,如果线程需要使用网络连接,那么就需要记下该线程所在的单应用的包名。为了实现此目的,在具体实现时通过设置一组函数用来设置和获取当前线程所在单应用的包名,比如函数setThreadPackageName与getThreadPackageName,该函数可以通过JNI操作底层内核,最终在内核层中通过Current获取到当前进程的Task struct结构体的地址,进而获取到该结构体中包含的所述单应用包包名。
具体的,针对不同线程具体处理方式如下:
对于Activity线程,它的handlemessage每处理一个消息,调用setThreadPackageName函数记录Activity线程当前处理的package。
对于Content Provider线程,在执行onTransact时,如果发现当前线程还没有设置过包名,调用setThreadPackageName函数记录Activity线程当前处理的package。
对于java类线程,需要在其创建时先记录下当前线程(即将要运行的线程的父亲)的包名,当新建的线程运行时即其run()被调用时设置包名。
对于service线程,其上下文就是Activity线程,所以不用处理了。
对于JNI直接调C创建的线程,如果父线程的包名成员有效,就会被克隆出来,所以不用处理。
需要说明的是,以上对于本发明实施例具体实现方式的说明并不构成对本发明实施例内容的限定,本领域技术人员不需经过创造性劳动可采取的其他方式也属于本发明实施例的保护的范围。
在步骤S203中,当所述产生数据流量的单应用发生变化时,停止计算数据流量值并获取计算结果作为本次网络连接产生的数据流量值。
在本发明实施例中,当所述产生数据流量的单应用发生变化时,表明步骤S202中确定的所述单应用已经停止使用网络连接,当前网络连接结束,此时停止计算数据流量值,并将计算结果作为本次网络连接所产生的数据流量值。
具体的,在本步骤中,系统底层内核中提供有数据流量接口,所述数据流量接口的本质为一个统计端口流量的接口函数,所述数据流量接口通过监控网络连接,可以统计出从当前网络连接开始到网络连接结束的时段内所产生的数据流量。为了具体实现获取本次网络连接的数据流量值,当所述产生数据流量的单应用发生变化时,应用层JNC(Java Native Interface,Java本机接口)调用所述数据流量接口,便可以获取到本次网络连接产生的数据流量值,再将该数据流量值与本次网络连接获取的单应用相关联,这样每次产生网络连接时,都会获取到一个数据流量值,以及该数据流量值对应的单应用。
在步骤S204中,将所述本次网络连接产生的数据流量值计入所述单应用对应的流量数据库。
在本步骤中,数据流量库中存储有单应用所产生的数据流量总值,前述步骤中获取到了产生数据流量的单应用,以及本次网络连接所产生的数据流量值,由于单应用和数据流量总值是一一对应关系,这里再将所述得到的数据流量值计入所述单应用对应的数据流量总值中即可。所述将数据流量值计入所述单应用对应的数据流量总值中的实现方式有多种,比如可以为:将本次网络连接产生的数据流量值与流量数据库中当前的数据流量总值进行累加,并将累加结果作为新的数据流量总值存储到所述流量数据库中。这样流量数据库中存储的都是最新的数据流量总值。
在步骤S205中,当到达预定的数据更新时间时,清空所有单应用的数据流量总值。
在本步骤中,作为优选的实施方式,流量数据库按照预定规则存储流量数据总值,比如,所述预定规则可以设置为数据流量总值用于统计每个单应用在预定时期内产生的流量总和,当到达预定的数据更新时间时,比如每个月的最后一天24时,系统便会自动清空所有单应用的数据流量总值。这样可以准确统计出各个单应用在预定时期内所产生的数据流量总值,并可以进一步统计出预定周期内的所有单应用产生的流量总和。
根据本发明实施例2,由于本发明技术方案通过建立流量数据库,并对每个单应用建立数据流量总值,并在产生网络连接时,获取当前进行网络连接的单应用并开始计算所述单应用产生的数据流量值,在当前使用网络连接的单应用发生改变时,获取本次网络连接产生的数据流量值,并将所述数据流量值更新到对应的数据流量总值中,这样用户可以根据所述数据流量总值确定每个单应用实际使用的数据流量,有效定位后台吸流量的应用。同时,根据本发明实施例2提供的可选方案,还可以实现周期对所述流量数据库清空,实现流量的周期监控。
实施例三:
图3示出了本发明第三实施例提供的一种终端的结构方框图,为了便于说明仅示出了与本发明实施例相关的部分。
图示中,所述装置包括:
网络连接单应用获取单元301,用于当产生网络连接时,获取当前进行网络连接的单应用并开始计算数据流量值。
其中,每个单应用都有唯一一个应用包名,所述网络连接单应用获取单元需要监控网络连接,当产生网络连接时,根据网络端口的连接请求获取当前进行网络连接的单应用的包名,并根据所述包名确定当前进行网络连接的单应用。在获取当前进行网络连接的单应用之后,开始计算数据流量值。
网络连接数据流量获取单元302,用于当所述单应用停止使用网络连接时,获取本次网络连接产生的数据流量值。
在获取到当前进行网络连接的单应用后,开始计算该单应用实际产生的数据流量值,直至该单应用停止使用网络连接,那么就可以获取到本次网络连接所产生的数据流量值。
数据流量计入单元303,用于将所述本次网络连接产生的数据流量值计入所述单应用的数据流量总值。
每个单应用都在数据库中对应一个数据流量总值,所述数据流量总值表明了该单应用总共产生了多少数据流量。在本步骤中,每次网络连接都可以获取到发起该次网络连接的单应用在本次网络连接中所产生的数据流量值,再将所述数据流量值计入到所述单应用的数据流量总值,这样根据所述数据库中的数据流量总值就可以知晓每个单应用总共产生了多少数据流量。
实施例四:
图4示出了本发明第四实施例提供的一种终端的结构方框图,为了便于说明仅示出了与本发明实施例相关的部分。
本实施例所述的终端在实施例三的基础上还包括:
流量数据库创建单元401,用于建立流量数据库,为每个有网络连接权限的单应用分别建立数据流量总值。在本发明实施例中,首先需要分析出安装的单应用中哪些具有网络连接权限,并建立流量数据库,为这些单应用分别建立数据流量总值。本步骤通过建立数据库实现存储数据流量总值,便于流量数据的统一管理和调用。
网络连接单应用获取单元402,用于当产生网络连接时,获取当前进行网络连接的单应用并开始计算数据流量值。
其中,每个单应用都有唯一一个应用包名,所述网络连接单应用获取单元需要监控网络连接,当产生网络连接时,根据网络端口的连接请求获取当前进行网络连接的单应用的包名,并根据所述包名确定当前进行网络连接的单应用,根据所述获取的单应用开始计算数据流量值。所述网络连接单应用获取单元402包括:单应用获取子单元4021,用于当产生网络连接时,获取当前产生数据流量的单应用。
数据流量值计算单元4022,用于当产生网络连接时,开始计算数据流量值。
在本发明实施例中,单应用获取子单元通常需要单独监控各个单应用,当监控到有单应用产生网络连接时,获取所述单应用即可。进一步的,为了提高监控效率,单应用获取子单元只需监控数据流量端口,当监控到有网络连接时,根据数据包中的包头标示位即可找到对应的产生该网络连接的单应用。为了实现获取到产生数据流量的单应用,首先需要获取产生数据流量的当前线程所在单应用的包名,并根据所述包名确定当前进行网络连接的单应用,获取到单应用后,数据流量值计算单元开始计算数据流量值。
在本发明实施例中,为了实现获取到单应用的包名,具体实现时,可以通过以下方案实现:每一个单应用都有一个唯一包名,通常一个单应用的程序包中可以包括多个线程,这些线程有可能有不同的创建方法和运行上下文,如Activity线程,Service线程,Content Provider线程,Java类线程,以及JNI(JavaNative Interface,Java本机接口)直接调C创建的线程等。单应用在执行不同的线程时,如果线程需要使用网络连接,那么就需要记下该线程所在的单应用的包名。为了实现此目的,在具体实现时通过设置一组函数用来设置和获取当前线程所在单应用的包名,比如函数setThreadPackageName与getThreadPackageName,该函数可以通过JNI操作底层内核,最终在内核层中通过Current获取到当前进程的Task_struct结构体的地址,进而获取到该结构体中包含的所述单应用包包名。对于不同线程的具体函数实现方法请参考方法实施例相关内容描述。
网络连接数据流量获取单元403,用于当所述单应用停止使用网络连接时,获取本次网络连接产生的数据流量值,包括:
计算结果获取单元4031,用于当所述产生数据流量的单应用发生变化时,停止计算数据流量值并获取获取计算结果作为本次网络连接产生的数据流量值。
在本发明实施例中,当所述产生数据流量的单应用发生变化时,表明所述单应用已经停止使用网络连接,当前网络连接结束,此时停止计算数据流量值,并将计算结果作为本次网络连接所产生的数据流量值。本实施例中,系统底层内核中提供有数据流量接口,所述数据流量接口的本质为一个统计端口流量的接口函数,所述数据流量接口通过监控网络连接,可以统计出从当前网络连接开始到网络连接结束的时段内所产生的数据流量。为了具体实现获取本次网络连接的数据流量值,当所述产生数据流量的单应用发生变化时,应用层JNC调用所述数据流量接口,便可以获取到本次网络连接产生的数据流量值,再将该数据流量值与本次网络连接获取的单应用相关联,这样每次产生网络连接时,都会获取到一个数据流量值,以及该数据流量值对应的单应用。
数据流量计入单元404,用于将所述本次网络连接产生的数据流量值计入所述单应用的数据流量总值,包括:
流量数据库写入单元4041,用于将所述本次网络连接产生的数据流量值计入所述单应用对应的数据流量总值。
在本发明实施例中,数据流量库中存储有单应用所产生的数据流量总值,前述部分中获取到了产生数据流量的单应用,以及本次网络连接所产生的数据流量值,由于单应用和流量数据库是一一对应关系,这里再将所述得到的数据流量值计入所述单应用对应的数据流量总值中即可。所述将数据流量值计入所述单应用对应的数据流量总值中的实现方式有多种,比如可以为:将本次网络连接产生的数据流量值与流量数据库中当前的数据流量总值进行累加,并将累加结果作为新的数据流量总值存储到所述流量数据库中。这样流量数据库中存储的都是最新的数据流量总值。进一步,作为优选的实施方式,所述终端还包括:
清空单元405,用于当到达预定的数据更新时间时,清空所有单应用的数据流量总值。
在本发明实施例中,流量数据库按照预定规则存储流量数据总值,比如,所述预定规则可以设置为数据流量总值用于统计每个单应用在预定时期内的产生的流量总和,当到达预定的数据更新时间时,比如每个月的最后一天24时,系统便会自动清空所有单应用的数据流量总值。这样可以准确统计出各个单应用在预定时期内所产生的数据流量总值,并可以进一步统计出预定周期内的所有单应用产生的流量总和。
本发明实施例提供的终端通过具体统计出每个单应用所产生的数据流量总值,即使多个单应用属于同一UID的情况下,用户也能够清楚知晓每个单应用的具体流量消耗情况。比如假设用户在智能终端(如手机)上安装了2个单应用(分别是A和B),这两个单应用都绑定在systemuid(1000)下,即两者的UID均为1000,并且都有上网权限。若用户使用单应用A连接网络并在后台下载数据,再使用单应用B连接网络查看朋友最新动态以及寻找有趣的事情等等。那么,通过本发明实施例,可分别对单应用A和单应用B分别进行上网流量的统计,同时可按照要求显示出来,方便用户直观查看当前各应用的上网情况,比如,用户通过查询获知,单应用A本月当前已使用的上网流量为10M,单应用B本月当前使用量30M,但是却查询到systemuid(1000)下还有单应用C当前已使用的上网流量为100M,并且平时基本上没有怎么使用过单应用C。那么,很显然,单应用C就是后台吸费软件。该用户可以针对该应用采取相应措施,如果采用现有技术智能知晓UID为1000的单应用共产生了140M流量,但无法知晓具体单应用的流量消耗情况,也就无法知晓那个是吸费软件了。因此通过本发明技术方案可以使每个单应用的流量使用情况变得透明。
本领域普通技术人员可以理解,实现上述实施例的方法的过程可以通过程序指令相关的硬件来完成,所述的程序可以存储于可读取存储介质中,该程序在执行时执行上述方法中的对应步骤。所述的存储介质可以如:ROM/RAM、磁碟、光盘等。