如何阻止Appium推送APK至Android设备时修改文件名
问题原因与解决方案
为什么文件名会被改为appiump.tmp?
Appium的pushFile命令在Android平台的底层实现逻辑导致了这个现象:
- 为避免文件传输过程中的冲突或系统锁定,Appium会先将文件以临时文件名(如
appiump.tmp)上传到设备,之后再尝试将其移动并重命名为你指定的目标文件名。 - 如果重命名操作失败(比如目标路径写入权限不足、Android 10+的存储沙箱限制、或文件系统临时锁定),临时文件会保留在目标目录,而你指定的原文件名文件并未创建成功。
- 另外,Android的媒体扫描服务可能未及时索引新文件,导致系统默认文件管理器看不到原文件,但第三方文件管理器直接读取文件系统,因此能看到临时文件。你提到“程序可定位到原文件名”,大概率是Appium的API返回了操作成功状态,但实际文件系统中并未完成重命名,或是你的程序通过Appium的查询接口获取信息,而非直接访问设备文件系统。
阻止文件名修改的解决方法
1. 确保目标路径拥有足够写入权限
- 对于Android 10及以上版本,
/sdcard目录的写入需要WRITE_EXTERNAL_STORAGE权限。在测试代码中先通过Appium的grantPermissions命令为测试应用授予该权限:driver.grant_permissions(['android.permission.WRITE_EXTERNAL_STORAGE']) - 优先选择无需额外权限的私有目录(如
/data/local/tmp)推送文件,该目录的文件操作更稳定,且不会触发存储权限问题。
2. 手动执行文件重命名
绕过Appium自动重命名的逻辑,先推送临时文件,再通过adb shell命令手动重命名:
# 推送临时文件到设备 driver.push_file('/sdcard/appiump.tmp', source_path='./sideloaded_malicious_file.apk') # 调用adb shell完成重命名 driver.execute_script('mobile: shell', { 'command': 'mv', 'args': ['/sdcard/appiump.tmp', '/sdcard/sideloaded_malicious_file.apk'] })
3. 直接使用adb命令推送文件
跳过Appium的封装,直接调用adb命令推送文件,完全避免临时文件机制:
adb push ./sideloaded_malicious_file.apk /sdcard/
如果在Python测试代码中执行,可以用subprocess模块:
import subprocess subprocess.run(['adb', 'push', './sideloaded_malicious_file.apk', '/sdcard/'], check=True)
4. 触发媒体扫描更新文件索引
如果文件已成功推送但未被安全检测应用识别,可触发Android媒体扫描,让系统索引新文件:
driver.execute_script('mobile: shell', { 'command': 'am', 'args': ['broadcast', '-a', 'android.intent.action.MEDIA_SCANNER_SCAN_FILE', '-d', 'file:///sdcard/sideloaded_malicious_file.apk'] })
内容的提问来源于stack exchange,提问作者user3780373
相关产品推荐
相关产品推荐

