Flutter 开发李跳跳原理与实现

本文最后更新于 2026年1月24日。

“李跳跳”这类应用的实现原理非常精巧且硬核。如果你想用 Flutter 开发一个类似的应用,技术上是可行的,但由于其核心逻辑属于 Android 底层机制,你需要结合原生开发(Kotlin/Java)来完成。

以下是详细的技术拆解和开发建议:


1. “李跳跳”是怎么实现跳过广告的?

“李跳跳”并不是从网络层面拦截广告(那是屏蔽广告),而是通过 Android 的 无障碍服务 (Accessibility Service) 模拟人的操作来“点击”广告。

核心原理

  1. 监听 UI 变化:当应用启动并显示开屏广告时,系统会触发 AccessibilityEvent

  2. 查找关键节点:程序会扫描当前的屏幕控件树(Layout Tree),寻找包含“跳过”、“Skip”或者带有特定 ID/描述的按钮。

  3. 模拟点击:一旦找到对应的按钮,程序会立即发送一个 performAction(AccessibilityNodeInfo.ACTION_CLICK) 命令,在纳秒级的时间内模拟手指点击。

注意: “李跳跳”不需要联网,因为它纯粹是在本地对屏幕内容进行文本匹配和点击操作。


2. 我能用 Flutter 开发吗?

答案是:可以,但不能只用 Flutter。

为什么需要原生代码?

Flutter 运行在 Dart 虚拟机中,而 Accessibility Service 必须在 Android 原生层声明并继承 AccessibilityService 类。

  • Flutter 的角色:负责 UI 界面(开关、设置、白名单管理等)。

  • 原生层(Kotlin/Java)的角色:负责核心逻辑,包括监听系统事件、扫描屏幕文字和执行点击。

  • 桥接:通过 MethodChannel 让 Flutter 界面与原生无障碍服务进行通信。

开发难点

  1. 保活机制:此类应用必须长期常驻后台,否则会被安卓系统杀掉。你需要处理自启动权限、电池优化白名单等极其繁琐的适配。

  2. 权限获取:无障碍权限是安卓中权限等级极高的一种,用户必须手动去设置里深层开启,Google Play 对此类应用的审核也非常严格。

  3. 适配成本:不同 App 的“跳过”按钮可能是一个图片(没有文字)、也可能是倒计时。你需要建立一套复杂的匹配逻辑(坐标点击、模糊匹配等)。


3. 简单的开发步骤建议

如果你准备动手,可以按照以下路径尝试:

第一步:在 android 目录创建无障碍服务

你需要新建一个 MyAdSkipService.kt

Kotlin

class MyAdSkipService : AccessibilityService() {
    override fun onAccessibilityEvent(event: AccessibilityEvent?) {
        val rootNode = rootInActiveWindow ?: return
        // 递归查找带有“跳过”字样的节点
        findAndClickSkip(rootNode)
    }

    private fun findAndClickSkip(node: AccessibilityNodeInfo) {
        if (node.text?.toString()?.contains("跳过") == true) {
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK)
        }
        for (i in 0 until node.childCount) {
            findAndClickSkip(node.getChild(i))
        }
    }
    
    override fun onInterrupt() {}
}

第二步:配置 AndroidManifest.xml

必须声明权限和 intent-filter

XML

<service
    android:name=".MyAdSkipService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_service_config" />
</service>

第三步:Flutter 交互

使用 MethodChannel 检查服务是否开启,并跳转到设置页面让用户授权。


4. 法律与风险提示

在开发前,你需要了解:

  • 不正当竞争:李跳跳此前停更是因为收到了大厂的律师函,法院通常认为这类软件干扰了其他 App 的商业模式。

  • 安全性:无障碍权限可以读取屏幕上的所有内容(包括支付密码和聊天记录),因此这类软件很难获得用户的深度信任,建议完全开源以示清白。

你想先尝试实现一个最基础的“检查无障碍权限是否开启”的 Flutter Demo 吗?我可以为你提供具体的 Dart 和 Kotlin 桥接代码。