【问题标题】:Android Source: Is fopen() in bionic libc only used for system internal apps?Android 源代码:仿生 libc 中的 fopen() 是否仅用于系统内部应用程序?
【发布时间】:2014-01-15 11:49:33
【问题描述】:

我创建了一个成功执行以下操作的 NDK 应用程序:

#include <string.h>
#include <stdio.h>

#include <android/log.h>


JNIEXPORT jstring JNICALL Java_my_package_NativeAccess_stringFromJNI(
        JNIEnv* env, jobject thiz) {

    char* str = "Native Code!";

    FILE* file = fopen("sdcard/hello.txt","w+");
    if (file == NULL) {
        file = fopen("mnt/sdcard/hello.txt","w+");
        if (file == NULL) {
            file = fopen("storage/sdcard/hello.txt","w+"); 
        }
    }

    if (file == NULL) {
        str = "Native Code! fopen() did not work!";
        __android_log_write(ANDROID_LOG_ERROR, "AAAAAAAA", "file null!");
    }
    else{
        str = "Native Code! fopen() worked!";
        __android_log_write(ANDROID_LOG_ERROR, "AAAAAAAA", "file exists!");
        fputs("HELLO WORLD!\n", file);
        fflush(file);
        fclose(file);
    }


    return (*env)->NewStringUTF(env, str);
}

我在自定义构建的源中启动应用程序。它是最新的 KitKat 版本。那里我只是改变了

/bionic/libc/upstream-freebsd/lib/libc/stdio/fopen.c

通过以下方式:

FILE *
fopen(const char *file, const char *mode)
{


//====================

    fputs ("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n", stdout);

    int uid = getuid();
    int pid = getpid();
    int ppid = getppid();

    fprintf(stdout, "uid = %d", uid);
    fputs ("\n", stdout);
    fprintf(stdout, "pid = %d", pid);
    fputs ("\n", stdout);
    fprintf(stdout, "ppid = %d", ppid);
    fputs ("\n", stdout);
    fputs ("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n", stdout);

//====================



// ... the usual fopen continues here


}

使用自定义构建的 Android 源启动模拟器时,我只能通过 LogCat 获得以下输出:

01-15 06:18:18.400: I/stdout(1417): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
01-15 06:18:18.400: I/stdout(1417): uid = 1001
01-15 06:18:18.400: I/stdout(1417): pid = 1417
01-15 06:18:18.400: I/stdout(1417): ppid = 1217
01-15 06:18:18.400: I/stdout(1417): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

什么时候做

adb shell ps

我明白了

USER      PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
...
root      1217  1     205812 40176 ffffffff b6f395ec S zygote
...
radio     1417  1217  238984 25788 ffffffff b6f3a650 S com.android.phone
...
u0_a1     1697  1217  217744 20236 ffffffff b6f3a650 S com.android.providers.calendar

因此,uid 1001 (== USER u0_a1 ) 不是我的应用程序。

我的应用有 uid 10055:

$ adb shell dumpsys package my.package | grep userId=
    userId=10055 gids=[3003, 1028, 1015]

我的问题是:为什么我的 fopen 本地调用没有被记录,但系统内部调用却被记录了?

谢谢!

【问题讨论】:

    标签: android-ndk android-source libc


    【解决方案1】:

    对于系统进程,stdout/stderr 不会重定向到 logcat,即您发送到那里的任何内容都丢失了(从技术上讲,转到 /dev/null),这就是您看不到任何内容的原因。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多