gpt4 book ai didi

android - Zygote 共享库处理

转载 作者:行者123 更新时间:2023-11-29 02:28:20 27 4
gpt4 key购买 nike

zygote 如何处理 android 中的共享库?Zygote 是 Android 中的一个特殊进程,负责处理每个新应用程序进程的 fork 。这些进程只是普通的 Linux 进程。我们可以将 Zygote 视为设备上启动的每个应用程序和服务的模板进程。它由 Android 运行时启动,同时启动第一个虚拟机 (VM)。然后 VM 调用 Zygote 的 main() 方法,这会导致 Zygote 将所有共享的 Java 类和资源预加载到内存中。它如何与 shaed 库一起使用?

最佳答案

有一次我遇到共享库编译问题,应用程序崩溃并显示以下跟踪日志:

backtrace:
#00 pc 00000000001938f8 /data/app/com.xxxxx.test-1/lib/arm64/libmyNative.so
#01 pc 0000000000002300 /system/bin/linker64 (__dl__ZN6soinfo12CallFunctionEPKcPFvvE.part.22+80)
#02 pc 000000000000294c /system/bin/linker64 (__dl__ZN6soinfo9CallArrayEPKcPPFvvEmb+232)
#03 pc 0000000000005200 /system/bin/linker64 (__dl__Z9do_dlopenPKciPK17android_dlextinfo+264)
#04 pc 0000000000001cbc /system/bin/linker64 (__dl__ZL10dlopen_extPKciPK17android_dlextinfo+48)
#05 pc 0000000000284bc8 /system/lib64/libart.so (art::JavaVMExt::LoadNativeLibrary(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, art::Handle<art::mirror::ClassLoader>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)+824)
#06 pc 00000000002c2e2c /system/lib64/libart.so (art::Runtime_nativeLoad(_JNIEnv*, _jclass*, _jstring*, _jobject*, _jstring*)+700)
#07 pc 00000000000b9528 /data/dalvik-cache/arm64/system@framework@boot.oat

从日志中我们可以了解到这个libmyNative.so是如何在第一次加载的。
1. boot.oat不仅负责加载android框架和资源,还负责加载应用共享库。
2. boot.oat是Java库,会调用原生libart.so加载原生库,Runtime_nativeLoad() -> LoadNativeLibrary()。
3、对于下面的步骤,如果你之前hook过native library,或者你之前自己从android应用程序动态链接过native library,你会有更好的理解。一个自己链接共享库而不是调用 System.loadLibrary() 的例子:

void* lib = dlopen("/data/app/com.xxxxx.test-1/lib/arm64/libmyNative.so", RTLD_LAZY);
void* func_ptr = (void*)dlsym(* lib, "JNI_Onload");

因此在 LoadNativeLibrary() 内部,它执行类似的操作。您可以从 here 检查 LoadNativeLibrary() 的实现。 .

  1. 在本地库加载期间,也会执行部分初始化代码。如果你了解 .so 文件结构,你就会知道有一个 .init_array 部分,其中包括编译器添加的一些初始化函数和你在代码中显式声明的全局构造函数。我遇到的崩溃是在编译器添加的 init 函数之一中发生的。

  2. 我怀疑的一件事是在 LoadNativeLibrary() 内部,它似乎调用了 JNI_Onload(),但据我观察,它没有。因为我试图让 JNI_Onload() 直接返回 -1,所以它不会从那里抛出错误消息,而是在我调用 System.loadLibrary() 时抛出错误消息。这是意料之中的。

03-08 18:10:12.311 14797-14797/com.xxxxx.test E/JNI_OnLoad: System.loadLibrary(myNative)

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.xxxxx.test-2/lib/arm64/libmyNative.so"
at java.lang.Runtime.loadLibrary(Runtime.java:372)
at java.lang.System.loadLibrary(System.java:988)
at com.gemalto.tee.taadmin.TaAdmin.init(TaAdmin.java:86)

关于android - Zygote 共享库处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51000180/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com