You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平台Kotlin实现Always-on VPN功能及相关问题咨询

Android平台Kotlin实现Always-on VPN及Kill Switch可行性分析

一、程序化开启Always-on VPN的流程与代码实现

前置要求

  • 你的应用必须已实现自定义VPN服务(继承VpnService),且用户已完成VPN基础授权
  • 需在Manifest中声明CONTROL_VPN权限(仅Android 7.0+生效):
<uses-permission android:name="android.permission.CONTROL_VPN"
    android:minSdkVersion="24" />

注意:Android 10及以上版本,该权限无法通过代码自动申请,必须引导用户到系统设置页面手动开启。

分步实现

  1. 检查并获取CONTROL_VPN权限
private fun checkControlVpnPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        if (!packageManager.hasSystemFeature(PackageManager.FEATURE_VPN)) {
            return
        }
        if (checkSelfPermission(Manifest.permission.CONTROL_VPN) != PackageManager.PERMISSION_GRANTED) {
            startActivity(Intent(Settings.ACTION_VPN_SETTINGS))
            return
        }
    }
}
  1. 启用Always-on VPN
private fun enableAlwaysOnVpn() {
    // 先检查VPN基础授权状态
    val prepareIntent = VpnService.prepare(this)
    if (prepareIntent != null) {
        vpnPermissionLauncher.launch(prepareIntent)
        return
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        getSystemService(VpnManager::class.java)?.apply {
            setAlwaysOn(
                true,
                ComponentName(this@YourActivity, YourVpnService::class.java),
                VpnManager.ACTION_VPN_SETTINGS
            )
        }
    }
}

其中YourVpnService是你自定义的VPN服务类,需在Manifest中注册:

<service
    android:name=".YourVpnService"
    android:permission="android.permission.BIND_VPN_SERVICE">
    <intent-filter>
        <action android:name="android.net.VpnService" />
    </intent-filter>
</service>
  1. 处理VPN授权结果
private val vpnPermissionLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == RESULT_OK) {
        enableAlwaysOnVpn()
    }
}

二、用Always-on VPN实现Kill Switch是否合适?

结论:合适,但存在一定限制

适配逻辑说明

Always-on VPN的核心机制是:当VPN连接意外断开时,系统会自动阻断所有网络流量,直到VPN重新建立连接——这完全匹配Kill Switch的核心需求,即防止设备在VPN失效时暴露真实网络地址。

关键限制

  • 系统版本门槛:仅支持Android 7.0(API 24)及以上设备,低版本无法使用该机制
  • 用户权限依赖:必须获得CONTROL_VPN权限,且用户不能在系统设置中手动关闭Always-on开关,否则Kill Switch直接失效
  • VPN稳定性要求:如果你的VPN服务频繁断开,系统会反复切断流量,严重影响用户体验
  • 用户可控性:用户可通过系统设置强制关闭Always-on VPN,无法实现完全强制的Kill Switch

补充优化建议

若需要更严格的Kill Switch逻辑(比如覆盖更多边缘场景),可结合VpnService的onRevoke()、onDestroy()方法,在VPN断开时主动切断网络连接,但这种方式需要额外申请网络相关权限,实现复杂度更高。

内容的提问来源于stack exchange,提问作者Navid Shokoufeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:05:14