折腾:
【未解决】Mac中用adb install安装安卓apk卡死
期间,改为:
adbInstallCmd = "adb -s {0} install -r {1}".format(self.device, item[3]) logging.info("Run cmd: %s", adbInstallCmd) os.system(adbInstallCmd)
输出信息,结果:
[201202 13:36:05][DevicesMethods.py 4065] Run cmd: adb -s hmucaei75ptk7szs install -r /Users/xxx/dev/xxx/crawler/appAutoCrawler/AppCrawler/task/20201202_fengyun_0192LeiMoChuanShuo/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk
难道是路径太长?也不像啊
adb -s hmucaei75ptk7szs install -r /Users/xxx/dev/xxx/crawler/appAutoCrawler/AppCrawler/task/20201202_fengyun_0192LeiMoChuanShuo/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk

此处有244了,或许快要超过255,或许255是最大限制?
那手动去iTerm2中运行,且缩短路径试试
~/Downloads/pre_download adb install 20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk Performing Streamed Install
结果:就可以正常安装。。。
好像还真的是路径太长导致的?
那去试试,改写代码,把此处要安装的apk,每次复制一份到别处,比如download目录
期间涉及到:
创建临时文件和文件夹
拷贝文件
python temp folder
python copy file
How do I copy a file in Python? – Stack Overflow
其中:
创建临时文件夹:
tmpFolder = tempfile.TemporaryDirectory() logging.info("tmpFolder=%s", tmpFolder) # tmpFolder=<TemporaryDirectory '/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp_yk15rlz'> tmpFolderName = tmpFolder.name logging.info("tmpFolderName=%s", tmpFolderName) # tmpFolderName=/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp_yk15rlz
拷贝文件:
方式1:
apkFileName = os.path.basename(apkFilePath) logging.info("apkFileName=%s", apkFileName) # apkFileName=20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk tmpApkFile = os.path.join(tmpFolderName, apkFileName) logging.info("tmpApkFile=%s", tmpApkFile) # tmpApkFile=/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp_yk15rlz/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk logging.info("Copy %s to tmp file %s", apkFilePath, tmpApkFile) # Copy /Users/xxx/dev/xxx/crawler/appAutoCrawler/AppCrawler/task/20201202_fengyun_0192LeiMoChuanShuo/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk to tmp file /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp_yk15rlz/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk copyfile(apkFilePath, tmpApkFile)
方式2:
无需计算src的文件全路径中的basename即filename,直接dst用目录即可:
copy2(apkFilePath, tmpFolderName)
最后完整代码:
logging.info("start to install app in {}".format(os.path.basename(self.arg_options.task))) apkFilePath = item[3] # os.system("adb -s {0} install {1}".format(self.device, apkFilePath)) adbInstallCmd = "adb -s {0} install -r {1}".format(self.device, apkFilePath) # length=243 command: # adb -s hmucaei75ptk7szs install -r /Users/xxx/dev/xxx/crawler/appAutoCrawler/AppCrawler/task/20201202_fengyun_0192LeiMoChuanShuo/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk # sometime will stuck, reason: maybe command length too large, > 255? # so copy to temp folder -> to reduce command string length tmpFolder = tempfile.TemporaryDirectory() logging.info("tmpFolder=%s", tmpFolder) # tmpFolder=<TemporaryDirectory '/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp_yk15rlz'> tmpFolderName = tmpFolder.name logging.info("tmpFolderName=%s", tmpFolderName) # tmpFolderName=/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp_yk15rlz apkFileName = os.path.basename(apkFilePath) logging.info("apkFileName=%s", apkFileName) # apkFileName=20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk tmpApkFile = os.path.join(tmpFolderName, apkFileName) logging.info("tmpApkFile=%s", tmpApkFile) # tmpApkFile=/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp_yk15rlz/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk logging.info("Copy %s to tmp file %s", apkFilePath, tmpApkFile) # Copy /Users/xxx/dev/xxx/crawler/appAutoCrawler/AppCrawler/task/20201202_fengyun_0192LeiMoChuanShuo/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk to tmp file /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp_yk15rlz/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk copyfile(apkFilePath, tmpApkFile) # copy2(apkFilePath, tmpFolderName) adbInstallCmd = "adb -s {0} install -r {1}".format(self.device, tmpApkFile) # adb -s hmucaei75ptk7szs install -r /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmpq3ypjfgd/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk logging.info("Run length=%d, command: %s", len(adbInstallCmd), adbInstallCmd) # Run length=153, command: adb -s hmucaei75ptk7szs install -r /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmpq3ypjfgd/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk os.system(adbInstallCmd)
输出:
[201202 14:13:53][DevicesMethods.py 4064] start to install app in 20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android.txt [201202 14:13:53][DevicesMethods.py 4074] tmpFolder=<TemporaryDirectory '/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp6trpy1zs'> [201202 14:13:53][DevicesMethods.py 4077] tmpFolderName=/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp6trpy1zs [201202 14:13:53][DevicesMethods.py 4080] apkFileName=20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk [201202 14:13:53][DevicesMethods.py 4083] tmpApkFile=/var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp6trpy1zs/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk [201202 14:13:53][DevicesMethods.py 4085] Copy /Users/xxx/dev/xx/crawler/appAutoCrawler/AppCrawler/task/20201202_fengyun_0192LeiMoChuanShuo/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk to tmp file /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp6trpy1zs/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk [201202 14:13:54][DevicesMethods.py 4092] Run length=153, command: adb -s hmucaei75ptk7szs install -r /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmp6trpy1zs/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk Performing Streamed Install [I 201202 14:14:16 watcher:255] XPath(hook:继续安装): ['继续安装'] Success
最终得以正常的
adb install xxx.apk
了。
此处,是Python通过os.system调用
adb -s hmucaei75ptk7szs install -r /Users/xxx/dev/xxx/crawler/appAutoCrawler/AppCrawler/task/20201202_fengyun_0192LeiMoChuanShuo/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk
感觉是:由于命令太长,(接近)超过了255的限制?导致无法正常执行
解决办法:把命令长度改短
此处去把apk文件放到一个路径更短的地方
比如,临时文件夹
adb -s hmucaei75ptk7szs install -r /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmpq3ypjfgd/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk
其长度只有153,没(接近)超过255
即可正常的安装apk到安卓手机中了
注:此办法,暂时适合此apk,对于其他apk是否适用,有待以后长期的验证才能知道结果。
后来发现,问题依旧:

别的apk,即使是短路径:
Run length=154, command: adb -s hmucaei75ptk7szs install -r /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmpzylriew2/20201202_fengyun_0185BingFengTianXia_gameApp_Android_0.apk
也还是会卡死。
看来不是路径问题。。。
【总结】
此处,至少感觉是
通过把adb总体命令长度减少
从:
adb -s hmucaei75ptk7szs install -r /Users/xxx/dev/xxx/crawler/appAutoCrawler/AppCrawler/task/20201202_fengyun_0192LeiMoChuanShuo/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk
长度:超过240多,感觉快要接近255的限制?了
而减少命令长度:
adb -s hmucaei75ptk7szs install -r /var/folders/gt/5868sbcd1jq4rxvryqhy2_1sz8n0s3/T/tmpq3ypjfgd/20201202_fengyun_0192LeiMoChuanShuo_gameApp_Android_0.apk
长度:150多,不会超过限制?
从而:
当时是解决了问题。
后续感觉,至少是缓解了adb install apk卡死的问题
但是,后续长期运行发现:还是没彻底解决问题。
所以根本原因不是此处命令长度的问题。根本原因暂时未知。
转载请注明:在路上 » 【部分解决】尝试减少adb install整体命令的长度去解决adb install安装安卓apk卡死