Most visited

Recently visited

Added in API level 14

VpnService

public class VpnService
extends Service

java.lang.Object
   ↳ android.content.Context
     ↳ android.content.ContextWrapper
       ↳ android.app.Service
         ↳ android.net.VpnService


VpnService是应用程序扩展和构建自己的VPN解决方案的基类。 通常,它会创建一个虚拟网络接口,配置地址和路由规则,并将文件描述符返回给应用程序。 从描述符读取的每一个信息都会检索发送到接口的传出数据包。 每次写入描述符都会像接收到的接口一样注入传入的数据包。 该接口在Internet协议(IP)上运行,因此数据包始终以IP标头开始。 然后,应用程序通过隧道处理和与远程服务器交换数据包来完成VPN连接。

让应用程序拦截数据包引发了巨大的安全问题。 VPN应用程序很容易破坏网络。 此外,他们中的两人可能会相互冲突。 系统采取几项行动来解决这些问题。 这里有一些关键点:

这个类有两种主要方法: prepare(Context)establish() 前者处理用户操作并停止由另一个应用程序创建的VPN连接。 后者使用提供给VpnService.Builder的参数创建一个VPN接口。 申请必须致电prepare(Context)授予在该课程中使用其他方法的权利,并且该权利可以在任何时候被撤销。 以下是创建VPN连接的一般步骤:

  1. When the user presses the button to connect, call prepare(Context) and launch the returned intent, if non-null.
  2. When the application becomes prepared, start the service.
  3. Create a tunnel to the remote server and negotiate the network parameters for the VPN connection.
  4. Supply those parameters to a VpnService.Builder and create a VPN interface by calling establish().
  5. Process and exchange packets between the tunnel and the returned file descriptor.
  6. When onRevoke() is invoked, close the file descriptor and shut down the tunnel gracefully.

扩展这个类的服务需要用适当的权限和意图过滤器声明。 他们的访问必须通过BIND_VPN_SERVICE权限进行保护,而他们的意图过滤器必须与SERVICE_INTERFACE操作匹配。 以下是在AndroidManifest.xml中声明VPN服务的AndroidManifest.xml

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

也可以看看:

Summary

Nested classes

class VpnService.Builder

Helper类创建一个VPN接口。

Constants

String SERVICE_INTERFACE

该操作必须与该服务的意图过滤器匹配。

Inherited constants

From class android.app.Service
From class android.content.Context
From interface android.content.ComponentCallbacks2

Public constructors

VpnService()

Public methods

IBinder onBind(Intent intent)

将通信接口返回到服务。

void onRevoke()

当应用程序被撤销时调用。

static Intent prepare(Context context)

准备建立VPN连接。

boolean protect(Socket socket)

便捷的方法来保护 Socket免受VPN连接。

boolean protect(int socket)

保护VPN连接的套接字。

boolean protect(DatagramSocket socket)

便捷方法来保护 DatagramSocket免受VPN连接。

boolean setUnderlyingNetworks(Network[] networks)

设置VPN为其上游连接使用的底层网络。

Inherited methods

From class android.app.Service
From class android.content.ContextWrapper
From class android.content.Context
From class java.lang.Object
From interface android.content.ComponentCallbacks2
From interface android.content.ComponentCallbacks

Constants

SERVICE_INTERFACE

Added in API level 14
String SERVICE_INTERFACE

该操作必须与该服务的意图过滤器匹配。 它还需要BIND_VPN_SERVICE权限,以便其他应用程序不能滥用它。

常量值:“android.net.VpnService”

Public constructors

VpnService

Added in API level 14
VpnService ()

Public methods

onBind

Added in API level 14
IBinder onBind (Intent intent)

将通信接口返回到服务。 SERVICE_INTERFACE操作外,此方法返回null上的Intent 覆盖此方法的应用程序必须识别意图并相应地返回相应的接口。

Parameters
intent Intent: The Intent that was used to bind to this service, as given to Context.bindService. Note that any extras that were included with the Intent at that point will not be seen here.
Returns
IBinder Return an IBinder through which clients can call on to the service.

也可以看看:

onRevoke

Added in API level 14
void onRevoke ()

当应用程序被撤销时调用。 此时,VPN接口已被系统停用。 应用程序应关闭文件描述符并正常关闭。 此方法的默认实现是调用stopSelf()

调用此方法可能不会发生在进程的主线程上。

也可以看看:

prepare

Added in API level 14
Intent prepare (Context context)

准备建立VPN连接。 如果VPN应用程序已准备好或用户以前已同意VPN应用程序,则此方法返回null 否则,它会将Intent返回给系统活动。 应用程序应该使用startActivityForResult(Intent, int)启动该活动以自行准备。 该活动可能会弹出一个对话框以要求用户采取行动,结果将通过onActivityResult(int, int, Intent) 如果结果为RESULT_OK ,则应用程序已准备好并被授予使用此类中的其他方法的权限。

只能同时授予一个应用程序。 当另一个应用程序被授予时,权利被撤销。 失去权利的申请将通过其onRevoke()通知。 除非它再次准备好,否则后续对此类中其他方法的调用将失败。

用户可以在激活时随时禁用VPN,在这种情况下,此方法将在下一次执行时返回意图,以再次获得用户的同意。

Parameters
context Context
Returns
Intent

也可以看看:

protect

Added in API level 14
boolean protect (Socket socket)

便捷方法来保护 Socket免受VPN连接。

Parameters
socket Socket
Returns
boolean true on success.

也可以看看:

protect

Added in API level 14
boolean protect (int socket)

保护VPN连接的套接字。 保护后,通过此套接字发送的数据将直接进入底层网络,因此其流量不会通过VPN转发。 如果某些连接需要保留在VPN外部,此方法非常有用。 例如,VPN隧道应该保护自己,如果其目的地被VPN路由覆盖。 否则,它的传出数据包将被发回到VPN接口并导致无限循环。 如果应用程序未准备好或被吊销,此方法将失败。

该套接字不是通过此方法关闭的。

Parameters
socket int
Returns
boolean true on success.

protect

Added in API level 14
boolean protect (DatagramSocket socket)

便捷方法来保护 DatagramSocket免受VPN连接。

Parameters
socket DatagramSocket
Returns
boolean true on success.

也可以看看:

setUnderlyingNetworks

Added in API level 22
boolean setUnderlyingNetworks (Network[] networks)

设置VPN为其上游连接使用的底层网络。

系统使用它来了解传送受此VPN影响的应用流量的实际网络,以便向用户呈现此信息(例如,通过状态栏图标)。

此方法只需要“,如插座(多个)传递到被调用如果VPN已显式绑定其底层通信信道的€ protect(int) €”到Network使用API诸如bindSocket(Socket)bindSocket(DatagramSocket) Network它使用的Network组发生更改时,VPN应该调用此方法。

networks是以下之一:

  • a non-empty array: an array of one or more Networks, in decreasing preference order. For example, if this VPN uses both wifi and mobile (cellular) networks to carry app traffic, but prefers or uses wifi more than mobile, wifi should appear first in the array.
  • an empty array: a zero-element array, meaning that the VPN has no underlying network connection, and thus, app traffic will not be sent or received.
  • null: (default) signifies that the VPN uses whatever is the system's default network. I.e., it doesn't use the bindSocket or bindDatagramSocket APIs mentioned above to send traffic over specific channels.

只有在VPN当前建立的情况下,此呼叫才会成功。 有关尚未建立VPN的设置,请参阅setUnderlyingNetworks(Network[])

Parameters
networks Network: An array of networks the VPN uses to tunnel traffic to/from its servers.
Returns
boolean true on success.

Hooray!