Wie leite ich stdout/stderr der Android-App mit ADB um?

Wie leite ich stdout/stderr der Android-App mit ADB um?

Ich möchte den Softwareentwicklungsprozess für einige Android-Befehlszeilenanwendungen weiter automatisieren. Vor Jahren hätte ich Busybox auf einem physischen Android-Gerät installiert, mir ein Mikroskop besorgt und angefangen, in Emacs für Android zu tippen. Heute suche ich nach einer bequemeren Möglichkeit zum Programmieren.

Insbesondere möchte ich die Dateideskriptoren stdout und stderr für Android (NDK)-Anwendungen umleiten, ähnlich wie qemu-arm64-static funktioniert.

Weiß jemand, ob das mit ADB möglich ist? Alternativ könnte ich meine Anwendungen als Microservices strukturieren und ADB-Portweiterleitung verwenden. Dabei würde ich aber viele klassische UNIX-Konventionen verlieren.

Ich sehe, dass ADB eine Protokollerfassung für NDK- (log.h) und SDK-Nachrichten (Log.class) hat. Aber leider sehe ich keine klare Möglichkeit, die Host-STDIN auf die STDIN der Android-Gastanwendung umzuleiten.

Vielleicht gibt es eine Möglichkeit, Toybox (mksh) über ADB auszulösen und dorthin benutzerdefinierte SH-Befehle zu senden?

Antwort1

Verschiedene Quellen (zBhttps://stackoverflow.com/a/36561699/340175Undhttps://github.com/android/ndk/issues/671#issuecomment-383890481) empfehlen den Ansatz, der inhttps://codelab.wordpress.com/2014/11/03/how-to-use-standard-output-streams-for-logging-in-android-apps/

Für die Nachwelt folgt der Code in diesem Blog-Beitrag:

static int pfd[2];
static pthread_t thr;
static const char *tag = "myapp";

int start_logger(const char *app_name)
{
    tag = app_name;

    /* make stdout line-buffered and stderr unbuffered */
    setvbuf(stdout, 0, _IOLBF, 0);
    setvbuf(stderr, 0, _IONBF, 0);

    /* create the pipe and redirect stdout and stderr */
    pipe(pfd);
    dup2(pfd[1], 1);
    dup2(pfd[1], 2);

    /* spawn the logging thread */
    if(pthread_create(&thr, 0, thread_func, 0) == -1)
        return -1;
    pthread_detach(thr);
    return 0;
}

static void *thread_func(void*)
{
    ssize_t rdsz;
    char buf[128];
    while((rdsz = read(pfd[0], buf, sizeof buf - 1)) > 0) {
        if(buf[rdsz - 1] == '\n') --rdsz;
        buf[rdsz] = 0;  /* add null-terminator */
        __android_log_write(ANDROID_LOG_DEBUG, tag, buf);
    }
    return 0;
}

Dies beinhaltet das Schreiben und/oder Ändern von Code.

Es gibt einen veralteten Ansatz, der möglicherweise immer noch für einige Emulatoren älterer Android-Versionen funktioniert (ich habe ihn nicht ausprobiert) und in einem Schwesterartikel auf Stack Overflow erläutert wird:https://stackoverflow.com/questions/10531050/redirect-stdout-to-logcat-in-android-ndkIch halte es nicht für sinnvoll, zu versuchen, die Diskussion aus diesem Q&A hier zu reproduzieren, insbesondere da die Entscheidungen von verschiedenen in diesem Thema diskutierten Faktoren abhängen. Bitte aktualisieren Sie dieses Thema, sobald Sie Fortschritte erzielt haben.

verwandte Informationen