虽然我以前用android编写了一些小应用程序,但现在我尝试编写一个root应用程序并且在文件权限方面遇到一些问题。
基本上,我的目标是使用Java应用程序操作/ etc / hosts文件。作为我的第一个动作,我使用runtime.exec(“su”)获得了root权限,并尝试使用File()或FileOutputStream()等标准方法打开hosts文件。但是失败了,我的应用程序抛出了以下异常“java.io.FileNotFoundException:/ etc / hosts(Permission denied)”。然后我通过访问shell检查了文件的权限,它就像rw-r - r-- for root。即使它应该使用此权限,我将它从shell更改为777瞧!我的应用程序开始打开文件没有任何问题。 但是,由于android会不时地使用默认版本替换hosts文件,它也会更改文件的权限,并且使用以前的方法,每次我必须从adb更改权限,当然这不是我想要的。所以,一步一步;
- 我尝试了runtime.exec(“chmod 777 / etc / hosts”)方法,这没有任何异常或错误消息。
- 然后我尝试使用File.setWritable()方法,但它在我的andoid系统中不存在,虽然根据javadoc似乎应该是android 2.2。
- 最后,我尝试使用System.setProperty(“user.dir”,“/ etc /”)设置工作目录并使用openFileOutput(“hosts”,MODE_WORLD_WRITABLE),但当然这也不起作用。 现在,我现在都没有任何想法。在android中操作系统文件的方法是什么? 的问候,
答案 0 :(得分:1)
我使用runtime.exec(“su”)
获得了root权限
不是你的java代码。 su的作用是让您以root身份启动独立的本机可执行文件。它不更改现有进程的uid,例如运行代码的dalvik vm。
即使它应该使用此权限,我将它从shell更改为777瞧!我的应用程序开始打开文件没有任何问题。
是的,您从特权进程执行了特权任务,然后您的非特权Java应用程序可以处理后续操作。
但是,由于android会不时地使用默认版本替换hosts文件,它也会更改文件的权限,并且使用以前的方法,每次我必须从adb更改权限,当然这不是我想要的。
这表明自己更改主机文件是一个坏主意,因为你最终可能会与Android进行一场恢复战争(尽管为什么Android会尝试更改位于通常只读文件系统上的文件有点神秘)
在android中操作系统文件的方法是什么?的问候,
简短回答:你没有
答案很长:您需要时间了解Android如何使用它们,并且您在修改后的版本中更改了Android本身的这种行为。 (你可以从文件名来源的grep开始)
答案 1 :(得分:0)
如果你真的必须编辑主机文件(这是一个坏主意,如其他答案中所述)你可以在/ system / etc / hosts下找到它并通过adb pull执行,编辑计算机上的文件,adb remount和adb push。 /分区中的文件使用NAND锁安装,必须由自定义ROM提升,这意味着您的应用程序可能只能使用一个特殊的rom来执行此操作。