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パブリックアカウントをフォローする皆さんを歓迎します