我正在尝试通过 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 许可协议
8年后 更新
在现代版本的 Android 上,无法运行下载或生成的代码(又名 W^X 违规)。我们只能在 APK(或捆绑包)中嵌入预构建的二进制文件 (使用 jniLibs 和 gradle.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
。