
古龙精灵是一款以 Lua 为核心的移动端自动化脚本开发工具在开发者的日常讨论中它经常与懒人精灵、按键精灵放在一起比较。三款软件并不是互相替代的关系而是解决同一类问题如何让手机上的重复操作变成一段可编写、可调试、可重复执行的 Lua 脚本。对零基础学习者来说这类工具是进入自动化领域一个很直观的入口。传统编程入门往往要面对大量抽象概念而古龙精灵把“屏幕坐标、触控事件、颜色识别、图像匹配”这些可感知的对象直接暴露成脚本接口学起来更容易建立画面感。这篇文章会从工具定位讲起然后补齐 Lua 语言基础、开发环境准备、脚本编写、调试排错最后给出一份可以运行的最小示例脚本。读完以后你可以独立完成简单的界面自动化任务也能自行排查最常见的运行故障。文章面向完全没有写过 Lua 脚本的初学者每个概念都会先解释是什么、为什么再给出代码和验证方式。1. 先认识古龙精灵在自动化工具链里的位置1.1 这类工具到底解决什么问题古龙精灵本质上是界面自动化开发工具核心流程是工具运行在电脑或安卓设备上把你编写的 Lua 脚本翻译成对安卓系统的操作指令让设备像人手一样执行“点击、滑动、等待、判断”这些动作。脚本里写上“检测到某个颜色区域后点击某个坐标”工具就会在设备上执行这一组动作。从技术组成来看它包含几个核心模块脚本编辑与工程管理负责 Lua 代码的编辑、保存、打包和版本组织。设备连接层通过 USB 或局域网连接安卓设备也能连接常见的安卓模拟器。屏幕采集与识别获取屏幕图像提供找色、找图、区域匹配等能力。触控模拟层把 touchDown、touchMove、touchUp 等接口转换为设备的触摸事件。日志与调试输出脚本运行日志帮助定位问题。这里要特别注意一个概念区分古龙精灵不是一个通用 Lua 编程 IDE它是面向手机自动化场景的 Lua 开发环境。你在脚本里写的是标准 Lua 语法但调用的自动化函数是工具提供的 API。很多新手困惑“我明明会 Lua为什么脚本跑不起来”原因就在于还没有区分“Lua 语言本身的语法”和“工具的接口文档”。先明确这一点后面学习会顺畅很多。1.2 和懒人精灵、按键精灵的差异对比维度古龙精灵懒人精灵按键精灵核心语言LuaLua自有脚本语法部分版本支持 Python主要运行平台安卓设备与模拟器安卓设备与模拟器安卓、iOS、Windows 等多端学习门槛需要 Lua 基础需要 Lua 基础可视化录制加脚本门槛较低典型应用方向移动界面自动化移动界面自动化多端自动化、办公自动化调试方式Lua 调试配合日志输出日志输出自带调试器、录制回放这张表只是提供一个整体参照不同版本的实现差异很大不是官方结论。选型时不要只看“谁更强”要看哪个工具的 API 文档更完整、社区案例是不是更接近你的需求、你对 Lua 的接受程度如何。对于零基础新手一个文档齐全、示例丰富的工具比一个功能列表更长的工具更有价值。1.3 工具的边界哪些场景可以写哪些不要碰把合规问题放在开头是因为自动化脚本工具经常被误解。工具本身是软件开发工具但使用场景决定了它是否合规。合法的场景包括自己手机上重复性操作的自动化例如批量整理通讯录、自动化测试个人 App。开发、测试阶段的移动端自动化回归测试。学习 Lua 语言和界面自动化原理。在明确允许自动化操作的软件或服务中运行脚本。需要避免的场景包括违反游戏或 App 服务条款的自动挂机、外挂辅助、刷量操作以及绕过安全机制、破坏系统功能等行为。编写脚本之前先确认使用场景是否获得授权。本文所有示例仅用于说明界面自动化开发原理具体落地时必须结合平台规则和自身责任来判断。2. 零基础先补 Lua脚本开发绕不开的语言基础2.1 Lua 为什么被自动化工具选中Lua 是一种轻量级脚本语言设计目标就是嵌入到宿主程序中。它解释执行、体积小、语法简单对宿主程序附加的资源占用很低。自动化工具需要把用户脚本嵌入到自己的引擎里还要在安卓设备上保持响应性能Lua 几乎是成本最低的选择。对新手来说Lua 有几个特点很适合入门语法简洁没有复杂的继承、重载、访问修饰符概念。只有一种主要数据结构 table表既能当数组也能当字典。函数是一等值可以赋值给变量、作为参数传递。短小脚本几十行就能完成完整功能反馈周期短。同时Lua 也有几个容易踩坑的地方数组索引从 1 开始、字符串不可变、全局变量默认可见。前面两个会在后面用代码说明第三个现在就要记住。2.2 安装本地 Lua 环境建立最小验证闭环接触古龙精灵之前建议先在电脑上准备一个独立的 Lua 环境用来练习纯 Lua 语法。这样能避免“设备还没连上代码已经写乱”的情况也能把语言语法问题和工具接口问题分开排查。在 Ubuntu 或 Debian 上安装sudo apt update sudo apt install lua5.4在 macOS 上可以使用 Homebrewbrew install lua在 Windows 上可以从 LuaBinaries 等社区发行版获取可执行文件也可以使用包管理工具scoop install lua安装完成后在终端输入以下命令验证lua -v如果输出版本号说明环境可用。接着写一个最小脚本 test.luaprint(hello lua)运行lua test.lua预期输出hello lua这一步的目的是建立“改代码、跑代码、看输出”的反馈闭环。后面学习 Lua 基础时都建议在本地环境练习而不是直接到古龙精灵里反复重启脚本。这样排错更快也不会把设备问题误判成语言问题。2.3 变量、表和函数三个高频核心概念Lua 的变量默认是全局的这一点和很多语言不一样。如果拼错变量名脚本往往不会报错而是静默地创建了一个新变量排查起来很费劲。推荐的写法是所有临时变量都显式加 local。local name gulong local count 10 local ratio 3.14 local isOk true表是 Lua 里最重要的数据结构可以同时承担数组和字典两种角色。数组部分注意索引从 1 开始local colors { red, green, blue } print(colors[1]) -- 输出 red local config { width 1080, height 2400, enabled true, } print(config.width) -- 输出 1080函数在 Lua 里是一种值可以赋值、传参和返回。基本的定义方式是local function add(a, b) return a b end print(add(2, 3)) -- 输出 5也可以把匿名函数直接传给另一个函数local function run(fn) fn() end run(function() print(callback called) end)初学者容易漏掉 return 的语法限制在 Lua 中return 必须是函数块的最后一个语句后面如果还有语句需要用do return end包裹。2.4 字符串处理string.char 与替换字符的正确姿势Lua 的字符串是不可变的直接写s[1] x行不通。要修改字符串中的某个字符正确的做法是先用 string.sub 拆开再拼接出新的字符串。string.char 的作用是把一组整数按字节码转换成字符串local s string.char(72, 105) print(s) -- 输出 Hi这种写法在构造特殊字节序列、生成控制字符时很有用。例如拼一段带换行的输出local line1 start local line2 end local content line1 .. string.char(10) .. line2 print(content)string.char(10) 就是换行符。修改字符串首字符local s hello s string.upper(string.sub(s, 1, 1)) .. string.sub(s, 2) print(s) -- 输出 Hello替换中间某个位置的字符local function replaceChar(str, index, ch) if index 1 or index #str then return str end return string.sub(str, 1, index - 1) .. ch .. string.sub(str, index 1) end print(replaceChar(abcdef, 3, X)) -- 输出 abXdef这里的两个关键点是string.sub 取子串..拼接字符串#str取字符串长度。自动化脚本大量依赖字符串处理来构造日志、拼接路径、解析返回值这几个函数属于最高频范畴。字符串拼接还有一种推荐用法是 string.format可读性比连续..更好local x, y 540, 960 local logMsg string.format(点击坐标: (%d, %d), x, y) print(logMsg)3. 安装古龙精灵、连接设备、建立工程3.1 先照环境清单逐项核对不要一上来就写脚本先确认环境。下面是一份适合初学的环境清单项目学习环境建议长期运行环境建议操作系统Windows 10/11 或 macOS与部署目标一致开发工具古龙精灵客户端稳定版本固定版本避免自动升级影响脚本运行设备安卓手机或安卓模拟器专用设备或测试机Lua 知识本地 Lua 环境先练语法掌握标准库和错误处理文档官方 API 文档、示例工程沉淀内部脚本规范文档安装古龙精灵客户端后不要急着写代码先把工具自带的示例工程跑一遍。这一步验证的是工具本身能启动、能连接设备、能输出日志。自动化工具必须完成最小链路验证否则后面写了代码出了问题也分不清是代码问题还是环境问题。3.2 连接真机或模拟器的三个检查点古龙精灵一般支持真机安卓设备和安卓模拟器两类目标。真机需要打开开发者选项和 USB 调试再通过数据线或局域网连接模拟器需要在模拟器设置中完成同样的权限开放。连接成功后按三个检查点确认设备列表里能看到目标设备。工具能获取到屏幕分辨率。预览窗口能看到当前屏幕画面取色或截图功能可用。如果设备列表为空常见的处理顺序是检查 USB 调试开关换一根数据线手动在工具里刷新设备列表。如果使用局域网连接先确认电脑和设备处于同一网段。这三个检查点全部通过后才进入代码编写阶段。3.3 新建工程与目录规范新建工程时工具通常会生成类似下面的结构MyScript/ ├── main.lua -- 脚本入口 ├── config.lua -- 可选配置项 └── res/ -- 图片资源目录用于找图识别 └── target.pngmain.lua 是脚本入口。自动化脚本的执行顺序一般是读取配置。等待设备出现稳定界面。循环识别目标特征。触发点击或滑动。判断结果决定继续还是退出。目录结构以你所用工具版本的实际生成结果为准这里强调的是工程化思想入口、配置、资源分开不要把代码都堆在一个文件里。脚本一旦变长单一文件的维护成本会快速上升。4. 编写第一个可运行的自动化脚本4.1 最小脚本找色、点击、循环、日志下面这段脚本演示“每隔一段时间检测一次屏幕上的颜色块如果检测到就点击屏幕中央”的完整流程。函数名以常见自动化工具为准实际使用前要查你的古龙精灵版本支持的 API-- 工具接口可能随版本变化以官方文档为准 local clickX, clickY 540, 960 -- 目标坐标 local maxTimes 10 -- 最多执行次数 local function main() local count 0 while count maxTimes do -- 在屏幕区域 (0, 0, 1080, 2400) 中查找颜色 0xFFFFFF local point findColor(0, 0, 1080, 2400, 0xFFFFFF) if point ~ nil then local x, y point.x, point.y log(string.format(找到颜色点: (%d, %d), x, y)) touchDown(1, clickX, clickY) mSleep(80) touchUp(1, clickX, clickY) log(执行点击完成) else log(未找到目标颜色等待重试) end count count 1 if count maxTimes then mSleep(2000) -- 每次循环间隔 2 秒 end end end main()这段代码覆盖了四个核心点findColor 在指定屏幕区域查找颜色找到返回坐标点找不到返回 nil。找到后用 touchDown、mSleep、touchUp 模拟一次短按。每次分支都输出日志方便在日志窗口观察执行路径。count 限制循环次数避免脚本无限执行。4.2 坐标点击与找色找图背后的原理坐标点击的本质是向安卓系统注入触摸事件事件包含触摸点的屏幕坐标。不同设备分辨率不同同一布局的坐标位置可能完全不同。直接在脚本里写死坐标很容易出现“你的手机能用、换一台设备就失灵”的情况。找色找图解决的是这个问题。找色是检查某个区域内的像素颜色是否符合条件找图是在屏幕截图中做模板匹配寻找预设图片的位置。它们让脚本从依赖固定坐标变成依赖画面特征。一个相对稳妥的思路是先用找图定位目标图标的位置。如果找图不稳定再用找色判断该位置是否出现了预期颜色。把目标坐标计算成点击坐标而不是直接写死。例如找到目标图片后点击它的中心local match findImage(res/icon.png) if match ~ nil then local cx match.x match.width / 2 local cy match.y match.height / 2 click(cx, cy) end4.3 给脚本加防抖界面等待与执行间隔自动化脚本最常见的问题不是“不会点”而是“乱点”。界面还没加载完就执行点击会点到错误位置重复点击同一个按钮会导致页面反复跳转。解决办法是加防抖逻辑。防抖包含两件事条件确认点击前先确认界面特征已经出现。执行间隔每次操作之间留出足够的时间间隔。下面是一个带超时等待的示例local function waitForImage(imagePath, timeoutSec) local start os.time() while os.time() - start timeoutSec do local match findImage(imagePath) if match ~ nil then return match end mSleep(500) end return nil end local target waitForImage(res/start.png, 10) if target nil then log(等待超时未找到开始按钮) return end click(target.x target.width / 2, target.y target.height / 2)把“等待界面出现”封装成独立函数后脚本就不会在界面未准备好时盲目点击。超时返回 nil 的设计也很重要它给调用方提供了明确的失败信号。5. 调试、日志与运行验证5.1 用日志输出还原执行现场自动化脚本运行在设备或模拟器里不像桌面程序那样方便打断点日志输出是最主要的调试手段。每个关键分支都要有日志进入函数、找到目标、点击完成、超时退出、异常捕获。日志要包含足够信息不要只写“成功”或“失败”。推荐格式log(string.format([%s] findColor 结果: %s, os.date(%Y-%m-%d %H:%M:%S), tostring(point)))这里用 os.date 输出时间用 tostring 把 table 转成可读字符串。如果 point 是 niltostring(point) 输出 nil日志不会报错排查时也能明确看到“这里没有找到目标”。5.2 三个验证阶段语法、单动作、全流程脚本从开发到运行至少要分成三个阶段验证。第一阶段是语法与逻辑验证。在本地 Lua 环境中运行不依赖设备接口的纯逻辑部分比如字符串处理、循环计数、配置读取。这一步能拦截大多数语法错误。第二阶段是单动作验证。在古龙精灵中单独测试一个动作比如截图并找色确认接口返回值符合预期。这里最容易发现坐标区域、颜色格式、图片路径的问题。第三阶段是全流程验证。运行完整脚本观察日志顺序是否符合设计检查是否有漏点击、重复点击、超时退出。每一阶段都要保留运行日志。全流程验证建议记录以下内容脚本启动时间。每次识别的结果。每次操作的动作和坐标。退出原因。这些日志能帮你回到失败现场而不是靠猜。5.3 学习环境和长期运行环境的差别学习时通常用模拟器、手动一次一次点运行不关心资源占用。但长期运行场景完全不同维度学习环境长期运行环境设备模拟器真机或专用设备运行方式手动运行定时任务、远程触发异常处理简单日志重试、告警、恢复策略日志控制台输出落盘、滚动归档资源占用不关心内存、CPU、电量需要控制网络本地连接需要考虑断线重连长期运行还需要考虑脚本崩溃后的恢复是自动重启还是通知人工介入。这些要在设计脚本时提前想好而不是运行后再补。6. 高频问题排查清单6.1 按现象倒推原因的问题速查表下面是几类高频问题按“现象、原因、检查、解决”整理适用于古龙精灵和同类 Lua 自动化工具。问题现象常见原因检查方式处理建议设备列表看不到手机USB 调试未开启、驱动未装检查开发者选项重新插拔数据线用 adb devices 查看换原装数据线手动刷新设备列表脚本不执行点击坐标错误或分辨率不匹配在预览窗口取色确认坐标打印屏幕宽高使用屏幕宽度百分比或按分辨率换算坐标找不到目标颜色或图片颜色偏差、图片尺寸不一致、阈值不合适保存屏幕截图手动检查目标区域 RGB 值调整匹配阈值或准备多分辨率资源Lua 语法报错缺少 end、变量名拼错、中文标点查看日志中的行号和错误信息用本地 Lua 环境做语法检查页面注入脚本后打不开或很卡脚本体积过大、内存占用过高查看脚本尺寸检查循环是否反复加载大图压缩图片、拆分脚本、按需加载设备端读取 Lua 文件失败路径错误、编码不支持、权限不足检查文件路径和权限确认编码为 UTF-8统一 UTF-8 编码规范文件目录日志乱码Lua 源文件编码与工具不一致打开文件查看编码格式统一保存为 UTF-8去掉 BOM点击后界面无变化触摸事件未生效或坐标在无效区域脚本中加等待动画完成用日志确认点击触发延长等待时间改用长按或组合动作6.2 脚本过大导致页面打不开的处理思路这类工具通常需要把脚本推送到目标进程或由宿主进程加载。如果脚本体积过大、加载了大量大尺寸图片目标进程可能出现内存不足、启动变慢甚至无法加载。处理思路按顺序执行压缩图片资源尽量使用 PNG并适当降低分辨率。拆分脚本把不常用的代码放到独立文件里按需加载。避免在全局变量中长时间保存大尺寸截图。检查循环内是否重复加载同一个资源重复加载要移到循环外。从根本上说“脚本过大”是工程问题不是语言问题。合理的资源和代码组织可以大幅降低运行时负担。6.3 Lua 文件读取失败的处理思路“设备端读取 Lua 文件失败”经常不是工具不支持而是路径和编码问题。检查顺序确认文件路径是工具约定的相对路径或绝对路径。确认文件编码为 UTF-8去掉 BOM。确认目标进程对文件有读权限。在日志中输出完整路径再到文件管理器里确认文件真实存在。先输出完整路径再判断文件是否存在能避免“我以为在那个目录其实不在”的情况。路径问题排除后再考虑是文件内容损坏还是接口调用方式错误。7. 合规使用、最佳实践与扩展方向7.1 只在授权场景使用自动化脚本自动化脚本开发是一个技术方向但每次编写脚本前都必须确认使用场景的授权情况。对于游戏、App 平台明确禁止脚本自动化的不要编写和使用相关脚本对于自己拥有的设备、自有测试环境或明确允许自动化的服务可以按文档和规范开发。任何绕过安全机制、破坏系统、影响他人正常使用的做法都不属于工程实践也不在本教程讨论范围内。技术本身是中性的真正决定脚本价值的是使用场景。建议把学习重心放在 Lua 语言、界面自动化原理、调试方法上这些能力可以迁移到 RPA、自动测试、个人工具开发等方向。7.2 从第一天就开始做代码复用脚本写得多了你会发现“找图、等待、点击、日志”都是重复劳动。建议从开始就按模块组织公共函数。以 common.lua 为例-- common.lua 公共函数库 local M {} function M.logInfo(action, msg) log(string.format([INFO] %s: %s, action, msg)) end function M.clickCenter(match) if match nil then return false end local cx match.x match.width / 2 local cy match.y match.height / 2 touchDown(1, cx, cy) mSleep(60) touchUp(1, cx, cy) M.logInfo(click, string.format((%d, %d), cx, cy)) return true end return M在其他脚本里复用local common require(common) local match findImage(res/enter.png) common.clickCenter(match)公共模块的价值是日志格式统一、点击逻辑统一、换新设备时只需要调整公共函数不需要逐个修改脚本。7.3 一份可以保存的脚本编写规范清单自动化脚本虽然小但一样要有风格规范。下面是一份适合新手的速查清单使用 local 声明所有变量避免污染全局环境。函数命名在一个工程内保持统一风格。魔法数字尽量用常量或配置表代替。每个关键动作前写一行注释说明“在什么条件下做什么”。日志里必须包含时间和坐标或识别结果。循环必须有退出条件避免无限循环。异常分支必须写日志不要让脚本静默失败。图片资源统一放 res 目录按功能分子目录。脚本发布前在本地 Lua 环境做一次语法检查。每次改动保留备份避免改坏后无法回滚。注意不要只验证脚本能启动还要验证输入、输出、异常分支和日志是否符合预期。能启动和能正确执行是两回事。7.4 学完古龙精灵之后可以往哪走当你熟练使用古龙精灵之后掌握的不只是“会写点击脚本”而是移动端界面自动化的完整方法论。这些方法论可以延伸到几个方向移动 App 自动化测试把脚本改造成用例结合测试流程实现回归测试。RPA 机器人流程自动化把重复的办公操作自动化例如批量录入、报表整理。图像识别服务把找图、找色逻辑迁移到服务端结合 OCR 做内容识别。更多 Lua 项目Lua 在游戏服务端、嵌入式设备中广泛使用脚本开发中积累的表操作、字符串处理、错误处理能力可以直接复用。注意每换一个工具或版本第一件事是查官方 API 文档而不是复用旧项目的全部代码。接口变化是常态先确认再移植。注意学习期间建议始终保留一个本地 Lua 环境。语法问题在本地验证设备问题才到古龙精灵里验证排错效率会高很多。对于零基础学习者推荐的学习路径是先在本机完成 Lua 语法练习再跑通古龙精灵的最小示例接着把示例改造成自己需要的自动化任务最后深入 API 细节和异常处理。工具会更新、版本会变化但“先确认环境、再拆解动作、最后编码验证”的工程习惯不会变。