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

.NET MAUI安卓模拟器调用.armv8文件遇Permission denied问题求解

解决.NET MAUI Android调用ARM64可执行文件Permission Denied问题

核心问题排查与修复

1. 二进制文件复制方式错误(最可能的原因)

你使用StreamReader和StreamWriter处理.armv8二进制可执行文件,这会直接破坏文件内容——文本流会把二进制数据当作文本解析,导致文件损坏,即便权限设置正确也无法执行,甚至触发权限类错误。

修复后的文件提取代码:

private string ExtractFiles()
{
    var assembly = typeof(App).GetTypeInfo().Assembly;

    foreach (var res in assembly.GetManifestResourceNames())
    {
        if (res.Contains(".armv8"))
        {
            using var stream = assembly.GetManifestResourceStream(res);
            // 仅提取文件名,避免资源名带命名空间导致路径嵌套
            string fileName = Path.GetFileName(res);
            string targetFile = Path.Combine(FileSystem.Current.AppDataDirectory, fileName);

            using var outputStream = File.OpenWrite(targetFile);
            stream.CopyTo(outputStream);

            return targetFile;
        }
    }

    return string.Empty;
}

2. 权限设置未生效或权限不足

  • chmod 744仅赋予所有者读/执行权限,建议改为755(所有者读/写/执行,其他用户读/执行),确保当前App进程拥有执行权限。
  • 必须检查chmod命令的执行结果,避免因路径错误等原因导致权限设置失败:
public partial void SetPermissionToFile(string path)
{
    string[] cmd = { "chmod", "755", path };
    var runtime = Java.Lang.Runtime.GetRuntime();
    var process = runtime.Exec(cmd);
    process.WaitFor(); // 等待命令执行完成
    int exitCode = process.ExitValue();
    
    if (exitCode != 0)
    {
        // 输出错误信息用于排查
        var errorReader = new StreamReader(process.ErrorStream);
        string errorMsg = errorReader.ReadToEnd();
        Console.WriteLine($"权限设置失败: {errorMsg}");
    }
}

3. 模拟器架构不匹配

如果你的模拟器是x86/x86_64架构,而.armv8是ARM64(aarch64)的可执行文件,模拟器无法运行该二进制文件——即便权限正确,也会抛出类似Permission Denied的错误。

解决方式:

  • 创建并使用ARM64架构的Android模拟器(创建AVD时选择ARM64系统镜像);
  • 直接在ARM64架构的真机上测试。

4. 冗余权限与目录验证

  • FileSystem.Current.AppDataDirectory对应Android的/data/data/[你的包名]/files,属于App私有目录,无需申请StorageRead/StorageWrite权限——这些权限仅针对外部存储,私有目录访问不需要额外授权,可移除权限申请代码。
  • 提取文件后打印targetFile路径,确认文件存在于预期目录(如/data/data/com.your.app/files/xxx.armv8)。

最终验证步骤

  1. 清理项目并重新编译部署;
  2. 查看调试日志,确认文件复制成功、权限设置返回exitCode=0;
  3. 若仍报错,优先排除模拟器架构问题,换ARM64模拟器或真机测试。

内容的提问来源于stack exchange,提问作者Ramon Brokking

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:01:20