在Android应用程序中从本机库访问根文件(/system,/dev)

在Android应用程序中从本机库访问根文件(/system,/dev),android,android-ndk,java-native-interface,root,native-code,Android,Android Ndk,Java Native Interface,Root,Native Code,我有一个本机库,它将尝试在android设备的/system、/dev文件夹中创建文件(使用open()、fopen()等) 现在,我已经使用JNI和NDK将该库与android应用程序集成。但是在根文件夹中创建文件失败。 我尝试从本机库在SD卡中创建一个文件,效果很好 我既不想将文件打开代码移动到Android代码(Java代码),也不想在SD卡中创建文件。我对在根文件夹中创建文件有明确的要求。在最近的android版本中,在init设置目录和文件后,rootfs和系统以只读方式安装 为了在系

我有一个本机库,它将尝试在android设备的/system、/dev文件夹中创建文件(使用open()、fopen()等)

现在,我已经使用JNI和NDK将该库与android应用程序集成。但是在根文件夹中创建文件失败。 我尝试从本机库在SD卡中创建一个文件,效果很好


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

在最近的android版本中,在init设置目录和文件后,rootfs和系统以只读方式安装

为了在系统分区中创建文件,必须使用写访问权限重新装载它们。因此,您必须以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或toolbox的符号链接,因为它们用于安装系统rw的命令不同

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

对于工具箱

(以uid(0)运行)

装载-o重新装载,rw/系统

对于toybox

(以uid(0)运行)

安装-o rw,重新安装-t自动/系统


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

,因此,在尝试创建文件之前,您是否从代码中执行了
su root
或任何类似的命令?@Michael I trusted Process su=Runtime.getRuntime().exec(“su”);此命令失败,原因是拒绝root权限。我可以通过adb shell获得超级用户。如果将文件打开操作移动到Java,访问权限不会更改。@AlexCohn我获得了对设备的root访问权限。进程su=Runtime.getRuntime().exec(“su”);他现在正在工作。现在,RW方法没有给出一个13(EACCESS denied)open(“/system/abc.txt”),而是返回30(/system是以只读方式装载的)。虽然我在得到“su”No后正在以读写方式重新安装系统,但我不知道为什么您的/系统仍然安装了r/o。您可以打开adb shell并检查实际发生的情况。请注意,/system和rootfs是分开安装的。我没有显式地为设备建立根目录。但是正如你提到的,我是从AOSP源代码构建操作系统的。您能告诉我如何切换或更新su二进制文件吗?我在一个根目录的手机中尝试了相同的代码。open()命令失败,错误代码为30(只读文件系统)。早些时候是13(EACCESS被拒绝)。我拥有root权限,正在执行以下命令以RW的形式装载系统文件夹。“装载-o重新装载,rw/系统”;“chmod 777/系统”;如果您使用的是自定义系统,您可以专门为正在构建的应用程序提供必要的访问权限,并避免su的风险。@AlexCohn是否可以这样做?你知道哪些文件需要修改吗?我看到了下面的链接,但它说的是只能访问adb shell。。每个应用程序都有其独特的功能。您只需对特定文件和/或目录应用[chown],即可让特定应用程序访问这些文件和/或目录。但是您仍然需要将rootfs作为root重新装载,或者您可以选择禁用在init之后装载rootfs r/o的步骤。