Android:/data/local/tmp/\* 的权限被拒绝

新手上路,请多包涵

我正在尝试通过 android 应用程序运行 shell 脚本。该脚本有一个命令,它只在设备上运行一个 jar。当我使用 adb 直接在 shell 上运行此命令时,一切正常。但是,当我使用 android 应用程序通过脚本运行它时,对于在 /data/local/tmp 文件夹中创建的文件,我得到了一个权限被拒绝的异常(打开失败:EACCES(权限被拒绝))。谁能指导如何解决这个问题?

这就是我的清单的样子

<manifest ….>
   <uses-sdk …>
    <uses-permission… .>
    …
    <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    …
    <application …>
    …
    </application>
</manifest>

谢谢。

原文由 Harsh Chhatwani 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
1 个回答

8年后 更新

在现代版本的 Android 上,无法运行下载或生成的代码(又名 W^X 违规)。我们只能在 APK(或捆绑包)中嵌入预构建的二进制文件 (使用 jniLibsgradle.build 中的其他设置) 并确保将其提取到本机文件系统( 显式设置 android:extractNativeLibs = “true” )。然后您可以从 getContext().getApplicationInfo().nativeLibraryDir 运行二进制文件。


如果我正确理解了这个场景,您可以即时创建脚本,并使用 /data/local/tmp 作为一个既可公开写入又可执行的简单位置。曾经,这是可能的。但在最新版本的 Android 上,安全性得到了加强。

您的应用程序可以执行 /data/data/${your.package} 下的文件。您可以使用 getContext().getFilesDir() 可靠地获取完整路径。注意还是要用 chmod 500 来保证文件有 可执行 权限。

如果你有一些固定的可执行文件(二进制文件或脚本)必须与你的应用程序一起安装,有一个聪明的技巧可以让系统包安装程序为你处理所有这些:确保文件的名称为“ lib something .so “ 并将其放在 Eclipse 项目根目录下的 /libs/armeabi 目录中。安装后,文件将出现在 getContext().getApplicationInfo().nativeLibraryDir 目录中,并设置了可执行权限。


PS 你不需要 WRITE_EXTERNAL_STORAGE 权限才能工作(也许你需要它来做你的应用程序做的其他事情)。


PPS 您可以从任何地方运行 shell 脚本,包括 /sdcard ,并且您不需要该脚本的可执行权限。相反,使用 sh -c source full.path.to.script

原文由 Alex Cohn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题