Как выполнить команду Linux в Android программно?

1

Как и в android (через папку anddroid sdk/tools) из командной строки, мы можем выполнить команду linux shell для доступа к папке mnt folder/data аналогично. (например, cd data ls) теперь, когда команда, которую я хочу выполнить программно в android, как это возможно?


Я использую следующий код для выполнения команды оболочки
Process p = Runtime.getRuntime().exec("cd data");

но это дает мне исключение

java.io.IOException: Error running exec(). Command: [cd, data] Working 
Directory:  null Environment: null


так как я должен пойти на это. Спасибо заранее.
  • 0
    Полезная ссылка в вашем поиске: stackoverflow.com/questions/10277709/…
  • 0
    Я проверил ссылку, но не нашел полезных данных для поиска
Теги:
android-ndk
linux-kernel

4 ответа

6

cd не является командой Linux, это команда, встроенная в оболочку; он изменяет текущий рабочий каталог в контексте этого процесса оболочки. В вашем случае, если команда была успешной, она будет успешна только для дочернего процесса (который скоро закончится) и не повлияет на ваш собственный процесс.

  • 0
    Я не получил именно то, что вы хотите сказать точно
  • 0
    Я хочу сказать, что выполнение команды «cd» не окажет на вас никакого влияния. Причиной этого является Runtime () ... exec () создаст дочерний процесс; даже если бы вы могли заставить работать cd, это не повлияло бы на ваш процесс Android, поэтому оно было бы бесполезно для вашего приложения Android.
Показать ещё 7 комментариев
0

В Android у вашего процесса нет разрешений на чтение файлов в других приложениях /data/data/_other-package-name_ или список его личных файлов в каталоге /data/data/_other-package-name_/files. Но у него есть разрешение на просмотр и чтение файлов в каталоге lib /data/data/_other-package-name_/lib, и вы можете посмотреть конкретный файл в /data/data/_other-package-name_/files, если другой-пакет открыл этот файл как общедоступный.

То есть, если другой пакет делает что-то в соответствии с:

FileOutputStream fos = openFileOutput("public_file", Context.MODE_WORLD_READABLE);
fos.write("hello world".getBytes());
fos.close();

то ваш пакет может прочитать этот файл следующим образом:

byte[] bytes = new byte[100];
FileInputStream fis = new FileInputStream(new File("/data/data/*other-package*/files/public_file"));
int cnt = fis.read(bytes);
fis.close();
Log.d("Two_Libs", new String(bytes, 0, cnt));

Но вы не можете перечислить общедоступные файлы в этом каталоге, чтобы обнаружить их.

0

Чтобы получить путь к папке личных данных приложения, используйте следующее из Java:

File MyData = Ctxt.getDir("Foo");

Где Ctxt - объект контекста, например Activity. Он вернет вам путь, например /data/data/com.activity.networkRequestDetector/app_Foo. Обратите внимание, что чтение/запись /data/data/com.activity.networkRequestDetector/ не рекомендуется в Android - это ваш корневой /data/data/com.activity.networkRequestDetector/ вашего приложения, а не для воспроизведения.

Чтобы открыть файлы из папки данных, используйте что-то вроде этого:

FileInputStream Stm = new FileInputStream(new File(MyData, "Filename.txt"));

В общем, все, что может сделать команда оболочки, тоже может сделать ваше приложение. Команды Shell - это просто программы, которые используют API, как и все остальные.

  • 0
    да, я знаю это, но когда я хочу, чтобы другие данные приложения из моего приложения, то это не будет работать
  • 0
    На некорневом устройстве оно все равно не будет работать. Данные других приложений защищены от ваших прав доступа на уровне ОС. На корневом устройстве просто создайте объект File вокруг абсолютного пути. Серьезно, вам не нужны команды оболочки.
Показать ещё 1 комментарий
0

попробуй это:

Process p = Runtime.getRuntime().exec("cd /data");
  • 0
    Если бы команда была почти чем-нибудь, кроме «cd», ваш ответ был бы хорошим. Однако для CD, в частности, он просто не будет работать, как предполагалось (даже если был внешний двоичный файл CD - хотя его нет).
  • 0
    ты пробовал cd / data ???
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню