Написание приложения для Android, которое выполняет команды Linux

У меня есть скомпилированный исполняемый файл, который должен копировать себя из папки res в папку / data / data / package-name / и изменять разрешения, а затем выполнять. Каждый шаг завершается до самого конца. Выходной поток, кажется, пишет и т. Д. За исключением того, что я проверил файловую систему, ничего не было сделано. Сначала я попробовал с «sh», затем с «su» (у меня рутованный Cyanogen rom).

Вот код:

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";
    }

  }

Если бы кто-нибудь мог исправить это для меня (и, надеюсь, использовать sh!), Я был бы бесконечно благодарен.


person Aymon Fournier    schedule 12.08.2010    source источник
comment
Я не очень разбираюсь в pastebin - не могли бы вы сделать ссылку, пожалуйста.   -  person Martin    schedule 12.08.2010
comment
почему бы тебе просто не поместить сюда код? SO поддерживает подсветку синтаксиса и тому подобное.   -  person Ryan Conrad    schedule 12.08.2010
comment
какую версию CM вы используете, потому что chmod не существует в моем / system / bin. его в / system / xbin / - я запускаю 5.0.8   -  person Ryan Conrad    schedule 12.08.2010
comment
ну мой телефон заблокирован, так что теперь у меня больше нет рутированного телефона. Надеюсь, su мне не понадобится?   -  person Aymon Fournier    schedule 12.08.2010
comment
перезагрузил и прошил мой телефон :) Есть идеи?   -  person Aymon Fournier    schedule 13.08.2010


Ответы (2)


Не следует использовать команды оболочки. SDK не включает никаких команд оболочки, и вы не можете рассчитывать на их последовательную работу на всех устройствах. Вы определенно не можете полагаться на работу su на разных устройствах. :}

person hackbod    schedule 12.08.2010
comment
Многие приложения Android требуют наличия root-доступа и очень успешны на рынке Android. Я не думаю, что в этом случае вам даже понадобится su, потому что приложения имеют полный доступ для выполнения записи в каталоге / data / data / app-package. - person Aymon Fournier; 13.08.2010

    executablePath = getIntent().getData().getPath();

Эта строка дает мне исключение с нулевым указателем. По-видимому, URI (java.net.Uri), возвращаемый getIntent (). GetData, равен нулю. Я пытаюсь обойти это и посмотреть, смогу ли я создать файл с остальной частью вашего кода.

person Sean A.O. Harney    schedule 20.12.2011