Android插桩测试如何访问缓存目录?读写files目录报EACCES权限错误如何解决
Android插桩测试私有目录读写权限报错解决方案
问题原因定位
- 上下文调用错误:你当前使用的
InstrumentationRegistry.getInstrumentation().getContext()获取的是测试APK自身的上下文,对应包名是报错信息里的com.some.package.test,测试APK默认不继承主App的权限配置,访问自身私有目录时也会受权限规则限制。 - legacy存储配置失效:你配置的
android:requestLegacyExternalStorage="true"仅对Android 10(API 29)设备生效,Android 11及以上系统该配置会被忽略,分区存储限制依然生效。 - 测试包权限未正确授予:ADB Idea插件默认仅给主App授予权限,不会同步给测试包授予读写权限,导致测试包访问自身私有目录时被拦截。
- 目录未主动创建:你当前代码仅初始化了File对象,未主动创建对应目录,系统自动创建目录时也会触发权限校验。
修复步骤
- 替换上下文调用
将测试代码中的上下文获取逻辑替换为被测应用的上下文,如果你需要操作主App的私有目录,使用如下代码:
// 替换原来的getContext()为getTargetContext() Context con = InstrumentationRegistry.getInstrumentation().getTargetContext();
如果你确实需要操作测试包的私有目录,需要在测试模块的AndroidManifest.xml中单独声明读写权限。
2. 补充权限配置
- 主App和测试模块的Manifest都添加如下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Android 11及以上如果需要访问公共目录再加这个,私有目录不需要 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 如果是Android 11以上测试设备,可执行ADB命令单独给测试包授权:
adb shell pm grant com.some.package.test android.permission.WRITE_EXTERNAL_STORAGE adb shell pm grant com.some.package.test android.permission.READ_EXTERNAL_STORAGE
- 主动创建目录
在操作文件前先确保目录创建成功,补充代码如下:
@Test public void createPDfOk() { Context con = InstrumentationRegistry.getInstrumentation().getTargetContext(); // 先确保files目录存在 File filesDir = con.getFilesDir(); if (!filesDir.exists()) { boolean dirCreated = filesDir.mkdirs(); // 可添加断言确认目录创建成功 assertTrue("目录创建失败", dirCreated); } File f2 = new File(filesDir, "lorem_ipsum.pdf"); File f = new File(filesDir, "out.pdf"); }
- 检查测试运行配置
确保build.gradle中测试运行器配置正确:
android { defaultConfig { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } }
内容的提问来源于stack exchange,提问作者javi Alvarez
相关产品推荐
相关产品推荐

