adb在背景上运行应用时挂起

时间:2017-02-07 15:01:14

标签: android shell adb command-line-interface

我有一个应该在后台运行的程序。 我尝试使用adb触发它并获得以下行为:

adb shell "app &"
adb shell ps | grep myapp

显示该应用未运行。

adb shell
$app &
$exit

终端没有响应的结果。 在杀死adb进程后,终端被释放,然后检查时:

adb shell ps | grep myapp

我看到该应用正在后台运行。

有人可以解释这种行为吗?如何从命令行运行应用程序并让它通过cli在后台运行?

Android Debug Bridge version 1.0.32 
Revision 9e28ac08b3ed-android

1 个答案:

答案 0 :(得分:1)

您的应用是与ADB连接时生成的外壳的子代。当您退出外壳程序时,您的应用程序将被终止,因为外壳程序将被终止。您应该将应用程序与外壳分离:

使用nohup

adb shell "nohup app &"

使用daemonize(在某些Android系统上可用):

adb shell daemonize app
adb shell toybox daemonize app

并且如果您(像我一样)在使用nohup挂起adb shell命令时遇到麻烦,并且如果daemonize不可用,则可以使用C自己对其进行编程,如下所示:

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <unistd.h>

int main(int argc, char ** argv)
{
  int pid = fork();
  if (pid > 0) {
    printf("Father dies\n");
    return 0;
  }

  /* redirect_fds(): redirect stdin, stdout, and stderr to /dev/NULL */
  (void) close(0);
  (void) close(1);
  (void) close(2);
  (void) dup(0);
  (void) dup(0);

  while (1)
  {
    printf("Child runs silently\n");
    sleep(1);
    /* Do long stuff in backgroudn here */
  }
  return 0; 
}