我需要实现一个Android应用程序,允许用户配置VPN连接,而无需访问Android设备的本机菜单。有了这个,我有两个问题:
在Android 4.0 +(api level 14及以上版本)中我发现有一个名为VpnService的新组件,它提供了一个钩子,用于创建虚拟网络接口,配置它并拦截/转发从它到VPN的小包服务器,但没有像PPTP或IPSec这样的内置vpn协议,只有实现它们的可能性。我的问题是PPTP和IPSec是否有现成的解决方案可以与VpnService一起使用?
在早期版本的Android中,从我到目前为止所发现的,似乎使用VPN的唯一方法是通过包装(使用反射)一些隐藏的apis来访问和配置设备的内置vpn解决方案在android中但这是一个麻烦的解决方案,因为设备需要植根,隐藏的api实现也可能因设备而异,从操作系统版本到操作系统版本。有没有更好的方法以编程方式配置底层Linux操作系统的内置VPN?
答案 0 :(得分:26)
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,或者已经扩展了其功能。