Android定制实现上网限制

随着智能手机和平板的普及,现在的孩子几乎人手一部手机或平板,所以常常能看到一些孩子抱着手机玩游戏或是浏览网页,一玩就是一整天,家长们不免担心自己的孩子是不是会浏览不适合他们看的网页?是不是玩的时间太长,导致他们对其他的事情(比如运动、学习和沟通等)丧失兴趣,或者对身体发育造成不良影响。所以,有必要对孩子们用的这些移动智能设备做些上网限制,主要就是上网时间和允许浏览的网站的限制。当然,现在已经有许多应用能够实现这样的功能,但大多都是在应用层实现,要么强制使用自己定制的浏览器,要么强制使用自己的launcher,看起来都不太友好。当我们能够定制一款自己的android设备的时候,貌似有更好的解决方案。下面我们来梳理一下可能的解决方案。

一. 选择方案。

  1. 分家长端和孩子端,通常还会有个门户网站。

    这种方式一般都是在其他应用之上显示内容,即强制使用定制的launcher或浏览器。孩子端一般是android移动设备,如android手机、平板。家长端要么是另一台android设备,要么是跟孩子同一台设备,分两种不同的模式,通过密码切换。家长端也有可能直接是一个门户网站,通过登录此网站,监管孩子端的行为。代表应用有”NQ Family Guardian”、 “中国联通绿色上网管理平台”、 “绿色上网”、”kid launcher”等。

    此种方案的优点是管理全面,容易做网站过滤;缺点是操作复杂,且不友好,还有被强制删除的风险。

  2. 通过代理Proxy服务器。

    在代理服务器端进行网站过滤和上网时间限制,android端无线WLAN设置使用代理上网。具体可参考CCProxy 。

    该方案优点是网站过滤较为灵活,可以过滤网站、站点、内容,禁止下载文件,禁止用webmail收发邮件等;缺点是要维护服务器,且android对代理的支持没有那么成熟。

  3. DNS变换。

    该方式是修改android设备的域名服务器为openDNS FamilyShield的primary DNS(208.67.222.123)或alternative DNS(208.67.220.123),这两个域名服务器会帮我们过滤掉不良网站。

    优点是实现简单,缺点是服务器在国外,使用起来会严重降低网页的响应速度,且需要root设备。

  4. 修改hosts文件。

    hosts文件的作用是将常用的网址域名与其对应的IP地址建立关联。当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交到DNS域名解析服务器进行IP地址的解析。当我们将要限制的网址域名与回路地址127.0.0.1对应时,那么就相当于禁止了该网站。如,我们打开android设备的/ets/hosts文件,新起一行,输入127.0.0.1 www.baidu.com,之后,我们在浏览器中输入”www.baidu.com”,网页打不开。

    优点是简单快捷,缺点是不灵活,不能限制上网时间,且需要root设备,因为普通的权限不能写hosts文件。

  5. iptables.

    iptables是Linux系统的IP信息包过滤工具,实际就是一个Linux命令,通过这个命令,可以对整个系统发出去的包,接收到的包,以及转发的包进行拦截、修改、拒绝等操作。刚好Android也是基于Linux内核的系统,也集成了iptables,是否可以用它来限制上网行为呢?经过试验,发现是可行的。

    优点:能从底层限制访问某些网站,而不必在浏览器层面阻止,不仅减少了定制或修改浏览器的成本,而且控制灵活,因为能够定制各种策略;缺点:运行iptables需要root权限。

经过综合比较,最后还是选择了用iptables实现上网控制的方案。然而我们不能假想设备一定具有root权限,所以直接在应用层调用iptables命令肯定是不行的。于是想是不是能在android系统层调用iptables命令呢,这样不就轻易解决问题了?如何在android系统层添加服务下篇文章再讨论,先看看在系统层调用iptables命令关闭网络的代码:

二. 系统层具体实现。

String cmd = new String[] {
    "iptables", "-P", "OUTPUT", "DROP"
};
try {
    process = Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {
    e1.printStackTrace();        
}

运行之后,网络并没有关闭,连上设备,进入shell,输入

iptables -L -n

发现OUTPUT链是这样的:

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
mark       all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
oem_out    all  --  0.0.0.0/0            0.0.0.0/0           
fw_OUTPUT  all  --  0.0.0.0/0            0.0.0.0/0           
bw_OUTPUT  all  --  0.0.0.0/0            0.0.0.0/0           
st_filter_OUTPUT  all  --  0.0.0.0/0            0.0.0.0/0

说明OUTPUT链的规则并没有改变,也就是说命令没有执行或是执行了但是没效果。于是,尝试打印process的错误流,像这样:

InputStream stderr = process.getErrorStream();
...
while (true) {
    ...
    if (stderr.available() > 0) {
      read = stderr.read(buf);
      if (result != null) {
          result.append(new String(buf,   0, read));
      }
      Slog.d(TAG, "stderr: " + result.toString());
    }
}
Slog.d(TAG, "exec command over");

查看log,发现了这些信息:

02-18 13:55:29.720 546-7708/system_process D/GreenNetworkService: stderr: [-] set uid permission denied: Operation not permitted
02-18 13:55:29.720 546-7708<
  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值