title: Writing android app that executes linux commands
body: <p>I have an compiled executable that is supposed to copy itself from the res folder, and into the /data/data/package-name/ folder, and change the permissions, and then execute. Every step completes all the way to the end. The output stream seems to be writing, etc. Except when I go check the file system, nothing has been done. I first tried with 'sh' then with 'su' (I have a rooted Cyanogen rom).</p>
  
  <p>Here is the code:</p>
  
  <pre><code>public class UnexecutableActivity extends Activity {
  
      String executablePath;
      TextView outputView;
      private UnexecutableTask mUnexecutableTask;
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          executablePath = getIntent().getData().getPath();
          System.out.println(executablePath);
          setContentView(R.layout.main);
          outputView = (TextView)findViewById(R.id.outputView);
          try {
              Process process = Runtime.getRuntime().exec("su");
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
          Runnable runexecutable = new Runnable(){
  
              @Override
              public void run() {
                  mUnexecutableTask = new UnexecutableTask();
                  mUnexecutableTask.execute("");
              }
  
          };
  
          runOnUiThread(runexecutable);
  
      }
  
  
      private class UnexecutableTask extends AsyncTask&lt;String, String, String&gt; {
  
  
  
          public UnexecutableTask() {
              super();
          }
  
          @Override
          protected void onPostExecute(String result) {
              super.onPostExecute(result);
              outputView.setText(outputView.getText() + "\n" + executablePath + "converted to ");
          }
  
          @Override
          protected void onPreExecute() {
              super.onPreExecute();
              outputView.setText("About to un-executable " + executablePath + " ...");
          }
  
          @Override
          protected void onProgressUpdate(String... values) {
              super.onProgressUpdate(values);
              outputView.setText(outputView.getText() + "\n" + values[0]);
          }
  
          @Override
          protected String doInBackground(String... params) {
          String bashEscapedPath = executablePath.replace(" ", "\\ ");
          try{
              String[] commands;
              publishProgress("Loading unexecutable...");
              InputStream unexecutableInputStream = getAssets().open("unexecutable");
              FileOutputStream fos = new FileOutputStream(getDir("", MODE_WORLD_WRITEABLE) + "/unexecutable");
               byte[] tmp = new byte[2048];
                  int l;
                  while ((l = unexecutableInputStream.read(tmp)) != -1) {
                      fos.write(tmp, 0, l);
                  }
                  fos.flush();
                  fos.close();
                  unexecutableInputStream.close();
  
              publishProgress("Changing file permissions...");
              commands = new String[] {"/system/bin/chmod","744", getDir("", MODE_WORLD_WRITEABLE) + "/unexecutable"};
              Process process = Runtime.getRuntime().exec("su");
              StringBuffer res = new StringBuffer();
              DataOutputStream os = new DataOutputStream(process.getOutputStream());
              DataInputStream osRes = new DataInputStream(new
                      BufferedInputStream(process.getInputStream()));
              for (String single : commands) {
                 os.writeBytes(single + "\n");
                 os.flush();
                 //publishProgress(String.valueOf(osRes.readByte()));
              }
              os.writeBytes("exit\n");
              os.flush();
              process.waitFor();
  
  
              publishProgress("Performing un-executable...");
              commands = new String[] {"/data/data/" + getPackageName() + "/unexecutable", bashEscapedPath};
              process = Runtime.getRuntime().exec("su");
              res = new StringBuffer();
              os = new DataOutputStream(process.getOutputStream());
              osRes = new DataInputStream(process.getInputStream());
              for (String single : commands) {
                 os.writeBytes(single + "\n");
                 os.flush();
              }
              os.writeBytes("exit\n");
              os.flush();
              publishProgress("Finishing...");
              process.waitFor();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
          return "Success";
      }
  
    }
  </code></pre>
  
  <p>If anyone could fix this up for me, (and hopefully use sh!) I would be eternally grateful.</p>