Writeable and Executable location on Android


Last Updated: 2012-12-10 15:11:49
  1. tsmith1990

    tsmith1990 New Member

    I've compiled a binary using the Android NDK toolchain, and am attempting to deploy it to a device. An application which has been built with the NDK using JNI will then execute this binary via native code. I'm hoping to avoid rooting the device.

    The binary will be used by multiple applications, so I'd like to store it in a shared location, rather than once per application.

    I can't find an appropriate location to deploy this binary to - these are the places I've tried:

    1. /mnt/sdcard - using getExternalStoragePublicDirectory() from the SDK, however the SD card is mounted as noexec, meaning I can't run it.

    2. /system/bin - read-only file system, so can't copy. I can push the file using adb push if I remount /system on the emulator using:

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

      However I'd like to avoid this, as the device would need to be rooted.

    3. /data/local - using adb push, I can push the binary to this location. However, I can't seem to find a way to do this in code (using the Android SDK). The internal storage mechanism points to /data/data/package.

    I've compiled native code which calls this executable, using arm-linux-androideabi-g++ shipped with the NDK toolchain. This works with the binary in /system/bin and /data/local.

    In summary, I'm looking for a location in the Android file system to which I can copy a file from the project /assets folder, which world-executable permissions are possible.

    Advertisement
  2. jonbonazza

    jonbonazza Well-Known Member

    To my knowledge, other than the sdcard (which you have already found is noexec), there is no centralized location for data that can be shared between applications at the user level. This is done for security purposes.
  3. tsmith1990

    tsmith1990 New Member

    The best solution I've found is to store it in private storage for one application, modify the permissions to 755, and then access that copy from all applications.
  4. jonbonazza

    jonbonazza Well-Known Member

    Modifying permissions requires root.

Share This Page