这篇博客主要讲述我实现一款Android手机上网防火墙的一个经验心得分享。
背景介绍:
Android平台作为新兴的智能手机平台吸引了众多开发者和用户的目光。随着智能手机和移动互联网的普及,Android平台将有一个光明的未来。相对于PC安全而言,由于私密性更强,手机安全隐患对用户的威胁更大,来自手机的危害给用户造成的损失也更大。手机流氓软件、手机黑客、自动拨打电话发短彩信等系列手机安全问题而导致的无故花费支出和其他形式的损失已经成为了家常便饭。随着WAP手机技术的日趋成熟,接入互联网轻松获得大量的信息已成为未来手机发展的必然趋势。由于通过网络直接对WAP手机进行攻击比对GSM手机进行攻击更加简便易行,WAP 手机已经成为电脑黑客攻击的重要对象。拥有一款手机联网防火墙,则可以免除用户因为担心手机上网安全而带来的诸多烦恼。
我开发的内容:
我开发的手机防火墙软件就是基于该平台,实现设置应用程序上网规则,屏蔽和允许程序上网,设置黑白名单,统计上网流量,获取上网流量日志以及显示网络状态。基于Android的手机防火墙系统包括基于Iptables解决方案的防火墙模块以及基于linux dev信息解决方案的流量统计模块,两个模块分别完成iptable规则的设置和dev信息的读取以及日志的维护。系统采用java语言在Eclipse IDE+Jdk+Adt+Android SDK 上调试并在模拟器和真机上实现。能很好的满足用户上网防火墙和流量统计功能。
整个应用程序的需求分析:
整个应用程序需要实现一个手机防火墙, 能够对手机的网络通信进行监控,及时拦截恶意程序的联网操作,以免目标手机遭受攻击;用户可以自由地设置联网程序的信任程序和不信任程序列表,使得网络防火墙可以更加有针对性地分类处理;另外,网络防火墙能够实时统计日流量,周流量,月流量。所以整个应用程序分为两个大部分:一个是实现防火墙功能,一个是实现流量统计。
我的开发过程:
经过自己对整个系统架构的需求分析,我便开始一步一步动手来实现这个小软件。
由于之前接触过window mobile平台,symbian平台,但是却是第一次接触Android平台,于是兴冲冲地在Google上一阵神游,搜索了一些Android相关的资料,对这个平台有了自己大致的一些了解,然后自己通过Google加上自己的努力,费了九牛二虎之力终于把Android开发环境搭建起来。
搭建好开发环境之后,自己迫不及待地通过自己手中的《Android SDK 开发范例大全》实现了自己在Android上的第一个程序Hello world。然后,自己在接下来一段时间里,开始对自己将要实现的这个程序进行了一系列调研。存在了一系列问题。首先是对于手机拦截程序上网功能的可行性分析,主流的android平台手机防火墙都采用的基于linux内核的iptables组件进行设置网络规则。但是需要Android手机root权限,但是普通的android手机一般不具备root权限,除非通过刷机或者其他途径。然后对于手机流量功能,由于android平台提供的API无法获得,可能会着手使用Apache接口或者java接口甚至更底层的linux接口,最终经过调研发现了可以采用linux接口,通过读取linux内核生成的/proc/net/dev文件获取网络信息来实现手机流量统计功能。
经过自己充分的调研之后,大致有了一些思路,然后问同学借了一部刷root权限的手机,自己开始尝试着实现自己软件的功能。
功夫不负有心人,经过自己一段时间的努力,基本实现了自己需求达到的一些要求。
自己的经验总结:
经过一段时间的努力,我已经完成了DroidNethelper防火墙软件的设计,基于软件的设计,我已经编写了一个初步的demo,基于提供的功能,设计了相应的调试和测试方案,经过调试和测试,基本实现了之前的需求。经过对程序的测试,可以很方便的统计出手机上网的流量信息,能够成为用户上网的一个好帮手。
本软件基于Android平台,包括了防火墙子系统和流量统计子系统。主要功能实现了用户可以对自己上网程序进行规则设置,来实现上网功能的限定,并且,用户还能够看到自己手机上网流量的一个情况,有详细的当日,一周内,一月内的流量统计,让用户能够轻松地管理自己的上网情况。
在性能上,系统运行的开销主要是后台维护流量的服务,本软件只需要在后台维护一个动态服务,内存开销2.5MB,相对于谷歌拼音输入法的4.1MB来说更少。在调试过程中,我采用了一种特别的MessageTrace方法,即在程序中加入大量打印内容并以外部变量来判断是否激活,可以迅速找出release版本程序中的错误所在,提高了开发的效率和准确度。
整个开发过程,让我接触到了新兴的Android手机平台,接触了linux内核的dev文件,iptable方法以及Android平台提供的大量API,可以说跨度之大是前所未有。本次开发中感触最深的就是如何来实现Android上网拦截这一功能,Android的权限限制,让我们很难通过上层的接口来实现对程序上网的阻止和允许,只能考虑更底层的linux内核接口,经过大量调研和实验,我们发现在刷机为root权限,获得super user资格后,可以通过底层的iptables接口来定制上网规则,并且在google开源代码上找到了在Android上使用iptables的API。
除此之外,我们发现这次发现真真正正的参考资料只有Android SDK,大部分参考书都是抄来抄去,不如直接看SDK,不过Android SDK只有英文版,查阅起来给我造成了很大的难度,所以,通过google搜索和一些相关的博客给我提供了很大的帮助。
另外我们这次实际参与了一个软件工程项目,并且严格按照规范来指导我们的开发过程,增长了不少经验,同时也体会到了软件工程的必要性。通过实际对用户界面的设计,让我了解了如何更多的从用户角度出发,提供更好的用户体验。我还发现,要把程序做到最小最快,需要使用大量底层技术,这个在我的程序中就很能体现。
分析自己的软件,还存在一些问题,由于android手机的权限原因,在无法获得root权限的前提下,无法利用iptable实现上网规则的定制。无法实时地获取用户联网的请求。要获得root权限,需要通过刷机实现。
对于流量统计,由于系统文件的刷新有一定延迟,所以暂时对流量统计的结果还有一定延时。用户界面相对于一些主流市场的流量统计软件还不够友好,可以在后期添加进一些动态变化图表来更好地反映当前流量使用的情况。
在实现程序的过程中,发现自己编程经验的不足,前期调研不够充分,走了不少弯路。还有前期在编写的过程中由于有些代码没有添加注释,之后再回头时走了不少弯路,回过头再看来,发现注释是很重要的。在测试自己代码的过程中,由于在设计时有一些细节考虑不周,造成了不少的错误和bug,导致花费了不少时间用于修改和改进遇到的这些问题。
还有任何问题都不能想当然,假如你接手一个简单的项目,你可能会认为某些部分很容易完成。千万不要这样认为,除非你有一个类、组件、或者一段已经写好的代码并且已经测试通过。我之前就认为通过iptable能直接获取并设置底层的防火墙规则,结果发现实际要涉及到权限的一些问题。
还有我们的需求也随着我们的认识在不断变化,需要经常性地修改方案,这主要是由于前期的需求分析做的不够充分,自己对问题的理解不够全面。
下一步的展望:
Android平台作为一个很有潜力的开放手机平台,我相信它能给我们的智能移动生活带来巨大的改变。我以后将会通过这样一个平台,开发出更多更好的应用,让智能手机真正改变我们的生活。