ログインターフェイスの任意の呼び出しをJavaコアライブラリlibcore(Android10)に追加します

I.はじめに

最近、システムカスタマイズ関数(ファイルコンストラクターのパラメーターの出力など)を取得するときに、libcoreのコアコードを変更し、ログ出力を出力する必要があります。Androidはandroid.utils.Logログツールクラスを提供しますが、androidjavaレイヤーのコアライブラリlibcoreでは呼び出すことができません。System.out出力は使用できますが、需要を満たすことはできません。したがって、android.utils.Logの実装を参照し、それをlibcoreコアライブラリに移植して、AndroidシステムのJavaレイヤー全体を呼び出します。

2.ログの移植方法に関する議論

android.utils.Logをlibcoreに移植する方法は2つあります。

(1)既存のクラスにメソッドを追加し、対応するメソッドをネイティブに追加します。このメソッドは比較的簡単です。

たとえば、対応するメソッドをjava.lang.Systemに追加し、対応するjniメソッドを対応するSystem.cに追加します。

(2)libcoreに新しいインターフェイスクラスを追加し、少し複雑なネイティブメソッドを実装します

学習と研究の考え方では、次のオプション2を使用して操作します。

三、移植プロセス

1.java.lang.XLogログクラスを追加します

(1)java.lang.XLogクラスを作成します

libcoreパスの場所:

/home/qiang/lineageOs/libcore/ojluni/src/main/java/java/lang

以下に示すように、ディレクトリに新しいXLogファイルを作成します。

qiang@ubuntu:~/lineageOs/libcore/ojluni/src/main/java/java/lang$ ls -la XLog.java 
-rwxrwxrwx 1 qiang qiang 2124 1月  19 20:50 XLog.java

(2).android.utils.Logの実装を参照して、XLogログメソッドを追加します

ここでは、一般的に使用されるメソッドをいくつか追加します。追加後のコアコードは次のとおりです。

 ...省略
public static native int println_native(int bufID, int priority, String tag, String msg);
  
public static int d(@Nullable String tag, @NonNull String msg) {
     return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
}
 ...省略

(3)コンパイルされたファイルチェーンにXLog.javaファイルを追加します

XLog.javaを/home/qiang/lineageOs/libcore/penjdk_java_files.bpファイルのコンパイル済みファイルチェーンに追加します。次のように:

// Classes which are part of the public API, except where classes and
// members are hidden using @hide javadoc tags.
filegroup {
    name: "openjdk_javadoc_files",
    srcs: [
        ...省略
        "ojluni/src/main/java/java/lang/System.java",
        ///ADD START
        "ojluni/src/main/java/java/lang/XLog.java",
        ///ADD END
        "ojluni/src/main/java/java/lang/ThreadDeath.java",
        ...省略
        
    ],
}
...省略

2.XLog.javajniの実装

(1).libcoreネイティブレイヤーにXLog.cを追加します

XLog.cは、主にXLogのネイティブメソッドを実装します。XLog.cは次のように作成されます。

qiang@ubuntu:~/lineageOs/libcore/ojluni/src/main/native$ pwd
/home/qiang/lineageOs/libcore/ojluni/src/main/native
qiang@ubuntu:~/lineageOs/libcore/ojluni/src/main/native$ ls -la XLog.c 
-rwxrwxr-x 1 qiang qiang 9678 1月  20 00:13 XLog.c

android_util_Log.cppのprintln_nativeの実装を参照し、XLog.cに次の実装を追加します。

static jint java_lang_XLog_println_native(JNIEnv* env, jobject clazz,
        jint bufID, jint priority, jstring tagObj, jstring msgObj)
{
    const char* tag = NULL;
    const char* msg = NULL;

    if (msgObj == NULL) {
        JNU_ThrowNullPointerException(env, "println needs a message");
        return -1;
    }

    if (bufID < 0 || bufID >= LOG_ID_MAX) {
        JNU_ThrowNullPointerException(env, "bad bufID");
        return -1;
    }

    if (tagObj != NULL)
        tag = (*env)->GetStringUTFChars(env,evn,tagObj, NULL);
    msg = (*env)->GetStringUTFChars(env,msgObj, NULL);

    int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);

    if (tag != NULL)
        (*env)->ReleaseStringUTFChars(env,tagObj, tag);
    (*env)->ReleaseStringUTFChars(env,msgObj, msg);

    return res;
}

XLog.cにregister_java_lang_XLogメソッドを追加して、XLogのjniメソッドを登録します。次のように:

void register_java_lang_XLog(JNIEnv* env) {
  jniRegisterNativeMethods(env, "java/lang/XLog", gMethods, NELEM(gMethods));
}

(2)OnLoad.cppでregister_java_lang_XLogを宣言して呼び出します

OnLoad.cppファイルのパスは次のとおりです。

libcore/ojluni/src/main/native/OnLoad.cpp

OnLoad.cppにregister_java_lang_XLogメソッドの宣言と呼び出しを追加します。次のように:

...省略
///ADD START
extern "C" void register_java_lang_XLog(JNIEnv* env);
///ADD END
...省略
extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
  ...省略
  ///ADD START
  register_java_lang_XLog(env);
  ///ADD END
  ...省略
}
...省略

(3)Android.bpのXLog.cファイルをコンパイル済みファイルに追加します

ファイル「/home/qiang/Desktop/test/sourcecode/libcore/ojluni/src/main/native/Android.bp」のコンパイル済みファイルにXLog.cを追加します。次のように追加した後:

filegroup {
    name: "libopenjdk_native_srcs",
    srcs: [
         ...省略
        ///ADD START
        "XLog.c",
        ///ADD END
        ...省略
    ],
}

4つ目は、システムAPIをコンパイルして更新することです。

新しいインターフェイスがシステムに追加されたため、システムAPIを更新するには、次のコマンドを実行する必要があります。

source build/envsetup.sh
make update-api

5、テスト検証

XLogを呼び出して、java.io.Fileコンストラクターでファイルを出力します。次のように:

画像

 

システムフラッシュ、ターミナルビューログをコンパイルします。

C:\Users\Qiang>adb logcat  FILE:D *:s
--------- beginning of system
--------- beginning of main
01-20 19:28:24.077  1373  1518 D FILE    : File==>/system/app/SecurityManager/lib/arm64/wrap.sh
01-20 19:28:24.087   921   921 D FILE    : File==>/proc/self/task
01-20 19:28:24.173  4704  4704 D FILE    : File==>/system/etc/security/cacerts
01-20 19:28:24.173  4704  4704 D FILE    : File==>/data/misc/keychain
01-20 19:28:24.214  4704  4704 D FILE    : File==>/data/user/0/com.android.securitymanager
01-20 19:28:24.214  4704  4704 D FILE    : File==>/data/user_de/0/com.android.securitymanager
01-20 19:28:24.214  4704  4704 D FILE    : File==>/data/user/0/com.android.securitymanager
01-20 19:28:24.223  4704  4704 D FILE    : File==>/system/app/SecurityManager/SecurityManager.apk
01-20 19:28:24.223  4704  4704 D FILE    : File==>/system/app/SecurityManager/SecurityManager.apk
01-20 19:28:24.229  4704  4704 D FILE    : File==>/system/app/SecurityManager/lib/arm64
01-20 19:28:24.229  4704  4704 D FILE    : File==>/system/lib64
01-20 19:28:24.229  4704  4704 D FILE    : File==>/system/product/lib64
01-20 19:28:24.229  4704  4704 D FILE    : File==>/system/vendor/lib64
01-20 19:28:24.229  4704  4704 D FILE    : File==>/system/lib64
01-20 19:28:24.230  4704  4704 D FILE    : File==>/system/product/lib64

公式アカウントに注意を払い、メッセージ「002 」を送信して完全に変更されたコードをダウンロードします

 

前の記事Android10のソースコードの開発とカスタマイズを楽しむ(18)Windowsプラットフォームのadbツールとfastbootツールをコンパイルする

 

画像

WeChatパブリックアカウントをフォローする皆さんを歓迎します

おすすめ

転載: blog.csdn.net/u011426115/article/details/113032671