[Python] USB连接Unity Profiler

Android设备连接Profiler有两种方式,一种是直接通过IP进行连接,需要手机和电脑处于可连通的网络环境中;另一种是借助ADB命令,使用USB进行连接。我通常都是使用USB的方式,网络连通这个条件可能在大多数工作环境下都比较困难,相比之下使用USB就很方便了,还不用输一串的IP地址。不过USB方式需要执行一个连接转发的命令:

adb forward tcp:54999 localabstract:Unity-{insert bundle identifier here}

之前的很长一段时间里,我都是把这个命令放到印象笔记里,用的时候复制出来执行。因为游戏的包名通常不会变,所以这个命令基本是固定的。
  前几天翻项目共享盘的时候,发现了一个执行上面命令的bat脚本。这是一种更方便的方式,写好脚本放在桌面上,需要的时候双击即可执行。这个脚本方便是方便,却有个小缺陷,无论命令是否执行成功,都会输出连接成功……然后我强迫症就犯了……
  虽然想把问题解决掉,可我不会bat命令啊,也不想去学……然后就用Python重写了一个自己用的~

import subprocess
import os

# ADB命令所在路径,例:r'D:\android-sdk-windows\platform-tools\adb.exe'
ADB_Path = None
# 游戏包名(package),例:'com.walsite.game'
App_Package = None

def is_adb_valid():
    """
    判断ADB命令是否已经添加到环境变量
    :rtype: bool
    """
    proc = subprocess.run('adb help', shell=True, stderr=subprocess.PIPE)
    return proc.returncode == 0

def forward_adb_cmd(adb: str, package: str):
    """
    执行连接Profiler的命令
    :param adb: adb命令所在的路径
    :param package: 游戏包名
    :return: 返回命令执行是否成功
    :rtype: bool
    """
    cmd = adb + ' forward tcp:54999 localabstract:Unity-' + package
    return os.system(cmd) == 0

def main():
    package = App_Package
    if package is None or '' == package:
        package = input('请输入游戏的包名(package):')
    adb = ADB_Path
    if adb is None or '' == adb:
        if is_adb_valid():
            adb = 'adb'
        else:
            adb = input('请输入adb完整路径:')
    if forward_adb_cmd(adb, package):
        print('执行成功~')
    else:
        print('\n')
        print('* ' * 20)
        print('操作失败!!')
        print('* ' * 20, '\n')
    os.system('pause')

if __name__ == '__main__':
    main()

代码逻辑很简单,这里简单介绍下用来执行cmd命令的两个标准库函数。

1) os.system(command: str)
# 执行cmd命令,它会返回执行结果的状态码。
# 命令产生的输出,会直接显示到命令行中,不会通过返回值返回。
# command:要执行的命令

2) subprocess.run(args, shell: bool, stderr)
# 这个函数的功能比较丰富,参数也很多,这里只摘取了用到的部分,功能说明也不代表其全部。
# 通过它判断命令是否执行成功,并且不让命令输出显示出来。
# args: 要执行的命令,这里使用拼接好的str。
# shell: 标记为是否是shell模式。
# stderr:设定标准错误输出的位置,这里为了不让命令的产生的输出显示到命令行上,
#     将标准输出指向了PIPE。

is_adb_valid这个函数也值得说一下。通常我们检查环境变量是否配置正确,都会在cmd里直接执行一个命令,如果输出和这个命令相关的内容,就代表配置成功。比如配置ADB的时候,会直接执行<code>adb</code>,然后命令行会输出ADB命令的帮助文档。这一现象看似是命令执行成功了,实际却是失败了。我想这应该是ADB命令的一种处理错误的方式把,接收到错误的命令时会输出help信息,帮助使用者纠正错误。
  由于在Python里执行cmd命令只能获得错误码,所以做验证时必须使用一个能返回“执行成功”错误码(0)的命令,也就是这里选择的<code>adb help</code>。它不需要多余变量参数与条件,只要ADB在环境变量中配置正确,它就会返回“执行成功”。


昨天加班用这个命令的时候输出了一个错误消息:<code>error: more than one device/emulator</code>
  它的意思大概是“当前连接了多个设备,不知道该选择哪一个”,但是我只连了一个测试机。这个问题出现频率还挺高的,我就遇到过好多次,不过原因一直没找到。使用<code>adb kill-server</code>断开所有连接可以解决问题。我调整了下脚本,把这个问题加进去了,完整代码可参考profiler_by_adb
  修改的两个关键点:
1)使用<code>subprocess.run</code>执行命令,通过返回的CompletedProcess.stderr获得错误消息
2)调用run时设置参数<code>universal_newlines=True</code>保证stderr是文本形式(不指定这个参数的话,如果发生了异常,stderr返回的是bytes信息,无法定位问题)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,050评论 25 707
  • 又是一时疏忽,将煮好的滚咖啡倒入伴侣粉末。伴侣很快凝结成块。我苦笑,纯硫酸倒入纯水和反之的结果相差甚远,你化学这么...
    吐克禅师阅读 373评论 0 1
  • 简介 指多维空间两点间的距离,当为二维平面的时候我们可以很好的进行想象,两个点的距离计算就是,横坐标相减的平方加上...
    zhangxu0636阅读 784评论 0 0
  • Prometheus Querying 查询 prometheus提供了功能性表达式语言,可让用户对于时间序列的数...
    YichenWong阅读 43,889评论 6 7