[Native 开发] Android 校园网客户端(1) - idea 的诞生和设计
本系列文章主要记述一个 Android Native App 的开发过程。与其他应用程序不同的是,这个 App 的核心功能主要使用 C/C++ 代码来实现,同时需要手机拥有 root 权限,所以本系列文章的侧重在 Native 开发上。涉及网络协议分析、Linux 网络编程等其他相关知识。最后会总结 Android 平台 Native 开发的一些感想。本篇主要记述 idea 的诞生和设计过程。
一、想法诞生
如今校园里 Android 机油越来越多,3G 生活那个爽啊,QQ、邮件、网页甚至视频。每月虽然有几百兆的流量,但总觉得不够我们折腾,所以每月总有那么几天要格外小心,千万不能超流量。可怜的 Milestone 总是过着插着联通 3G 卡没有流量吃的生活。(所谓装逼...)
绝大多数 Android 机都有 Wifi 功能,同时很多童鞋宿舍里也配备了无线路由器,为什么不用 Wifi 呢,既省流量速度又快?我们是校园网,连上路由器没有用啊,校园网需要拨号认证才能上网啊!(电信网的童鞋邪恶的笑了。神马?你们学校本身就有免费无线校园网?看到屏幕右上角那个小 X 了吗?你现在可以点一下了)
于是,编写一个 Android 下的校园网认证客户端的想法就光荣地诞生了!(全体起立,鼓掌!)
二、实现方式
idea 有了,可是如何去实现呢?首先想到的是,这还不简单,用 Java 写一个应用程序不就得了。可是,校园网认证协议是在 Ethernet 层的,Java 的 Socket 能够发送以太网层数据包吗?不行,所以这种方法行不通。
Android 是基于 Linux 内核的,那么 Linux 下的客户端在 Android 下应该可以使用吧。直接运行显然是不行的,一个是 x86 一个是 ARM,CPU 架构都不同,所以需要重新编译。网上有很多开放源码的第三方客户端,但是几乎都基于 libpcap 库,Android 上并没有现成的 libpcap 库可用。
所以,我们需要先移植 libpcap 库,libpcap 库有了,我们编译好程序,发现不对啊,Android 上运行的程序都是 apk 格式,我们编译出来的是个可执行文件,这可怎么办?很多童鞋肯定想到使用 JNI 来让 Java 调用本地 C/C++ 代码,没错,这也是 Google 童鞋要求的,在 Java 中我们可以声明一个方法为 native,并使用对应的本地代码实现它。不过用过 Android 提供的 JNI 接口的童鞋肯定发现,哇靠,在 C/C++ 代码里面只能使用 C 语言库(bionic)和 OpenGL 库啊,最多再带个 Android Log,这有什么用?是的,对于不想开发游戏的童鞋来说,屁用都没有,想通过本地代码实现设备管理等操作,没门,除非你自己下载 Android 源码,修改好了,编译,写入手机,还得你手机 bootloader 没锁。(像 Motorola 这种厂商真的该骂,依靠开源社区赚钱,不给开放驱动源码不说,还锁定bootloader)
这么说没办法了?办法总是有的,我们伟大的机油们早就不甘于这种束缚了,一般一款机器刚上市,马上就会有另一条新闻:XXX 机已经被成功 root(文章的 source 一般都是 forum.xda-developers.com,大神聚集的圣地啊...)。那么到底什么是 root 呢?root 权限跟 Windows 下的 Administrator 权限可以理解成一个概念,是 Linux 系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权利,所有对象他都可以操作,所以很多黑客在入侵系统的时候,都要把权限提升到 root 权限,也就是将自己的非法帐户添加到 root 用户组。手机可以被 root 表示用户可以获得最高控制权限。(难道本身不应该是这样的吗?)对于有 root 权限的手机来说,用户就可以通过命令行运行各种命令。
既然这样,那么我们就可以在已经 root 的手机上运行我们编译好的命令行程序,同时使用 Java 编写好界面,使两者连接到一起,就可以正常工作了!
注意:这里依然不能使用 JNI,因为我们要编写的校园网认证客户端需要发送 sock_raw 类型的数据包,需要使用 root 权限(也就是 uid=0),通过 JNI 运行的本地代码仍然使用应用程序本身的 uid。
三、小结
本篇主要记述了 Android 校园网客户端 idea 的诞生,以及程序的大体的结构,下一篇中将介绍 Android 本地开发环境的搭建和 libpcap 的编译,see you then!
注意:
一、校园网认证协议不通用。中国是个地大物博的国家,虽说主要有华为三康和锐捷两家在做,但每个学校用的协议并不一样。本文实现的是华为三康的 H3C 802.1X 2.20-0247 协议,有兴趣开发不同版本的童鞋可以 PM 我。
二、Android 手机无法修改 Wifi 网卡的 MAC 地址。这个很致命,因为大家都知道,校园网是绑定网卡 MAC 的!据我所知目前只有 HTC 的少数手机可以改。
三、由于上面两点,特别是第二点,所以本系列文章的目的只是单纯的记述开发一个 Android 应用的开发过程,学习性质远大于实用目的。(囧...)
四、开发环境 Windows 7 32bit + Cygwin 1.7.7 + Android NDK r5