Sunday 20 February 2011

How to get root access and execute commands in your Android application ?



Well, I've tried executing several commands that required root access in my Android application (AutomateIt) and found several partial solutions online (especially this one), which helped me a lot but were still missing something to make them more robust and reusable.
Since I try making things very generic and easy to use, I constructed a class that handles most of the things required to execute commands from your Android application after getting root privileges. All you need to do is extend this class and implement one simple method that returns a list of all the commands you wish to execute (getCommandsToExecute).

The class also provides a static service that can be used to determine whether the application has root access or not. Note that when calling the static service, it actually requests for root access and returns the result to that request.
-->
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import android.util.Log;

public abstract class ExecuteAsRootBase
{
  public static boolean canRunRootCommands()
  {
    boolean retval = false;
    Process suProcess;
    
    try
    {
      suProcess = Runtime.getRuntime().exec("su");
      
      DataOutputStream os = 
          new 
DataOutputStream(suProcess.getOutputStream());
      DataInputStream osRes = 
          new 
DataInputStream(suProcess.getInputStream());
      
      if (null != os && null != osRes)
      {
        // Getting the id of the current user to check if this is root
        os.writeBytes("id\n");
        os.flush();

        String currUid = osRes.readLine();
        boolean exitSu = false;
        if (null == currUid)
        {
          retval = false;
          exitSu = false;
          Log.d("ROOT""Can't get root access or denied by user");
        }
        else if (true == currUid.contains("uid=0"))
        {
          retval = true;
          exitSu = true;
          Log.d("ROOT""Root access granted");
        }
        else
        {
          retval = false;
          exitSu = true;
          Log.d("ROOT""Root access rejected: " + currUid);
        }

        if (exitSu)
        {
          os.writeBytes("exit\n");
          os.flush();
        }
      }
    }
    catch (Exception e)
    {
      // Can't get root !
      // Probably broken pipe exception on trying to write to output

      // stream after su failed, meaning that the device is not rooted
      
      retval = false;
      Log.d("ROOT""Root access rejected [" +
  
          e.getClass().getName() "] : " + e.getMessage());
    }

    return retval;
  }
  
  public final boolean execute()
  {
    boolean retval = false;
    
    try
    {
      ArrayList
<Stringcommands = getCommandsToExecute();
      if (null != commands && commands.size() 0)
      {
        Process suProcess = Runtime.getRuntime().exec("su");

        DataOutputStream os = 
            new 
DataOutputStream(suProcess.getOutputStream());

        // Execute commands that require root access
        for (String currCommand : commands)
        {
          os.writeBytes(currCommand + "\n");
          os.flush();
        }

        os.writeBytes("exit\n");
        os.flush();

        try
        {
          int suProcessRetval = suProcess.waitFor();
          if (255 != suProcessRetval)
          {
            // Root access granted
            retval = true;
          }
          else
          {
            // Root access denied
            retval = false;
          }
        }
        catch (Exception ex)
        {
          Log.e("Error executing root action", ex);
        }
      }
    }
    catch (IOException ex)
    {
      Log.w("ROOT""Can't get root access", ex);
    }
    catch (SecurityException ex)
    {
      Log.w("ROOT""Can't get root access", ex);
    }
    catch (Exception ex)
    {
      Log.w("ROOT""Error executing internal operation", ex);
    }
    
    return retval;
  }
  
  protected abstract ArrayList
<String> getCommandsToExecute();
}

Borneo08

About Borneo08

Author Description here.. Nulla sagittis convallis. Curabitur consequat. Quisque metus enim, venenatis fermentum, mollis in, porta et, nibh. Duis vulputate elit in elit. Mauris dictum libero id justo.

Subscribe to this Blog via Email :

More links

Related Posts Plugin for WordPress, Blogger...