Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java /etc/hosts在android中以编程方式进行文件操作_Java_Android_Root - Fatal编程技术网

Java /etc/hosts在android中以编程方式进行文件操作

Java /etc/hosts在android中以编程方式进行文件操作,java,android,root,Java,Android,Root,虽然我以前用android编写过一些小应用程序,但现在我尝试编写一个根应用程序,在文件权限方面遇到了一些问题 基本上,我的目标是使用Java应用程序操作/etc/hosts文件。作为我的第一个操作,我获得了runtime.exec(“su”)的root权限,并尝试用标准方法打开hosts文件,比如使用file()或FileOutputStream()。但未成功,我的应用程序引发了以下异常“java.io.FileNotFoundException:/etc/hosts(权限被拒绝)”。然后我通过

虽然我以前用android编写过一些小应用程序,但现在我尝试编写一个根应用程序,在文件权限方面遇到了一些问题

基本上,我的目标是使用Java应用程序操作/etc/hosts文件。作为我的第一个操作,我获得了runtime.exec(“su”)的root权限,并尝试用标准方法打开hosts文件,比如使用file()或FileOutputStream()。但未成功,我的应用程序引发了以下异常“java.io.FileNotFoundException:/etc/hosts(权限被拒绝)”。然后我通过访问shell检查了文件的权限,就像rw-r--r--根目录一样。即使它应该使用这个权限,我还是把它从shell改成了777,瞧!我的应用程序开始毫无问题地打开文件。 然而,由于android会不时用默认版本替换主机文件,它也会更改文件的权限,并且使用以前的方法,每次我都必须去adb更改权限,当然这不是我想要的。所以,一步一步,

-我尝试了runtime.exec(“chmod 777/etc/hosts”)方法,但在没有任何异常或错误消息的情况下,该方法无法工作

-然后我尝试使用File.setWritable()方法,但它在我的andoid系统中不存在,尽管根据javadoc,它似乎应该是android 2.2

-最后,我尝试使用System.setProperty(“user.dir”,“etc/”)设置工作目录,并使用openFileOutput(“hosts”,MODE\u WORLD\u WRITABLE),但这当然也不起作用。 现在,我没有任何想法了。在android中,操作系统文件的方式是什么? 问候,

我已获得runtime.exec(“su”)的root权限

不是因为你的java代码你没有。su所做的是让您以root用户身份启动一个独立的本机可执行文件。它不会更改现有进程的uid,例如运行代码的dalvik vm

即使它应该使用这个权限,我还是把它从shell改成了777,瞧!我的应用程序开始毫无问题地打开文件

是的,您通过特权进程完成了特权任务,然后您的非特权java应用程序可以处理后续操作

然而,由于android会不时用默认版本替换主机文件,它也会更改文件的权限,并且使用以前的方法,每次我都必须去adb更改权限,当然这不是我想要的

这表明自己更改主机文件是一个坏主意,因为最终可能会与Android发生一场恢复战(尽管为什么Android会尝试更改位于通常只读文件系统上的文件有点神秘)

在android中,操作系统文件的方式是什么?问候,

简短的回答:你没有


长答案:你需要花时间去理解Android是如何使用它们的,你需要在修改版本中改变Android本身的这种行为。(您可以从文件名的源代码grep开始)

如果您确实必须编辑主机文件(这是一个坏主意,如其他答案中所述),您可以在/system/etc/hosts下找到它,并通过adb pull、在您的计算机上编辑文件、adb remount和adb push来完成。/partition中的文件装载有一个NAND锁,必须由一个自定义rom解除该锁,这意味着你的应用程序可能只能使用一个特殊的rom来执行该操作。

你正在修改一些不需要修改的内容。安卓让这一点变得困难,因为如果恶意软件获得对底层操作系统的特权访问,它正是可能尝试做的事情。也许你可以分享更多你想要完成的事情?比我的回答更好,我的回答是“啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊许多其他人试图包含其内容的网站。但Android并不适合定制。正如Chris所说,在智能手机上做这样的事情可能有很多原因,但让我澄清一下我的目标;不幸的是,我的国家有一个荒谬的互联网接入政策,在很多情况下,这个政策有时可以被称为审查制度。因为,有时大型网站的一些ip块在没有声明任何原因或错误(!)的情况下被禁止,所以即使是非超级用户也会用ip主机匹配的静态声明来更改主机文件。因此,你的评论不太可能,尝试做不被允许的事情不是为了做坏事,而是为了获得自由;)Chris,实际上我在上面写的这个su技巧是在一个论坛上搜索如何编写根android应用程序时发现的,因为我的手机误导我说“我获得了超级用户权限”,我盲目地相信它,认为我现在是手机的上帝,但这并没有多大意义。尽管如此,关于我的第一个目标——根应用程序编写的最佳实践——我仍然无法到达终点,您建议的方法将是我关于这个主机文件问题的一个起点。再次非常感谢。