Android Studio应用目标API34时执行二进制文件权限问题求助
解决Android API29+执行私有二进制文件"permission denied"问题
优先使用Native库目录存放二进制文件
Android 10(API29)及以上对应用私有目录的执行权限做了严格限制,但/data/data/[包名]/lib/目录是系统允许应用执行二进制的合法路径,打包时会自动将libs/[abi]/下的文件复制到这里,且默认拥有执行权限。
实现步骤:- 将
main二进制文件放到项目的libs/[对应ABI]/目录(比如libs/arm64-v8a/、libs/armeabi-v7a/) - 在代码中获取该文件路径并执行:
String binaryPath = getApplicationInfo().nativeLibraryDir + "/main"; ProcessBuilder processBuilder = new ProcessBuilder(binaryPath); // 可选:设置工作目录、环境变量 processBuilder.directory(getFilesDir()); try { Process process = processBuilder.start(); // 处理进程输出、错误流 } catch (IOException e) { e.printStackTrace(); }
- 将
若需放在应用私有文件目录的处理方式
如果必须将二进制放在getFilesDir()等私有目录,需确保正确设置权限,且仅适用于部分API29设备(API30+可能仍受限):- 确保文件存放在应用私有目录(外部存储的Scoped Storage路径无法执行二进制)
- 通过Java API设置可执行权限(不要依赖shell的
chmod命令,避免权限不足):File binaryFile = new File(getFilesDir(), "main"); // 设置所有者可执行权限 boolean hasExecPerm = binaryFile.setExecutable(true, true); if (!hasExecPerm) { // 权限设置失败,需处理 return; } // 执行二进制 try { new ProcessBuilder(binaryFile.getAbsolutePath()).start(); } catch (IOException e) { e.printStackTrace(); }
关键原因说明
Android 10+的安全变更中,除了Scoped Storage限制外部文件访问,还通过SELinux策略和文件权限模型,禁止应用在私有目录(除lib目录外)执行未签名的二进制文件,普通的chmod操作无法绕过这些系统级限制,因此将二进制放在lib目录是最可靠的方案。
内容的提问来源于stack exchange,提问作者Michael Agan
相关产品推荐
相关产品推荐

