Writing Android Applications That Run Linux Commands

I have a compiled executable file that should copy itself from the res folder and into the / data / data / package -name / folder folder, and change the permissions, and then execute. Each step is completed to the end. It seems that the output stream is writing, etc. Except when I go to check the file system, nothing has been done. First I tried "sh" and then with "su" (I have Cyanogen root).

Here is the 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<String, String, String> { 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"; } } 

If anyone could fix this for me (and hopefully use sh!), I would always be grateful.

+4
source share
2 answers

Do not use shell commands. The SDK does not include any shell commands, and you cannot rely on these actions sequentially on different devices. You definitely can't rely on working across devices.}

+1
source
  executablePath = getIntent().getData().getPath(); 

This line gives a null pointer exception for me. Obviously the URI (java.net.Uri) returned by getIntent (). GetData is null. I am trying to get around this and see if I can create a file with the rest of your code.

0
source

All Articles