【问题标题】:Writeable and Executable location on AndroidAndroid上的可写和可执行位置
【发布时间】:2012-12-03 19:39:25
【问题描述】:

我使用 Android NDK 工具链编译了一个二进制文件,并尝试将其部署到设备上。然后,使用 JNI 使用 NDK 构建的应用程序将通过本机代码执行此二进制文件。我希望避免生根设备。

二进制文件将被多个应用程序使用,因此我想将其存储在共享位置,而不是每个应用程序一次。

我找不到合适的位置来部署这个二进制文件 - 这些是我尝试过的地方:

  1. /mnt/sdcard - 使用 SDK 中的 getExternalStoragePublicDirectory(),但是 SD 卡安装为 noexec,这意味着我无法运行它。

  2. /system/bin - 只读文件系统,所以不能复制。如果我在模拟器上重新挂载 /system ,我可以使用 adb push 推送文件:

    mount -o rw,remount -t yaffs2 /dev/block/mtd3 /system
    

    但是我想避免这种情况,因为设备需要植根。

  3. /data/local - 使用 adb push,我可以将二进制文件推送到这个位置。但是,我似乎找不到在代码中执行此操作的方法(使用 Android SDK)。内部存储机制指向/data/data/package

我使用 NDK 工具链附带的 arm-linux-androideabi-g++ 编译了调用此可执行文件的本机代码。这适用于 /system/bin/data/local 中的二进制文件。

总而言之,我正在 Android 文件系统中寻找一个位置,我可以将项目 /assets 文件夹中的文件复制到该位置,该位置可以获得全局可执行权限。

【问题讨论】:

标签: android android-ndk filesystems


【解决方案1】:

/data/local/tmp/"/data/data/" + packageName + "/files"

对于直接测试你的目标二进制文件,首先是推荐的。

【讨论】:

  • 不再... app targetSdkVersion 29+ (Android 10+) Removed execute permission for app home directory
  • @ЯрославНестеров 你有适用于 Android 10 的解决方案吗?
  • 我在 Android 10 中使用 /data/local/tmp,它可以工作。
【解决方案2】:

如果可以使用adb,可以准备777权限的目录/data/local/bin。

或者,您可以在私有应用目录(/data/data/your.package.unique.name/files)中创建一个文件,并将文件权限设置为 777 755。

【讨论】:

  • 777 表示其他应用程序可以用恶意软件替换可执行文件;这是不必要的,也是一个非常糟糕的主意。其他人需要能够读取和执行,但不能写入。
  • 接受更正。该文件的权限应设置为 755。
【解决方案3】:

如果你想避免生根设备,那么基本上 SD 卡是你唯一可以假设世界可写的地方


编辑:请注意截至 2014/2015 年 Android 框架的最新变化!。

最好将您的二进制文件作为可安装 APK 的一部分,然后将该二进制文件从 APK 中提取到私有存储中,使其成为全球可执行文件等,并以某种方式公布二进制文件位置,但通常会出现一些问题,具体取决于操作系统版本和供应商

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 2020-10-19
    • 2011-04-06
    • 2013-07-22
    • 1970-01-01
    • 2011-12-09
    • 2016-06-13
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多