我一直在解析网络以寻找在 Android 上创建 VPN 客户端的方法。我似乎找不到任何关于如何做到这一点的好资源。
目标是,我希望能够使用 Android 中的内置 VPN 功能(可能以编程方式添加新连接)或其他方式设置 VPN。
我确实在文档中遇到过,VpnService
但不清楚如何使用它。有没有人有这样做的一个很好的例子,这可能与此时的Android SDK
as 一样吗?
我一直在解析网络以寻找在 Android 上创建 VPN 客户端的方法。我似乎找不到任何关于如何做到这一点的好资源。
目标是,我希望能够使用 Android 中的内置 VPN 功能(可能以编程方式添加新连接)或其他方式设置 VPN。
我确实在文档中遇到过,VpnService
但不清楚如何使用它。有没有人有这样做的一个很好的例子,这可能与此时的Android SDK
as 一样吗?
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>