1 学习路线
- 连接安卓模拟器:
- ADB命令:Awesome Adb
- lua语言:触动精灵脚本开发Lua简明教程
- 触动精灵相关知识:
2 常用链接
- 安卓模拟器:
- ADB:
- lua:
- 触动精灵脚本开发Lua简明教程
- lua语言官方手册(英文):https://www.lua.org/manual/5.2/
- Programming in Lua (first edition)
- lua语言中文手册:http://manual.luaer.cn/
- TS:
- 触动精灵官网:http://www.touchsprite.com/
- 触动精灵论坛:http://bbs.touchsprite.com/forum.php
- 触动精灵开发手册大全:http://www.touchsprite.com/helpdoc
- 触动精灵脚本开发手册: https://www.zybuluo.com/miniknife/note/212706
3 连接安卓模拟器
- 添加
adb
命令到PATH
环境变量。安装完成后,找到安装路径(如D:\Changzhi\dnplayer2
),将adb.exe
所在目录(即前述的安装路径)添加到PATH
环境变量以方便使用。关于如何在 Windows 中添加PATH
环境变量,可自行百度。如果没有添加环境变量,则每次使用adb
命令前,你都需要先执行cd
命令,如下所示:1 2 3
cd D:\Changzhi\dnplayer2 adb devices ……
- 使用
adb devices
查看正在运行的设备。如下所示(我用的 Powershell,CMD类似):1 2 3 4
PS C:\Users\wsxq2> adb devices # 查看正在运行的模拟器 List of devices attached 127.0.0.1:5555 device 127.0.0.1:5557 device
- 使用
adb -s {127.0.0.1:<指定端口>|<模拟器标识>}
可连接任意指定的设备。如打开adb shell
:1
adb -s 127.0.0.1:5555 shell
或者
1
adb -s emulator-5556 shell
- 使用
adb -s {127.0.0.1:<指定端口>|<模拟器标识>} forward tcp:50005 tcp:50005
转发模拟器中触动精灵的端口(50005)到电脑的本地端口(50005),用于连接 IDE 和模拟器、连接取色器和模拟器。如:1
adb -s 127.0.0.1:5555 forward tcp:50005 tcp:50005
其中
-s
参数用来选定模拟器127.0.0.1:5555
,forward
表示转发模拟器中的端口到计算机本地端口,forward
之后的参数之所以均为tcp:50005
是因为模拟器中触动精灵每次启动时会打开 TCP 协议的50005
端口,而相关的开发工具(主要是指TouchSpriteStudio.exe
和TSColorPicker.exe
,因为它们需要和模拟器连接,前者用于调试,后者用于截图)默认也会使用计算机本地的 TCP 协议的50005
端口,所以将模拟器中的50005
端口转发至本地计算机的50005
端口以便于使用。 - 使用
adb kill-server
杀死正在运行的服务,然后执行adb start-server
重新启动服务。很多时候连不上,就是因为没有 kill
此外,夜神模拟器和雷电模拟器在某些地方略有差别,简述如下:
- 夜神:
adb.exe
默认路径为:D:\Program Files (x86)\Nox\bin\adb.exe
- 端口规律:第一个模拟器端口是
62001
,第二个模拟器端口是62025
,第三个是62025+1
,以此类推 nox_adb.exe
完全等同于adb.exe
- 雷电:
adb.exe
默认路径为:D:\Changzhi\dnplayer2\adb.exe
- 端口规律:
5555 + index * 2
4 常用ADB命令
本部分主要参考自【新手指导】夜神安卓模拟器adb命令详解 和 【雷电命令】雷电安卓模拟器修改信息及常用adb命令整理贴
使用adb /?
查看命令自带帮助,参考手册:Awesome Adb
4.1 push pull
push
: 把电脑上的文件或文件夹传到模拟器1
adb push D:/aaa.avi /mnt/avi/
pull
: 把模拟器里面的文件或文件夹传到电脑上1
adb pull /mnt/avi/aaa.avi D:/avi/
4.2 install uninstall
install
: 安装APK1
adb install d:\\qq.apk
uninstall
: 卸载APK1
adb uninstall com.tencent.mobileqq
4.3 shell
shell
: 执行在安卓上执行的shell命令。即这部分的命令既能以adb shell ...
的形式执行(如adb shell pm list packages
),也能使用adb shell
先进入设备的终端然后直接执行(如pm list packages
)
4.3.1 pm
pm
: Package Manager
list
: 获取模拟器所有包名1 2
adb shell pm list packages #获取模拟器所有包名 adb shell pm list packages -f #获取模拟器所有包名并且包括APK路径
path
: 获取包名对应的APK路径1
adb shell pm path packageName
clear
: 清理应用数据1
adb shell pm clear packageName
4.3.2 am
am
: Activity Manager。该命令用来执行一些系统动作, 例如启动指定activity, 结束进程, 发送广播, 更改屏幕属性等. 调试利器.
start
: 根据intent指向启动Activity, Intent可以是显示的指向activity, 也可以是ACTION方式, 并且可以添加flag, data等参数信息.1
adb shell am start com.tencent.android.qqdownloader/com.tencent.assistant.activity.SplashActivity #启动应用宝
force-stop
: 关闭应用1
adb shell am force-stop 包名
startservice <Intent>
: 启动Service, 可以添加flag, data等参数信息.broadcast <Intent>
: 发送广播, 可以添加flag, data等参数信息.monitor
: 启动一个Crash和ANR的监听器, 如有Crash或ANR会在控制台输出相关信息.force-stop <Package>
: 强制停止该包相关的一切, 传入package name.kill <Package>
: 杀死该包相关的所有进程, 传入package name.kill-all
: 杀死所有后台进程display-size WxH
: 改变显示的分辨率. 手机可能不支持.1
adb shell am display-size 1280x720
display-density <dpi>
: 改变显示的density, 手机可能不支持.1
adb shell am display-density 320,
4.3.3 input
input
: 模拟输入
text
: 模拟输入文本1
adb shell input text 字符串(不支持中文)
keyevent
: 模拟按键。KeyCode参考手册: adb命令模拟按键事件 KeyCode1
adb shell input keyevent 键值
tap
: 模拟鼠标点击1
adb shell input tap X Y
swipe
: 模拟鼠标滑动1
adb shell input swipe X1 Y1 X2 Y2
4.3.4 screencap
screencap
: 截屏
1
adb shell screencap -p /sdcard/screencap.png
4.3.5 getprop setprop
setprop
: 设置手机IMEI/IMSI/手机号/SIM卡序列号
1
2
3
4
5
6
7
8
9
10
11
12
13
adb shell setprop persist.nox.modem.imei 352462010682470
adb shell setprop persist.nox.modem.imsi 460000000000000
adb shell setprop persist.nox.modem.phonumber 15605569000
adb shell setprop persist.nox.modem.serial 89860000000000000000
# adb shell进去然后执行下面的命令修改经纬度
setprop persist.nox.gps.latitude xxx
setprop persist.nox.gps.longitude xxx
# adb shell进去然后执行下面的命令修改mac地址
setprop persist.nox.wifimac xxx # 修改mac地址
setprop persist.nox.modem.phonumber 138111111111 # 手机号,生成一个随机11位数字
setprop persist.nox.model ABC001 # 手机型号,英文加数字随机
setprop persist.nox.manufacturer XiaoMi # 手机制造商英文随机
setprop persist.nox.brand Mi # 手机品牌英文随机
4.3.6 dumpsys
dumpsys
: 强大的dump工具, 可以输出很多系统信息. 例如window, activity, task/back stack信息, wifi信息等.
activity
: 输出app组件相关信息。可以用细分参数获得单项内容activites
: 获取activity task/back stack信息.1
adb shell dumpsys activity activities
service
providers
intents
broadcasts
processes
alarm
: 输出当前系统的alarm信息cpuinfo
: 输出当前的CPU使用情况diskstats
: 输出当前的磁盘使用状态batterystats
: 电池使用信息package
: package相关信息, 相当于pm功能的集合, 输出诸如libs, features, packages等信息meminfo
: 输出每个App的内存使用和系统内存状态, 可以指定包名, 例如adb shell dumpsys meminfo com.anly.githubappwindow
: 输出当前窗口相关信息.policy
animator
tokens
windows
4.4 logcat
logcat
: 打印log信息
1
2
3
4
5
adb logcat #打印log
adb logcat -c #清除手机的log buffer(有些手机权限控制, 不支持.)
adb logcat -b <buffer> #打印指定buffer的log信息,buffer有: main(主log区,默认), events(事件相关的log), radio(射频, telephony相关的log)
adb logcat -v <format> #格式化输出log, 常用的用adb logcat -v time显示时间
adb logcat -f <filename> #输出log到指定文件
4.5 start-server kill-server
start-server/kill-server
: 启动/杀死adb简介中提到的Server端进程。
adb kill-server #由于adb并不稳定, 有时候莫名的问题掉线时 adb start-server #可以先kill-server, 然后start-server来确保Server进程启动。往往可以解决问题。
5 Lua语言
5.1 基本特性
- 注释:
1 2 3 4 5
print("hello the world") --这是单行注释 --[[这是 多行 注释 ]]
- 语句分隔符:
空白字符
或;
。建议多个语句写在同一行时使用;
1 2
x=1;y=1 print("x,y: "..x..","..y)
- 语句块:
1 2 3
do 语句块 end
- 赋值语句:
1 2 3
a,b,c,d=1,2,3,4 a,b=b,a -- 多么方便的交换变量功能啊。 local a,b,c = 1,2,3 -- a,b,c 都是局部变量(不使用local则为全局变量)
- 关键字:
1 2 3
and break do else elseif end false for function if in local nil not or repeat return then true until while
5.2 程序控制语句
- 条件控制:
1 2 3 4 5 6 7
if 条件 then 语句 elseif 条件 then 语句 else 语句 end
- 循环语句:
while
my_table = {1,2,3} local index = 1 -- 注意: table 中的索引从 1 开始 while my_table[index] do -- 只要条件返回 true,就一直执行循环 print(my_table[index]) index = index +1 -- Lua 中没有 i++ 的写法,所以只能用这种写法 end -- 输出 1 -- 2 -- 3
repeat
(相当于do while
)1 2 3 4 5 6 7 8 9 10
local snum = 1 --起始值 repeat print("snum is "..snum) snum = snum + 1 until snum == 4 --当 snum 等于 4 时 跳出循环 --输出: --snum is 1 --snum is 2 --snum is 3
for
Note:
- First, all three expressions are evaluated once, before the loop starts;
- Second, the control variable is a local variable automatically declared by the for statement and is visible only inside the loop;
- Third, you should never change the value of the control variable: The effect of such changes is unpredictable.(you can use
while
instead)
1 2 3 4 5
my_table = {1,2,3,4,5} --下面的for循环中:1为起始值,5为最大值,2为步进值 for i = 1,#my_table,2 do --#my_table 表示取表的长度,上边定义了长度为 5 print(my_table[i]) end
5.3 运算符
- 数值运算:
+
,-
,*
,/
,%
,^
- 比较运算:
>
,<
,>=
,<=
,==
,~=
. 分别表示:小于
,大于
,不大于
,不小于
,相等
,不相等
。所有这些操作符总是返回true
或false
。对于Table
,Function
和Userdata
类型的数据,只有==
和~=
可以用。相等表示两个变量引用的是同一个数据。1 2 3 4 5 6
a={1,2} b=a print(a==b, a~=b) -- true, false a={1,2} b={1,2} print(a==b, a~=b) -- false, true
-
逻辑运算:
and
,or
,not
。其中,and
和or
与C
语言区别特别大。在Lua
中,只有false
和nil
才计算为false
,其它任何数据都计算为true
,0
也是true
!and
和or
的运算结果不是true
和false
,而是和它的两个操作数相关。a and b
: 如果a
为false
,则返回a
;否则返回b
a or b
: 如果a
为true
,则返回a
;否则返回b
1 2 3 4 5
print(4 and 5) --> 5 print(nil and 13) --> nil print(false and 13) --> false print(4 or 5) --> 4 print(false or 5) --> 5
技巧:
1 2
x = a and b or c --相当于x = a? b : c x = x or v --相当于if not x then x = v end
-
运算符优先级:从高到低顺序如下:
1 2 3 4 5 6 7 8
^ not - (一元运算) * / + - ..(字符串连接) < > <= >= ~= == and or
5.4 变量
- 变量类型:使用
type()
获得nil
空值: 所有没有使用过的变量,都是 nil。nil 既是值,又是类型。boolean
布尔值:true
和false
。在Lua
中,只有false
和nil
才计算为false
,其它任何数据都计算为true
,0
也是true
!number
数值:相当于c语言
中的double
类型string
字符串:可以包含’\0’字符。使用..
连接两个字符串。可以使用[[我是一个跨行的字符串]]
来避免在一行插入过多的转义字符(详见变量的定义中的示例)。table
关系表:Lua中非常强大的类型: 可以用除了nil的任意类型来作数组的索引,用除了 nil的任意类型的值来作数组的内容。使用{
和}
function
函数:在Lua中,函数也是一种类型。也就是说,所有的函数都是变量。可以接受可变参数,使用...
和arg
(table
类型)。可以同时返回多个结果,使用,
分隔userdata
用户数据:这个类型专门用来和Lua
的宿主打交道的。宿主通常是用C
和C++
来编写的,在这种情况下,userdata
可以是宿主的任意数据类型,常用的有struct
和指针
。thread
线程:在Lua
中没有真正的线程。Lua
中可以将一个函数分成几部份运行。
-
变量的定义:在 Lua 中,不管你在什么地方使用变量,都不需要声明,并且所有的这些变量总是全局变量,除非,你在前面加上
local
。定义一个变量的方法就是赋值。变量名是大小写相关的。var_nil=nil -- 请注意 nil 一定要小写 var_boolean = true --只有 false 和 nil 才被计算为 false var_number=4.57e-3 --Lua没有整数类型 var_string1="one line\nnext line\n\"in quotes\", 'in quotes'" var_string2=[[ one line next line "in quotes", 'inquotes']] --比var_string1的可读性强 var_table1= --超级强大的table类型 { 10, -- 相当于 [1] = 10 [100] = 40, John= -- 如果你原意,你还可以写成:["John"] = { Age=27, -- 如果你原意,你还可以写成:["Age"] =27 Gender=Male -- 如果你原意,你还可以写成:["Gender"] =Male }, 20 -- 相当于 [2] = 20 } var_table2= --面向对象编程 { Age = 27 add = function(self, n) self.Age = self.Age+n end --t.add(t,10)可以简写成t:add(10) } var_function1=function (a,b) return a+b end function var_function2(a,b) return a+b end function var_minmax(a,b,...) local min,max,temp,arg arg={...} min=a>b and b or a max=a<b and b or a for i=1,#arg do temp=arg[i] min=min>temp and temp or min max=max<temp and temp or max end return min,max end
6 IDE 常用快捷键
这部分的内容参考自:触动精灵 IDE 脚本编辑器使用手册 - 作业部落 Cmd Markdown 编辑阅读器
6.1 调试运行
F6
: 本地代码运行,不支持运行包含触动精灵扩展函数的代码Alt + S
: 发送文件到设备,需先在左侧项目列表中选中需要发送的文件(支持ctrl多选),发送文件格式支持 lua、luac、txt,使用此功能前需要先连接设备Alt + R
: 将当前脚本传至设备上并运行,使用此功能远程运行脚本不会出现运行提示框,此功能需先连接设备F7
: 对当前代码进行二进制编译,生成的文件路径会在输出窗口提示Shift + F7
: 代码检查,可检查是否有语法错误,可在输出栏直接双击错误提示跳转到对应行F9
: 在当前光标行设置断点,在远程调试中使用F10
: 单步运行跟踪,在远程调试中使用Ctrl + Shift + D
: 开始/继续 远程调试,在远程调试中使用Shift + F5
: 终止远程调试中的脚本运行Ctrl + Shift + W
: 打开/关闭 监视窗口,用于远程调试Ctrl + Shift + S
: 打开/关闭 调用堆栈窗口,用于远程调试
6.2 脚本编辑
Ctrl + Shift + p
: 打开/关闭 文件管理窗口F12
: 对整个代码进行折叠,再按一次取消折叠Ctrl + I
: 一键自动缩进,可对当前代码进行智能缩进排版Ctrl + D
: 快速复制当前行,以当前光标为准Ctrl + C
: 快速复制当前行到剪贴板Ctrl + V
: 黏贴剪贴板内容到光标位置Ctrl + U
: 代码注释,对已经注释的代码使用会取消注释Ctrl + B
: 打开快捷操作栏,可用来快速检索内容,如:直接输入字符可直接在整个项目目录搜索对应内容打开并显示在当前窗口Ctrl + G
: 可通过输入行号快速跳转到指定行Ctrl + F2
: 对光标所在行设置标签,用于不同行之间的快速跳转F2
: 跳转至下一个标签行,需先设置标签Shift + F2
: 跳转到上一个标签行,需先设置标签Ctrl + F
: 搜索替换Ctrl + F
: 在当前代码中搜索Ctrl + Shift + F
: 在文件中进行搜索、支持多级子目录、支持搜索结果上下文显示,在搜索结果中双击可自动打开对应文件并跳转至对应行Ctrl + "+"
: 对显示字体进行放大Ctrl + "-"
: 对显示字体进行缩小Ctrl + 0
: 还原字体大小为默认
7 我写的脚本
- 全民k歌刷鲜花脚本:https://github.com/wsxq2/WeSingFlowers
- 微信跳一跳自动运行脚本:https://github.com/wsxq2/jump