摘要:

由于雷电模拟器的命令行工具非常适合第三方代码控制,所以越来越多的人开始使用雷电模拟器进行脚本、逆向等软件的开发。但是也有很多人不清楚用程序控制雷电模拟器的原理和方法。所以我以比较容易入门的Python代码为例,从原理到方法讲解一下雷电模拟器的控制过程。

雷电模拟器的控制原理

安装好雷电模拟器之后,大家可以在安装目录下面找到ldconsole.exe和ld.exe两个命令行程序。此外,启动雷电模拟器之后,可以在共享文件夹→高级选项里面找到一个Windows路径。这个路径和模拟系统里面/sdcard/Pictures路径,两者是想通的。即在模拟器中复制文件到/sdcard/Pictures路径下,对应的Windows路径下面也会多出一个这样的路径。这个对于识图脚本来说,是非常的友好——因为在模拟器中截图无需经过dump步骤,就可以直接在控制主机上读到图并进行处理。此外两边甚至能够动态、高效的传递共享文件,这个功能就完爆其他模拟器。

下面说说ld和ldconsole两个命令。Ld命令用来执行adb命令,但是和普通adb不同的是,你无需知道模拟器设备的序列号,而是直接可以通过序号来发命令。而且目标不存在能够很快反馈。这个可以加快脚本的效率,并且提高脚本的稳定性——因为不存在也不会崩溃。此外ld命令的连接非常稳定,不会受到物理USB线的影响,不会时断时续不稳定。这个对一些要长期跑的脚本来说,简直就是致命吸引。

ldconsole也是一个很不错的工具,可以控制模拟器参数的设定,包括imei,序列号,手机号分辨率等等参数,还可以检测和控制模拟器的启动和关闭。甚至能够模拟输入,按键,滑动等操作。而且这种模拟操作是模拟器本身的开发接口,比adb要更稳定和灵敏,非常适合开发人员使用。

综上,雷电模拟器的控制原理,其实是通过控制命令行接口来控制模拟器的行为。

雷电模拟器控制的示例

class Dnconsole:# 请根据自己电脑配置console = 'D:\\Changzhi\\dnplayer2\\ldconsole.exe 'ld = 'D:\\Changzhi\\dnplayer2\\ld.exe 'share_path = 'C:/Users/zerglurker/Documents/雷电模拟器/Pictures'@staticmethoddef get_list():cmd = os.popen(Dnconsole.console + 'list2')text = cmd.read()cmd.close()info = text.split('\n')result = list()for line in info:if len(line) > 1:dnplayer = line.split(',')result.append(DnPlayer(dnplayer))return result@staticmethoddef list_running() -> list:result = list()all = Dnconsole.get_list()for dn in all:if dn.is_running() is True:result.append(dn)return result@staticmethoddef is_running(index: int) -> bool:all = Dnconsole.get_list()if index >= len(all):raise IndexError('%d is not exist' % index)return all[index].is_running()@staticmethoddef dnld(index: int, command: str, silence: bool = True):cmd = Dnconsole.ld + '-s %d "%s"' % (index, command)# print(cmd)if silence:os.system(cmd)return ''process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef adb(index: int, command: str, silence: bool = False) -> str:cmd = Dnconsole.console + 'adb --index %d --command "%s"' % (index, command)if silence:os.system(cmd)return ''process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef install(index: int, path: str):shutil.copy(path, Dnconsole.share_path + str(index) + '/update.apk')time.sleep(1)Dnconsole.dnld(index, 'pm install /sdcard/Pictures/update.apk')@staticmethoddef uninstall(index: int, package: str):cmd = Dnconsole.console + 'uninstallapp --index %d --packagename %s' % (index, package)process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef invokeapp(index: int, package: str):cmd = Dnconsole.console + 'runapp --index %d --packagename %s' % (index, package)process = os.popen(cmd)result = process.read()process.close()print(result)return result@staticmethoddef stopapp(index: int, package: str):cmd = Dnconsole.console + 'killapp --index %d --packagename %s' % (index, package)process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef input_text(index: int, text: str):cmd = Dnconsole.console + 'action --index %d --key call.input --value %s' % (index, text)process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef get_package_list(index: int) -> list:result = list()text = Dnconsole.dnld(index, 'pm list packages')info = text.split('\n')for i in info:if len(i) > 1:result.append(i[8:])return result@staticmethoddef has_install(index: int, package: str):if Dnconsole.is_running(index) is False:return Falsereturn package in Dnconsole.get_package_list(index)@staticmethoddef launch(index: int):cmd = Dnconsole.console + 'launch --index ' + str(index)process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef quit(index: int):cmd = Dnconsole.console + 'quit --index ' + str(index)process = os.popen(cmd)result = process.read()process.close()return result# 设置屏幕分辨率为1080×1920@staticmethoddef set_screen_size(index: int):cmd = Dnconsole.console + 'modify --index %d --resolution 1080,1920,480' % indexprocess = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef touch(index: int, x: int, y: int, delay: int = 0):if delay == 0:Dnconsole.dnld(index, 'input tap %d %d' % (x, y))else:Dnconsole.dnld(index, 'input swipe %d %d %d %d %d' % (x, y, x, y, delay))@staticmethoddef press_key(index: int, key: int):Dnconsole.dnld(index, 'input keyevent %d' % key)@staticmethoddef swipe(index, coordinate_leftup: tuple, coordinate_rightdown: tuple, delay: int = 0):x0 = coordinate_leftup[0]y0 = coordinate_leftup[1]x1 = coordinate_rightdown[0]y1 = coordinate_rightdown[1]if delay == 0:Dnconsole.dnld(index, 'input swipe %d %d %d %d' % (x0, y0, x1, y1))else:Dnconsole.dnld(index, 'input swipe %d %d %d %d %d' % (x0, y0, x1, y1, delay))@staticmethoddef copy(name: str, index: int = 0):cmd = Dnconsole.console + 'copy --name %s --from %d' % (name, index)process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef add(name: str):cmd = Dnconsole.console + 'add --name %s' % nameprocess = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef auto_rate(index: int, auto_rate: bool = False):rate = 1 if auto_rate else 0cmd = Dnconsole.console + 'modify --index %d --autorotate %d' % (index, rate)process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef change_device_data(index: int):# 改变设备信息cmd = Dnconsole.console + 'modify --index %d --imei auto --imsi auto --simserial auto --androidid auto --mac auto' % indexprocess = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef change_cpu_count(index: int, number: int):# 修改cpu数量cmd = Dnconsole.console + 'modify --index %d --cpu %d' % (index, number)process = os.popen(cmd)result = process.read()process.close()return result@staticmethoddef get_cur_activity_xml(index: int):# 获取activity的xml信息Dnconsole.dnld(index, 'uiautomator dump /sdcard/Pictures/activity.xml')time.sleep(1)f = open(Dnconsole.share_path + '%d/activity.xml' % index, 'r', encoding='utf-8')result = f.read()f.close()return result@staticmethoddef get_user_info(index: int) -> UserInfo:xml = Dnconsole.get_cur_activity_xml(index)usr = UserInfo(xml)if 'id' not in usr.info:return UserInfo()return usr@staticmethoddef get_activity_name(index: int):text = Dnconsole.dnld(index, 'dumpsys activity top | grep ACTIVITY', False)text = text.split(' ')for i, s in enumerate(text):if len(s) == 0:continueif s == 'ACTIVITY':return text[i + 1]return ''@staticmethoddef wait_activity(index: int, activity: str, timeout: int) -> bool:for i in range(timeout):if Dnconsole.get_activity_name(index) == activity:return Truetime.sleep(1)return False@staticmethoddef find_pic(screen: str, template: str, threshold: float):try:scr = cv.imread(screen)tp = cv.imread(template)result = cv.matchTemplate(scr, tp, cv.TM_SQDIFF_NORMED)except cv.error:print('文件错误:', screen, template)time.sleep(1)try:scr = cv.imread(screen)tp = cv.imread(template)result = cv.matchTemplate(scr, tp, cv.TM_SQDIFF_NORMED)except cv.error:return False, Nonemin_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)if min_val > threshold:print(template, min_val, max_val, min_loc, max_loc)return False, Noneprint(template, min_val, min_loc)return True, min_loc@staticmethoddef wait_picture(index: int, timeout: int, template: str) -> bool:count = 0while count < timeout:Dnconsole.dnld(index, 'screencap -p /sdcard/Pictures/apk_scr.png')time.sleep(2)ret, loc = Dnconsole.find_pic(Dnconsole.share_path + '%d/apk_scr.png' % index, template, 0.001)if ret is False:print(loc)time.sleep(2)count += 2continueprint(loc)return Truereturn False# 在当前屏幕查看模板列表是否存在,是返回存在的模板,如果多个存在,返回找到的第一个模板@staticmethoddef check_picture(index: int, templates: list):Dnconsole.dnld(index, 'screencap -p /sdcard/Pictures/apk_scr.png')time.sleep(1)for i, t in enumerate(templates):ret, loc = Dnconsole.find_pic(Dnconsole.share_path + '%d/apk_scr.png' % index, t, 0.001)if ret is True:return i, locreturn -1, None

下面是调用代码

#注意,请自行导入上面的类代码,否则无法使用
import dnconsole.Dnconsole
import time
if __name__ == '__main__':Dnconsole.launch(0)#打开模拟器time.sleep(10)#等待启动#TODO: 其他的控制(touch)Dnconsole.quit(0)#退出模拟器

python控制雷电模拟器相关推荐

  1. Python - 控制雷电模拟器(Dnconsole)

    Python - 雷电模拟器控制台(Dnconsole) 1.Dnconsole控制台 雷电模拟器9.0 雷电模拟器9.0,32+64位并行,支持对画质.性能要求较高的一类游戏.关于使用Python实 ...

  2. python控制雷电模拟器 代码修复

    from concurrent.futures import thread import winreg, os ,time # 雷电模拟器自动获取目录使用 import random #------- ...

  3. 【k.11】python+appium+雷电模拟器 app自动化测试 demo 教学

    一.首页讲解一下每个部分的作用: 1.雷电模拟器相当于一台手机,里面安装被测试的软件app 2.appium相当于一个链接python脚本和雷电模拟器的桥梁 3.python,编写控制app的脚本代码 ...

  4. python mitmproxy +雷电模拟器 安装

    第一步 安装mitmproxy 首先在安装好python 的情况下 pip install mitmproxy 第二步 电脑端安装证书 进入这个目录下   如果没有就重新mitmproxy 点击mit ...

  5. 通过uiautomator2控制雷电模拟器里的程序

    参考 Python+雷电模拟器实现安卓自动控制 python版本 截至到写这篇文章的时候, 不要用python3.8 uiautomator2还不支持python3.8 后面的weditor也不支持 ...

  6. python控制手机模拟器_Appium+python自动化之连接模拟器并启动淘宝APP(超详解)...

    简介 上一篇讲解完模拟器的安装.配置好以后,就好比我们手机已经买好,并且系统已经做好了,就差我们用数据线和电脑连接开始实战了,这篇宏哥就带着小伙伴们和童鞋们趁热打铁,讲解和分享一下如何连接模拟器(电脑 ...

  7. python控制手机模拟器_Appium+python自动化23-Android夜神模拟器

    前言 Android SDK虽然也自带了模拟器,但是那速度会让你怀疑人生,并且不稳定经常卡死异常.夜神模拟器可以说是android模拟器里面的一个神器. 环境安装 2.夜神安卓模拟器(夜神模拟器),是 ...

  8. 雷电模拟器python编程接口_【Python】雷电模拟器说明[附代码]

    [Python] 纯文本查看 复制代码class Dnconsole: # 请根据自己电脑配置 console = 'D:\\Changzhi\\dnplayer2\\dnconsole.exe ' ...

  9. python+appium+雷电模拟器 app自动化测试

    一.环境准备  1.jdk1.8 2.android-sdk-windows 3.appium-desktop-setup-1.11.0(直接搜索appium进入官网下载) 4.Appium-Pyth ...

  10. Python控制安卓模拟器

    一.下载安装 夜神模拟器 adb 二.连接模拟器 1.开启模拟器进入开发者模式 连续单单击3次版本号进入开发者模式允许调试 2.连接 cmd进入命令行窗口 端口连接输入adb connect 127. ...

最新文章

  1. 56.4 AP!超越YOLOv4,更快更强的CenterNet2来了!
  2. linux进程间通讯-消息队列
  3. python opencv模板匹配多目标_基于opencv的多目标模板匹配
  4. 强行分类提取特征自编码网络例3
  5. Sql面试题之三(难度:简单| 含答案)
  6. Redis简介和Redis Template用法整理
  7. 漫谈度量学习(Distance Metric Learning)那些事儿
  8. opengl游戏引擎源码_跨平台渲染引擎之路:拨云见日
  9. linux后缀为tar.xz,xz后缀名文件解压方法
  10. P5934-[清华集训2012]最小生成树【最小割】
  11. JAVA知识基础(一):数据类型
  12. pytorch对卷积神经网络常见操作
  13. springboot+openFeign+nacos+seata开发实战
  14. Linux应用调试-strace命令
  15. 【3dmax千千问】食住玩初学3dmax插件神器第24课:3dmax自学渲染效果图教程|疯狂模渲大师、室内设计师、效果图绘图员都应该如何认识VRAY或扫描线CORONA渲染器及其VR核心算法的作用?
  16. python 几个倒叙方法
  17. 六大设计原则(SOLID)备忘
  18. Java面试题--dalao总结版
  19. 玩安卓从 0 到 1 之架构思考
  20. chrome浏览器打开网页默认全屏的方法_测试成功

热门文章

  1. 挖矿木马分析之肉鸡竟是我自己
  2. Python类的继承
  3. 多伦多计算机科学排名,2017加拿大大学专业排名:计算机科学类项目
  4. Vue基础案例-----Todos(1)
  5. 简单新闻客户端APP设计
  6. 卸载office2016密钥
  7. 在html5水平边距属性hspace,响应式网页设计(html5+css3+cms)教学课件作者李文奎第2章html基础.pptx...
  8. android深色模式省电吗,护眼又省电,深色模式真这么厉害?
  9. 弘辽科技:拼多多商品搜索热度如何提升?技巧分享
  10. Python语言在人工智能中的优势有哪些?