2015-07-15 3 views
3

Как я могу отказаться от долговременного вычисления в собственном коде (на C) на Android, когда пользователь нажимает кнопку «Отмена», не вставляя проверки отмены?Убив долгосрочный код на Android

Для объяснения ограничений:

  • Этот нативный код является слишком сложным для вставки достаточно проверки отмены или информации [1], поэтому этот процесс должен быть принудительно убит прогрессировать.
  • Пользовательский интерфейс Android-приложения должен оставаться включенным (отсюда отдельный процесс), чтобы пользователь мог легко повторить попытку с разными параметрами.
  • Нет необходимости поддерживать более одного такого вычисления за раз.

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

У меня есть решение ниже, но я надеюсь, что есть лучший. Например, если вы разделили службу на дополнительный процесс, используя android:process attribute на <service>, и один поток этого процесса переходит в глубокий вызов JNI, есть способ немедленно убить такой процесс или выйти из него, не вызывая время выполнения, чтобы рассматривать его как неожиданный сбой?


[1] Я пробовал отмену чеков. Это более 70 000 SLOC (3,1 МБ) C, чьи распределения памяти и поток управления сложны; это не было написано с прерыванием в виду. Таким образом, двойная-free() и неиспользуемые аварии в последующей эксплуатации.

ответ

3

Вот что я в настоящее время сделать:

  • В build.gradle: компилировать родной только исполняемый файл, как если бы для командной строки вызова.
    • Волшебные слова для поиска других людей, которые делают это ndk "BUILD_EXECUTABLE".
    • Это имя должно быть названо так, как если бы оно было библиотекой, чтобы убедить инструменты сборки включить его и установщик пакета на устройствах, чтобы распаковать его.
    • Это еще не достижимо в Android Studio Preview NDK support, и я действительно надеюсь, что окончательный релиз оставит эту дверь открытой с некоторым окольным путем.
  • Когда starting the process, скопируйте его в пути, где я могу chmod +x его, сделать это, и Runtime.exec() его (мне нужно только < 1KB из стандартного вывода).
  • Чтобы остановить процесс, просто позвоните по телефону .destroy().

Подтверждение этого является сомнительным: документы NDK говорят о том, как you can build an executable but it won't get installed. Эмпирически, однако, он имеет широкую совместимость с основными устройствами Android, по крайней мере, с v2.1-5.1. Он развернут в widely-used app (100 000 загрузок, ~ 47 000 активных).

Среды, где она терпит неудачу, вероятно, во время бинарных махинаций установки выше, включает в себя:

Смежные вопросы