我需要实现一个Android应用程序,允许用户配置VPN连接,而无需访问Android设备的本机菜单.有了这个,我有两个问题:
>在Android 4.0(api level 14及更高版本)中,我发现有一个名为VpnService的新组件,它提供了一个用于创建虚拟网络接口,配置它并拦截/转发它的小包到VPN服务器的钩子,但是没有内置在像PPTP或IPSec这样的vpn协议中,只有实现它们的可能性.我的问题是,是否有任何现成的PPTP和IPSec解决方案可以与VpnService一起使用?
>在早期版本的Android中,从我到目前为止所发现的,似乎使用VPN的唯一方法是通过在android中包装(使用反射)一些隐藏的apis来访问和配置设备的内置vpn解决方案但这是一个繁琐的解决方案,因为设备需要植根,隐藏的api实现也可能因设备而异,从操作系统版本到操作系统版本也不同.有没有更好的方法以编程方式配置底层Linux操作系统的内置VPN?
解决方法:
1)我不知道Android 4.x ICS VpnService的任何开源PPTP或IPSec实现. VpnService旨在创建自定义协议VPN应用程序(理论上可以是pptp或IPSec).我发现利用这个新API的唯一开源实现是OpenVPN的一个:
https://github.com/schwabe/ics-openvpn
这提供了一个您完全可以控制的潜在VPN解决方案(服务器也是开源的),但它不是PPTP或IPSec.如果您了解PPTP协议,则应该可以将其用作实现此类VPN客户端的模型.
2)是的,在早期版本中,唯一的方法是通过私有API.实际上,即使您希望在以后的版本中使用内置的VPN支持(即内置的PPTP或IPSec支持),也必须利用这些隐藏的API.也许可以使用底层的Linux内核在较低级别执行此操作,但这需要生根操作系统并绕过Android应用程序范例.这不一定是使用私有API的更好选择.
有关如何使用这些API配置VPN的一些信息:
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/net/vpn/PptpProfile.java
(传递到API所需的PPTP配置文件对象的示例)
How to programmatically create a new VPN interface with Android 4.0?(说明如何在系统上存储此新VPN配置文件)
我不确定这些API的一致性和可靠性.我希望它们可以在大多数Android设备上运行,因为供应商不太可能重新实现基本的VPN实现,尽管他们可能已经添加了自己的.他们还可能已经更改了启用此类配置文件所需的API,或者已经扩展了它们的功能.