Как запустить упакованный бинарный файл в моем приложении для Android? - PullRequest
4 голосов
/ 27 июля 2011

У меня есть приложение для Android, для которого нужно запустить собственное двоичное приложение, которое я написал. Я уже собрал бинарный файл с помощью ndk и упаковал его в apk под res / raw

Я сделал что-то подобное, чтобы сначала запустить процесс su.

Process process;
process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());

Что мне делать после этого, чтобы запустить бинарный файл из ресурсов? Был еще один вопрос, который предложил использовать AssetManager, но я не понимаю, как это сделать точно. Я проверил некоторые приложения с открытым исходным кодом (android-wifi-tether и т. Д.), В которые включены двоичные файлы, и я нигде не вижу AssetManager в своем источнике и не понимаю, как именно они это делают.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2012

Есть неприятный хакерский способ заставить Android сделать это для вас (что я и делаю, успешно).

Когда приложение установлено, Android скопирует соответствующие библиотеки для вашей архитектуры из libs/$ARCH/libfoo.so в /data/data/$PACKAGE/libs для вас. Хитрость в том, что он будет только копировать файлы вида lib$SOMETHING.so. Это даже сохранит права на выполнение.

Итак, если вы переименуете свой su исполняемый файл в libsu.so, Android сделает всю работу за вас. Затем вы можете найти его, используя пути, доступные в Activity.

Однако, будьте осторожны! Android не предназначен для запуска автономных приложений, и Zygote действительно не ладит с разветвлением. Я обнаружил, что Runtime.exec() имеет условия гонки и может потерпеть крах. Единственный надежный метод, который я нашел, - это использование JNI для реализации небольшой библиотеки, которая выполняет fork и exec, не касаясь каких-либо других данных между fork и exec. У меня был вопрос по этому поводу со всеми деталями, но я не могу его найти.

У меня сейчас нет доступа ни к одному из кодов, но если вы захотите, я могу найти для вас некоторые из них в понедельник.

2 голосов
/ 05 апреля 2013

Добавление к ответу Дэвида Дана, что замечательно, это то, что я использую в конце Android.mk для автоматического переименования двоичного файла. Может быть полезным для других, пытающихся сделать то же самое:

...
LOCAL_MODULE := yourbinarynamehere

include $(BUILD_EXECUTABLE)

all: $(LOCAL_MODULE)
    $(shell (mv libs/$(TARGET_ARCH_ABI)/$< libs/$(TARGET_ARCH_ABI)/lib$<.so))

Обратите внимание на TAB, прежде чем $ (shell ... пробелы не будут работать в соответствии со стандартом GNU Make.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...