Есть ли способ избежать уничтожения исполняемого файла, запускаемого adb, при каждом переподключении? - PullRequest
0 голосов
/ 24 марта 2019

В настоящее время я запускаю исполняемый файл на своем мобильном телефоне, используя оболочку adb (для двоичного файла требуются разрешения пользователя «shell»). Я хочу, чтобы процесс продолжался в фоновом режиме как можно дольше, но процесс прекращается каждый раз, когда я отсоединяю USB-шнур.

ОС тестирующего устройства является неофициальной версией LineageOS / Android 8.1.

Я пробовал:

  • запуск исполняемого файла со всеми комбинациями «nohup» и «> / dev / null 2> / dev / null </ dev / null &» </li>
  • для перехвата и обработки каждого возможного сигнала в самом исполняемом файле
  • чтобы отключить процесс как демон
  • все вышеперечисленное в совокупности

Мой текущий код следующий, скомпилированный в стандартный NDK-проект с конфигурацией CMake «add_executable (libDaemonize.so Daemonize.c)» и выполненный в оболочке adb с "nohup /data/app/org.app.name/lib/arm/libDaemonize.so> / dev / null 2> / dev / null </ dev / null &". Имя "lib ***. So" необходимо для автоматической упаковки двоичного файла в apk и установки его на устройство с исполняемыми разрешениями. </p>

/*Based on https://stackoverflow.com/a/17955149/11250128*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <syslog.h>

void INThandler(int);

static void skeleton_daemon()
{
    pid_t pid;

    /* Fork off the parent process */
    pid = fork();

    /* An error occurred */
    if (pid < 0)
        exit(EXIT_FAILURE);

    /* Success: Let the parent terminate */
    if (pid > 0) {
        syslog (LOG_NOTICE, "From starter: PID: %d, PPID: %d\n", getpid(), getppid());
        exit(EXIT_SUCCESS);
    }
    /* On success: The child process becomes session leader */
    if (setsid() < 0)
        exit(EXIT_FAILURE);

    /* Catch, ignore and handle ALL signals */
    int i;
    for(i=1; i<32; i++) {
        signal(i, INThandler);
    }

    /* Fork off for the second time*/
    pid = fork();

    /* An error occurred */
    if (pid < 0)
        exit(EXIT_FAILURE);

    /* Success: Let the parent terminate */
    if (pid > 0)
        exit(EXIT_SUCCESS);

    /* Set new file permissions */
    umask(0);

    /* Change the working directory to the root directory */
    /* or another appropriated directory */
    chdir("/");

    /* Close all open file descriptors */
    int x;
    for (x = sysconf(_SC_OPEN_MAX); x>=0; x--)
    {
        close (x);
    }

    /* Open the log file */
    openlog ("testdaemon", LOG_PID, LOG_DAEMON);
}


int main()
{
    skeleton_daemon();

    while (1)
    {
        syslog (LOG_NOTICE, "Daemon running. PID: %d, PPID: %d\n", getpid(), getppid());
        sleep (1);
    }

    syslog (LOG_NOTICE, "Daemon terminated.");
    closelog();

    return EXIT_SUCCESS;
}

/*Define signal handlers to find out what signal kills us */
void INThandler(int sig)
{
    syslog(LOG_CRIT, "Daemon received Signal %d", sig);
}

Все вызовы выполняются успешно и работают как положено (например, демон, принимающий init / pid 1 в качестве родителя), но как только кабель USB отключается, приложение прекращает печать в системный журнал.

Мое предположение заключается в том, что система Android активно убивает процесс, но ни журналы Adbd (активированные через «setprop persist.adb.trace_mask»), ни после поиска в источнике Adb я не нашел никаких доказательств этого.

Я чувствую, что скучаю по чему-то очевидному. Спасибо за ваши идеи.

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