通过Android以编程方式创建VPN配置文件

时间:2018-06-28 14:57:04

标签: java android vpn android-vpn-service

我一直在解析网络,以寻找在Android上创建VPN客户端的方法。我似乎找不到任何有关如何执行此操作的好资源。

目标是,我希望能够使用Android中的内置VPN功能(可能以编程方式添加新连接)或其他方式来设置VPN。

我确实在文档中遇到了VpnService,但不清楚如何使用它。有人有这样做的好例子吗?目前Android SDK可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

Android提供了一个sample code ToyVpn,您可以根据需要查找和重用逻辑。


这是documentation

的一些详细信息

此类中有两个主要方法:prepare(Context)和VpnService.Builder。Establishment()。前者处理用户操作并停止由另一个应用程序创建的VPN连接。后者使用提供给VpnService.Builder的参数创建VPN接口。应用程序必须调用prepare(Context)来授予使用此类中其他方法的权利,并且该权利可以随时撤销。以下是创建VPN连接的一般步骤:

  1. 当用户按下按钮进行连接时,调用prepare(Context)并启动返回的意图(如果非null的话)。

  2. 准备好应用程序后,启动服务。

  3. 创建到远程服务器的隧道并协商VPN连接的网络参数。

  4. 将这些参数提供给VpnService.Builder并通过调用VpnService.Builder。Establishment()创建VPN接口。

  5. 在隧道和返回的文件描述符之间处理和交换数据包。

  6. 在调用onRevoke()时,关闭文件描述符并正常关闭隧道。

扩展此类的服务需要使用适当的权限和意图过滤器声明。它们的访问必须由Manifest.permission.BIND_VPN_SERVICE权限保护,并且它们的意图过滤器必须与SERVICE_INTERFACE操作匹配。这是在AndroidManifest.xml中声明VPN服务的示例:

<service android:name=".ExampleVpnService"
         android:permission="android.permission.BIND_VPN_SERVICE">
     <intent-filter>
         <action android:name="android.net.VpnService"/>
     </intent-filter>
 </service>