读取root设备中的私有文件(/ data / data文件夹)

时间:2014-03-01 19:10:09

标签: android inputstream root

我需要访问另一个应用的私人文件夹中包含的文件。我已经为我的应用授予了root权限并更改了权限 - 虽然我认为没有必要 - 但是当我尝试从文件中读取时,我得到“许可被拒绝”。

这是代码:

File file = new File("/data/data/other.app/shared_prefs/file.xml");
if(file.exists()) {

  try {
      Runtime.getRuntime().exec("su");
      Runtime.getRuntime().exec("chmod 777 " + file.getAbsolutePath());
      InputStream in = new FileInputStream(file);

      ....
  } catch (IOException e) {
      e.printStackTrace();
  }
}

3 个答案:

答案 0 :(得分:1)

可能你不能这样做,因为android上的每个app都有一个具有唯一权限的用户。

请参阅:http://developer.android.com/guide/topics/security/permissions.html#userid

  

应用程序存储的任何数据都将分配该应用程序的用户ID,而其他软件包通常无法访问。使用getSharedPreferences(String,int),openFileOutput(String,int)或openOrCreateDatabase(String,int,SQLiteDatabase.CursorFactory)创建新文件时,可以使用MODE_WORLD_READABLE和/或MODE_WORLD_WRITEABLE标志来允许任何其他包读取/写文件。设置这些标志时,该文件仍归您的应用程序所有,但其全局读取和/或写入权限已正确设置,因此任何其他应用程序都可以看到它。

答案 1 :(得分:1)

你不能像这样分解su和chmod操作。

此代码:   调用Runtime.getRuntime()EXEC( “ス”)。   Runtime.getRuntime()。exec(“chmod 777”+ file.getAbsolutePath());

不会导致chmod在root shell中执行。每次致电执行人员都会启动一个新流程。

您需要在一个进程中运行所需的所有命令。最简单的方法是将一个shell脚本编写到/ data / data目录中,为您执行这些操作,然后通过sh shell处理器运行它。

请注意,良好的安全措施是在您的应用程序完成后将文件恢复到不可读的状态,这样您就不会永远暴露其他应用程序。

这个答案看起来有你所需要的:Run binary from with root Android Application

答案 2 :(得分:0)

解决


使用此代码解决以运行命令:

public static void runAsRoot(String[] cmds){
   try {
       Process p = Runtime.getRuntime().exec("su");
       DataOutputStream os = new DataOutputStream(p.getOutputStream());
       for (String tmpCmd : cmds) {
           os.writeBytes(tmpCmd+"\n");
       }
       os.writeBytes("exit\nexit\n");
       os.flush();
       p.waitFor();
   } catch(IOException e) {
       e.printStackTrace();
   } catch(InterruptedException e) {
       e.printStackTrace();
   }
}