Zygote共享库处理

时间:2018-06-23 10:16:51

标签: android

合子如何处理android中的共享库? Zygote是Android中的一个特殊过程,它处理每个新应用程序过程的分支。这些进程只是常规的Linux进程。我们可能会将Zygote视为设备上启动的每个应用程序和服务的模板过程。它由Android运行时启动,该运行时还启动了第一个虚拟机(VM)。然后,VM调用Zygote的main()方法,该方法使Zygote将所有共享的Java类和资源预加载到内存中。与着色库一起工作如何?

1 个答案:

答案 0 :(得分:0)

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

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.对于以下步骤,如果您之前迷上了本机库,或者以前自己亲自从android应用程序动态链接了本机库,您将有更好的理解。一个自己链接共享库而不是调用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函数以及您在代码中显式声明的全局构造函数。我遇到的崩溃是在编译器添加的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:“ / data / app / com.xxxxx.test-2 / lib / arm64 / libmyNative.so”中从JNI_OnLoad返回的JNI_ERR
     在java.lang.Runtime.loadLibrary(Runtime.java:372)
     在java.lang.System.loadLibrary(System.java:988)
     com.gemalto.tee.taadmin.TaAdmin.init(TaAdmin.java:86)

相关问题