最新消息:20210917 已从crifan.com换到crifan.org

【部分解决】尝试减少adb install整体命令的长度去解决adb install安装安卓apk卡死

apk crifan 415浏览 0评论
折腾:
【未解决】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
tempfile — Generate temporary files and directories — Python 3.9.1rc1 documentation
tempfile — Generate temporary files and directories — Python 3.9.1rc1 documentation
Generate temporary files and directories using Python
Cross-platform way of getting temp directory in Python – Stack Overflow
How do I copy a file in Python? – Stack Overflow
https://stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python
10.10. shutil — High-level file operations — Python 2.7.18 documentation
其中:
创建临时文件夹:
            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卡死

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
97 queries in 0.189 seconds, using 23.41MB memory