摘 要 针对Android系统手机网络模块耗电量过大导致电池工作时间过短的问题,为降低网络模块的功耗,对Android系统手机WIFI网络功能的功耗进行统计,结果表明当手机开启网络功能模块时,手机就会进行额外功耗,当手机联网速度增大时,手机网络模块耗电量将大幅度增大。针对这一问题设计了一款Android系统手机应用程序,能够对网络流量进行监测管理。该软件通过管理手机应用程序的网络连接、对用户提供相关提示和策略,减少不必要的网络数据交互,从而降低网络模块的功耗,最终达到节省流量和节约手机电量的目的。
关键词 Android系统;功耗;网络流量
中图分类号 TP317 文献标识码 A 文章编号 1674-6708(2015)130-0122-02
0 引言
Android系统连接网络的方式有两种:第一,运营商提供的移动网络;第二,则是WIFI网
络。Android智能手机用户的这种便利使用网络功能的方式,也给用户带来了一些新的问题,例如:使用移动数据网络过程中容易超出流量套餐包,导致话费过高;在用户不愿使用网络的情况下(如漫游等),软件仍自动进行大量的网络数据交互,更有甚者泄露用户信息等。
为了更好的解决手机网络模块的功耗问题,通过设计一款Android系统网络流量监测管理软件完成以下几个主要功能:
1)监控流量,根据用户流量套餐情况对用户进行及时提醒;
2)通过控制联网程序帮助延长手机有效使用时间与提高性能,在续航与流量方面提升用户体验。
1 Android系统WIFI网络功耗统计实验
WIFI是基于IEEE802.11协议,是一种短程无线传输技术。为了分析不同WIFI网络模式下手机功耗的变化情况,本文做了以下实验(本实验采用的手机型号是Coolpad5310, Android4.03操作系统)。
将手机正常开启后,分别在关闭WIFI、开启WIFI小流量模式(10kb/min)、开启WIFI大流量模式(2Mbit/min)下,每隔一小时检查一次手机电量。图1分别描述了手机在关闭WIFI、WIFI大流量模式和WIFI小流量模式三种情况下的手机剩余电量变化情况,间接描述了手机的功耗情况。可以看出,当手机开启WIFI网络功能时,手机就会有额外功耗,当手机联网速度增大时,手机网络模块耗电量将大幅度增加。
由图1计算得出,手机在小流量模式下手机电池使用时间减少约为55%,在大流量模式下手机电池使用时间减少约为82%。可以说,移动网络模块的功耗在系统总功耗中占据了十分重要的位置。Android是一个开放平台,允许我们开发常驻后台的应用程序,因此,我们可以编写一个Android应用程序,该应用程序对Android平台下所有需要联网的程序进行网络流量监测和控制,从而达到网络管理和节能的需求。
图1 手机在关闭WIFI、开启WIFI小、大流量模式下
耗电量统计实验结果
2 功能设计及实现
在现实生活中,手机流量过多和手机耗电量过快的问题一直困扰很多手机用户,因此设计一款Android手机网络管理软件有现实意义,该软件根据一下模块进行设计,用于监测运行在手机上的各个应用程序的网络流量使用情况并反馈给用户,用户能够控制和管理运行在手机上的各个应用程序的网络连接,从而降低不必要的网络耗电量,并根据自身流量套餐及流量使用情况,为用户提供适合的流量使用决策。
用户界面:展示该手机所有需要联网的应用程序。
流量控制模块:从用户界面模块接到命令后,对手机应用程序进行联网控制。
流量监测模块:对手机需要联网的应用程序进行流量监测,将结果反馈给用户界面和数据管理模块。
校正模块:对该手机运营商所提供的流量套餐进行校正,将信息传给数据管理模块。
数据管理模块:将各个联网程序所消耗的流量进行统计,并反馈给用户。
用户决策模块:通过分析数据管理模块中的流量统计、流量套餐、和各个应用程序所产生的流量消耗,反馈给用户并提供相应决策。
2.1 流量监测模块
Android系统是一个基于linux的操作系统,一旦程序被安装在手机上网流量控制Android系统上,每个Android软件都会在自己的安全沙箱中运行,他们也将各自获得系统分配的唯一Linux UID。在Android中,与流量监控相关的文件是/proc/uid_stat/%d”,其中%d为进程的UID。这个文件里只有两项数据tcp_rcv和tcp_snd。使用cat指令查看两个文件的内容,就可以得到相应的数值,其中tcp_rcv代表使用TCP协议接收到的字节数,tcp_snd代表使用TCP协议发送的字节数。Android系统在2.3版本之前没有封装相应的流量监控API。从Android 2.3版本开始,Android系统把相应的数据流量监控API封装到了Android.TrafficStats类中。其原理就是读取Linux内核中流量监的文件。
其主要方法:
获取手机联网收到的字节总数:
long total_received = MobileRxBytes();
获取手机联网发送的字节总数:
long total_transmitted = MobileTxBytes();
获取运行在手机上的应用程序uid:
uid = packageInfo.applicationInfo.uid;
根据uid得到相应的应用程序联网后接收到字
节数:
发布评论