我一直在解析网络以寻找在 Android 上创建 VPN 客户端的方法。我似乎找不到任何关于如何做到这一点的好资源。
目标是,我希望能够使用 Android 中的内置 VPN 功能(可能以编程方式添加新连接)或其他方式设置 VPN。
我确实在文档中遇到过,VpnService但不清楚如何使用它。有没有人有这样做的一个很好的例子,这可能与此时的Android SDKas 一样吗?
我一直在解析网络以寻找在 Android 上创建 VPN 客户端的方法。我似乎找不到任何关于如何做到这一点的好资源。
目标是,我希望能够使用 Android 中的内置 VPN 功能(可能以编程方式添加新连接)或其他方式设置 VPN。
我确实在文档中遇到过,VpnService但不清楚如何使用它。有没有人有这样做的一个很好的例子,这可能与此时的Android SDKas 一样吗?
Android 提供了一个示例代码ToyVpn,您可以根据需要查看和重用逻辑。
此类中有两个主要方法:prepare(Context) 和 VpnService.Builder.establish()。前者处理用户操作并停止由另一个应用程序创建的 VPN 连接。后者使用提供给 VpnService.Builder 的参数创建一个 VPN 接口。应用程序必须调用 prepare(Context) 来授予使用该类中其他方法的权利,并且可以随时撤销该权利。以下是创建 VPN 连接的一般步骤:
当用户按下按钮进行连接时,调用 prepare(Context) 并启动返回的 Intent(如果非空)。
当应用程序准备就绪时,启动服务。
创建到远程服务器的隧道并协商 VPN 连接的网络参数。
将这些参数提供给 VpnService.Builder 并通过调用 VpnService.Builder.establish() 创建一个 VPN 接口。
在隧道和返回的文件描述符之间处理和交换数据包。
调用 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>