【问题标题】:Accessing root files (/system, /dev) from a native library in Android application从 Android 应用程序中的本机库访问根文件(/system、/dev)
【发布时间】:2016-09-30 06:58:22
【问题描述】:

我有一个 NATIVE LIBRARY,它将尝试在 Android 设备的 /system、/dev 文件夹中创建文件(使用 open()、fopen() 等)。

现在我已经使用 JNI 和 NDK 将该库与一个 android 应用程序集成。但是在根文件夹中创建文件失败。 我试图从本机库的 sdcard 中创建一个文件,这工作正常。

我既不想将文件打开代码移动到 Android 代码(Java 代码),也不想在 sdcard 中创建文件。我有明确要求在根文件夹本身中创建文件。

【问题讨论】:

  • 那么,在尝试创建文件之前,您是否在代码中执行了su root 或类似内容?
  • @Michael 我试过 Process su = Runtime.getRuntime().exec("su");此命令但它失败说 root 权限被拒绝。我可以通过 adb shell 获得超级用户。
  • 如果您将文件打开操作移至 Java,访问权限不会改变。
  • @AlexCohn 我获得了设备的 root 访问权限。过程 su = Runtime.getRuntime().exec("su");现在正在工作。现在,而不是给出 13 (EACCESS denied) open("/system/abc.txt", RW) 方法返回 30(/system 以只读方式安装)。虽然我在获得“su”后将系统重新安装为读写
  • 不,我不知道为什么你的 /system 仍然是 r/o 挂载的。您可以打开 adb shell 并检查那里实际发生的情况。注意 /system 和 rootfs 是分开挂载的。

标签: android android-ndk java-native-interface root native-code


【解决方案1】:

在最近的 android 版本中,rootfs 和 system 在 init 设置好目录和文件后以只读方式挂载。

为了在系统分区中创建文件,您必须以写访问权限重新挂载它们。因此,您必须以 root 用户身份调用 /system/bin/mount。

根据 /system/bin/mount a toybox 还是 toolbox symlink,挂载系统 rw 的命令会有所不同

如果您无法通过 Runtime.getRuntime().exec("su") 获取 su,您是否在 userdebug 构建中使用由 aosp 生成的 su 二进制文件?如果是这样,我相信您必须成为 shell 用户才能使用它。也许切换到更常用的 su 二进制文件或更新 aosp 文件。

编辑:对于安装系统 rw,您首先需要确定 /system/bin/mount 是指向 toybox 还是工具箱的符号链接,因为它们用于安装系统 rw 的命令会有所不同

ls -l 或 readlink 应该能够轻松回答这个问题。

对于工具箱,

(以 uid(0) 运行)

mount -o remount,rw /system

对于玩具盒,

(以 uid(0) 运行)

mount -o rw,remount -t auto /system

在 Java 中,子进程必须首先请求 su,因为只有 root 用户才能执行挂载命令

【讨论】:

  • 我没有明确地植根设备。但正如你所提到的,我是从 AOSP 源构建操作系统的。您能告诉我如何切换或更新 su 二进制文件吗?
  • 我已经在一个有根的手机中尝试了相同的代码。 open() 命令失败,错误代码为 30(只读文件系统)。早些时候是 13(EACCESS 被拒绝)。我有 root 权限,我正在执行以下命令将系统文件夹挂载为 RW。 "mount -o remount,rw /system"; "chmod 777 /系统";
  • 如果您在自定义系统上工作,您可以专门为您正在构建的应用程序提供必要的访问权限,并避免su的风险。
  • @AlexCohn 可以这样做吗?你知道哪些文件需要修改吗?我看到了以下链接,但它谈到只获得 adb shell 访问权限.. stackoverflow.com/questions/5597139/…
  • 每个应用程序都有一个唯一的uid。您可以简单地为特定文件和/或目录应用 [chown] 以让特定应用程序以 r/w 方式访问它们。但是你仍然需要以root身份重新挂载rootfs,或者你可以选择禁用init后挂载rootfs r/o的步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2017-10-23
  • 2012-05-20
  • 1970-01-01
  • 2021-09-21
  • 2012-10-25
相关资源
最近更新 更多