You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:15:41