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

Android Studio应用目标API34时执行二进制文件权限问题求助

解决Android API29+执行私有二进制文件"permission denied"问题
  • 优先使用Native库目录存放二进制文件
    Android 10(API29)及以上对应用私有目录的执行权限做了严格限制,但/data/data/[包名]/lib/目录是系统允许应用执行二进制的合法路径,打包时会自动将libs/[abi]/下的文件复制到这里,且默认拥有执行权限。
    实现步骤:

    1. 将main二进制文件放到项目的libs/[对应ABI]/目录(比如libs/arm64-v8a/、libs/armeabi-v7a/)
    2. 在代码中获取该文件路径并执行:
      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+可能仍受限):

    1. 确保文件存放在应用私有目录(外部存储的Scoped Storage路径无法执行二进制)
    2. 通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:32:16