Android Shell中Flutter Process.run()执行二进制文件权限问题解决方案
解决Android Shell中直接运行二进制文件的权限拒绝问题
问题根源
你的二进制文件必须通过linker64才能运行,核心原因是二进制的ELF解释器路径与Android系统实际的linker路径不匹配。Android的64位动态链接器通常位于/system/bin/linker64(部分高版本Android可能在/apex/com.android.runtime/bin/linker64),但你的二进制编译时可能指定了标准Linux的解释器(比如/lib64/ld-linux-x86-64.so.2),导致系统找不到对应解释器,最终触发权限拒绝类错误(本质是解释器不存在导致的执行失败,系统报错易误导为权限问题)。
验证方法
先确认二进制的解释器路径:
readelf -l your_binary | grep interpreter
如果输出路径不是Android的linker路径,即可印证该问题。
解决办法
方法1:重新编译二进制时指定正确的linker
若有权限重新编译,在编译命令中添加指定动态链接器的参数:
- 针对GCC/Clang:
gcc -o your_binary your_source.c -Wl,--dynamic-linker=/system/bin/linker64
编译后的二进制会直接指向Android的linker,赋予可执行权限后就能像./your_binary一样直接运行。
方法2:用patchelf修改已有二进制的解释器
若无法重新编译,使用patchelf工具修改二进制的解释器路径:
- 将
patchelf工具推送到Android设备(或在电脑上修改后再传输至设备) - 执行修改命令:
patchelf --set-interpreter /system/bin/linker64 your_binary
- 确保二进制拥有可执行权限:
chmod +x your_binary
修改完成后即可直接运行该二进制文件。
额外注意事项
- 使用Flutter的
Process.run()时,需确保指定正确的工作目录(通过workingDirectory参数),或直接使用二进制的绝对路径执行,避免路径错误。 - 部分Android设备的SELinux可能限制二进制执行,若修改解释器后仍有问题,可临时关闭SELinux测试(执行
setenforce 0),但不建议长期关闭,最终需通过调整SELinux规则解决。
内容的提问来源于stack exchange,提问作者Adalat Kumar
相关产品推荐
相关产品推荐

