# AutoClicked **Repository Path**: youonlyliveonce/auto-clicked ## Basic Information - **Project Name**: AutoClicked - **Description**: 纯AI生成的简单按键精灵,实现自动点击功能,被应用商店下载的点击器软件的广告恶心到了,用AI生成了这个app,由于本人不是安卓端的开发,所以也没法对代码做审核,能用就行 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-24 - **Last Updated**: 2026-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AutoClicked - 自动连点器 一款基于 Android 无障碍服务的多点位自动点击工具,支持在屏幕任意位置设置多个点击点,每个点可独立配置点击间隔,并通过悬浮控制栏便捷操作。 ## 项目结构 ``` AutoClicked/ ├── build.gradle.kts # 根级构建脚本 ├── settings.gradle.kts # 项目设置 ├── gradle.properties # Gradle 属性 ├── app/ │ ├── build.gradle.kts # 应用级构建脚本 │ ├── proguard-rules.pro # 混淆规则 │ └── src/main/ │ ├── AndroidManifest.xml # 清单文件 │ ├── java/com/autoclicked/app/ │ │ ├── MainActivity.kt # 主界面 - 权限检查与引导 │ │ ├── AccessibilitySettingsActivity.kt # 无障碍设置引导页 │ │ ├── model/ │ │ │ └── ClickPoint.kt # 点击点数据模型 │ │ ├── ui/ │ │ │ ├── ClickDotView.kt # 单个可拖动圆点视图 │ │ │ ├── DotsOverlayView.kt # 全屏圆点覆盖层 │ │ │ └── MainViewModel.kt # ViewModel │ │ ├── service/ │ │ │ ├── AutoClickAccessibilityService.kt # 核心无障碍服务 │ │ │ └── FloatingControlService.kt # 悬浮控制服务 │ │ └── util/ │ │ └── ClickPointManager.kt # 持久化工具 │ └── res/ │ ├── drawable/ # 14 个矢量图标和背景 │ ├── layout/ # 4 个布局文件 │ ├── values/ # 颜色/字符串/主题 │ └── xml/ # 无障碍服务配置 ``` ## 技术实现 ### 核心架构 ``` ┌──────────────┐ 权限检查/启动 ┌───────────────────────┐ │ MainActivity │ ────────────────> │ FloatingControlService │ └──────────────┘ └──────────┬────────────┘ │ 管理 ┌────────────┼────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ 控制栏UI │ │圆点覆盖层 │ │ 数据持久化 │ │ (可拖动) │ │(DotsOverlay)│(ClickPtMgr) │ └──────────┘ └────┬─────┘ └──────────────┘ │ 点击/拖动 ▼ ┌─────────────────────┐ │ AutoClickAccessibility│ │ Service │ │ (dispatchGesture) │ └─────────────────────┘� ``` ### 关键技术点 #### 1. 无障碍手势派发 (`dispatchGesture`) `AutoClickAccessibilityService` 利用 Android 无障碍服务的 `dispatchGesture()` API 在屏幕指定坐标执行点击操作: ```kotlin // 构建 GestureDescription val path = Path().apply { moveTo(x, y) } val stroke = GestureDescription.StrokeDescription(path, 0L, 50L) val gesture = GestureDescription.Builder().addStroke(stroke).build() dispatchGesture(gesture, null, null) ``` 每个启用的点击点启动独立协程,按 `intervalMs` 间隔循环执行,互不干扰: ```kotlin clickPoints.forEach { point -> serviceScope.launch { while (isActive && isRunning) { if (gesturePaused) { delay(50); continue } performClick(point) delay(point.intervalMs) } } } ``` #### 2. 触摸穿透机制 全屏覆盖层(`DotsOverlayView`)默认设置 `FLAG_NOT_TOUCHABLE`,所有触摸事件穿透到下层应用,不干扰用户正常操作。仅在编辑模式下移除该标志,使圆点可交互。 ```kotlin // 默认:触摸穿透 params.flags = FLAG_NOT_FOCUSABLE or FLAG_NOT_TOUCHABLE or FLAG_LAYOUT_NO_LIMITS // 编辑模式:圆点可交互 params.flags = FLAG_NOT_FOCUSABLE or FLAG_LAYOUT_NO_LIMITS ``` `DotsOverlayView.onTouchEvent()` 中只在触摸到圆点时消费事件,空白区域返回 `false`: ```kotlin override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { ACTION_DOWN -> { touchedDotId = findDotAt(event.x, event.y) return touchedDotId != null // 空白区域返回 false } // ... } } ``` #### 3. 手势暂停机制 高频点击(如 50ms 间隔)时,`dispatchGesture()` 会干扰悬浮控制栏的触摸事件。解决方案:用户触摸控制栏时临时暂停手势派发: ```kotlin // FloatingControlService 中 ACTION_DOWN -> AutoClickAccessibilityService.gesturePaused = true ACTION_UP -> AutoClickAccessibilityService.gesturePaused = false // AutoClickAccessibilityService 协程中 if (gesturePaused) { delay(50); continue } ``` #### 4. 悬浮窗拖动 控制栏的触摸事件始终被消费(返回 `true`),在 `ACTION_UP` 时判断是否为拖动:如果未拖动,则根据触摸坐标判断点击了哪个按钮并执行对应操作: ```kotlin if (!wasDragging) { val x = event.rawX - locationOnScreen[0] val y = event.rawY - locationOnScreen[1] when { btnStart?.let { isTouchInView(x, y, it) } == true -> doStart() btnStop?.let { isTouchInView(x, y, it) } == true -> doStop() // ... } } ``` #### 5. 数据持久化 使用 `SharedPreferences` + `Gson` 存储点击点数据: ```kotlin class ClickPointManager(context: Context) { private val prefs = context.getSharedPreferences("auto_click_prefs", Context.MODE_PRIVATE) private val gson = Gson() fun saveClickPoints(points: List) { prefs.edit().putString("click_points", gson.toJson(points)).apply() } fun loadClickPoints(): List { ... } } ``` #### 6. 无障碍服务状态检测 通过 `AccessibilityManager` 从系统设置查询服务状态,而非依赖进程内 `instance`,确保 App 重启后也能正确检测: ```kotlin private fun isAccessibilityServiceEnabled(): Boolean { val am = getSystemService(AccessibilityManager::class.java) val enabledServices = am.getEnabledAccessibilityServiceList( AccessibilityServiceInfo.FEEDBACK_ALL_MASK ) return enabledServices.any { it.resolveInfo.serviceInfo.packageName == packageName } } ``` ### 技术栈 | 组件 | 版本/说明 | |------|----------| | Kotlin | 1.9.20 | | AGP | 8.2.0 | | Gradle | 8.5 | | minSdk | 26 (Android 8.0) | | targetSdk | 34 (Android 14) | | AndroidX Core KTX | 1.12.0 | | AppCompat | 1.6.1 | | Material Components | 1.11.0 | | Lifecycle (ViewModel/LiveData) | 2.7.0 | | Gson | 2.10.1 | | Coroutines | (kotlinx-coroutines-android,由 lifecycle 传递) | ## 编译步骤 ### 环境要求 - **JDK**: 17 或以上 - **Android SDK**: compileSdk 34,需安装以下组件: - Android 14 (API 34) SDK Platform - Android SDK Build-Tools 34.0.0 - Android SDK Platform-Tools ### 命令行编译 ```bash # 1. 克隆项目 git clone cd AutoClicked # 2. 确保 SDK 路径正确(local.properties 中已配置 sdk.dir) # 如果没有,手动创建 local.properties: # sdk.dir=C:\\Users\\\\AppData\\Local\\Android\\Sdk # 3. 编译 Debug 版本 # Windows gradlew.bat assembleDebug # Linux/macOS chmod +x gradlew ./gradlew assembleDebug # 4. 编译 Release 版本 gradlew.bat assembleRelease # 5. APK 输出路径 # Debug: app/build/outputs/apk/debug/app-debug.apk # Release: app/build/outputs/apk/release/app-release.apk ``` ### Android Studio 编译 1. 打开 Android Studio 2. 选择 **File → Open**,选中项目根目录 3. 等待 Gradle Sync 完成 4. 点击 **Build → Make Project** (Ctrl+F9) 编译 5. 点击 **Run → Run 'app'** (Shift+F10) 安装到设备 ### 签名配置 Release 版本需要签名。在 `app/build.gradle.kts` 中配置: ```kotlin android { signingConfigs { create("release") { storeFile = file("keystore.jks") storePassword = "your_store_password" keyAlias = "your_key_alias" keyPassword = "your_key_password" } } buildTypes { release { signingConfig = signingConfigs.getByName("release") isMinifyEnabled = false } } } ``` ## 权限说明 | 权限 | 用途 | |------|------| | `SYSTEM_ALERT_WINDOW` | 显示悬浮控制栏和圆点覆盖层 | | `FOREGROUND_SERVICE` | 悬浮控制服务以前台服务运行,防止被系统杀掉 | | `FOREGROUND_SERVICE_SPECIAL_USE` | Android 14+ 前台服务类型声明 | | 无障碍服务 (`BIND_ACCESSIBILITY_SERVICE`) | 执行 `dispatchGesture()` 自动点击 | ## 注意事项 - 无障碍服务在 App **更新/重装**后会被系统关闭,这是 Android 安全机制,需要重新手动开启 - 正常使用中(杀进程、划掉最近任务、重启手机),无障碍权限不会丢失,服务会自动恢复 - Android 14+ 需要在前台服务通知中声明服务类型