我试图在 zygote 启动时从 JNI 加载我的 apk。在 android14 上遇到错误
No implementation found for boolean android.util.Log.isLoggable
,但在 android 13 上运行良好。
我发现它已经加载了
libandroid_runtime.log
。实现应该位于那里。
我这是怎么了?
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] Aborting thread:
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] "main" prio=10 tid=1 Runnable
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] | group="" sCount=0 ucsCount=0 flags=0 obj=0x12c021d8 self=0xb400007d57689380
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] | sysTid=8651 nice=-20 cgrp=default sched=0/0 handle=0x7e4ed56448
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] | state=R schedstat=( 569334530 51221982 319 ) utm=41 stm=15 core=2 HZ=100
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] | stack=0x7ff3c32000-0x7ff3c34000 stackSize=8188KB
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] | held mutexes= "abort lock" "mutator lock"(shared held)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #00 pc 005c0a38 /apex/com.android.art/lib64/libart.so (art::DumpNativeStack+108) (BuildId: 8bf95d828d83d33315a6ec6a35ddc35f)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #01 pc 005aa3f4 /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack const+804) (BuildId: 8bf95d828d83d33315a6ec6a35ddc35f)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #02 pc 0093670c /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack const+96) (BuildId: 8bf95d828d83d33315a6ec6a35ddc35f)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #03 pc 00921c1c /apex/com.android.art/lib64/libart.so (art::AbortState::DumpThread const+56) (BuildId: 8bf95d828d83d33315a6ec6a35ddc35f)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #04 pc 0091a9cc /apex/com.android.art/lib64/libart.so (art::Runtime::Abort+888) (BuildId: 8bf95d828d83d33315a6ec6a35ddc35f)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #05 pc 00019198 /apex/com.android.art/lib64/libbase.so (android::base::SetAborter::$_0::__invoke+80) (BuildId: 0f50f9c699c6af5881c3be1df5f8ebf2)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #06 pc 00018720 /apex/com.android.art/lib64/libbase.so (android::base::LogMessage::~LogMessage+352) (BuildId: 0f50f9c699c6af5881c3be1df5f8ebf2)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #07 pc 002f0ca0 /apex/com.android.art/lib64/libart.so (art::ClassLinker::FindClass+7708) (BuildId: 8bf95d828d83d33315a6ec6a35ddc35f)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #08 pc 0063281c /apex/com.android.art/lib64/libart.so (art::JNI<true>::FindClass+656) (BuildId: 8bf95d828d83d33315a6ec6a35ddc35f)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #09 pc 000df254 /system/lib64/libandroid_runtime.so (jniRegisterNativeMethods+68) (BuildId: db8e21c9dd3921811f79cfb920d320bc)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #10 pc 000df1bc /system/lib64/libandroid_runtime.so (android::register_com_android_internal_os_RuntimeInit+68) (BuildId: db8e21c9dd3921811f79cfb920d320bc)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #11 pc 000e3490 /system/lib64/libandroid_runtime.so (android::AndroidRuntime::startReg+64) (BuildId: db8e21c9dd3921811f79cfb920d320bc)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #12 pc 000e31a0 /system/lib64/libandroid_runtime.so (android::AndroidRuntime::start+496) (BuildId: db8e21c9dd3921811f79cfb920d320bc)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #13 pc 00002580 /system/bin/app_process64 (main+1224) (BuildId: af111bda59ddc4b8b33df988040c43b6)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] native: #14 pc 00054580 /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+104) (BuildId: 3d07239ca249ec10f6b9ffcbac96d553)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] (no managed stack frames)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] Pending exception java.lang.UnsatisfiedLinkError: No implementation found for boolean android.util.Log.isLoggable(java.lang.String, int) (tried Java_android_util_Log_isLoggable and Java_android_util_Log_isLoggable__Ljava_lang_String_2I) - is the library loaded, e.g. System.loadLibrary?
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] at boolean android.util.Log.isLoggable(java.lang.String, int) (Log.java:-2)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] at void android.app.Instrumentation.<clinit>() (Instrumentation.java:103)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] at java.lang.Class java.lang.Class.classForName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
04-29 01:35:38.389 8651 8651 F zygote64: runtime.cc:693] at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:607)
Android的好处就是可以去读源码。 这是
android::register_com_android_internal_os_RuntimeInit
:
int register_com_android_internal_os_RuntimeInit(JNIEnv* env)
{
const JNINativeMethod methods[] = {
{"nativeFinishInit", "()V",
(void*)com_android_internal_os_RuntimeInit_nativeFinishInit},
{"nativeSetExitWithoutCleanup", "(Z)V",
(void*)com_android_internal_os_RuntimeInit_nativeSetExitWithoutCleanup},
};
return jniRegisterNativeMethods(env, "com/android/internal/os/RuntimeInit",
methods, NELEM(methods));
}
这是在
android::startReg
中循环调用的众多函数中的第一个:
static const RegJNIRec gRegJNI[] = {
REG_JNI(register_com_android_internal_os_RuntimeInit), // We are here
...
REG_JNI(register_android_util_Log), // This function associates `android.util.Log#isLoggable` with a native function pointer
...
};
出于某种原因(这不是我可以为您重现的内容),您的
FindClass
调用决定记录某些内容,但 register_android_util_Log
尚未有机会注册 android.util.Log#isLoggable
。
如果您想进一步调查这一点,您需要将调试器附加到您的程序并找出
art::ClassLinker::FindClass+7708
内部的堆栈帧决定记录什么内容。