Android APP 启动过程关键点

调用顺序图:

细节描述:

  1. ActivityThread.main(),如果某个应用进程未启动,Zygote则会调用该函数启动主进程。源码位置:frameworks/base/core/java/android/app/ActivityThread.java

  2. ActivityThread.handleBindApplication(),通过消息队列的方式绑定Application。

    1. ActivityThread.getPackageInfoNoCheck(…),创建LoadedApk对象。

    2. LoadedApk.makeApplication(…),创建Application对象,利用反射的方式创建并绑定,如果Application中使用了static{System.loadLibrary(“…”);}的方式加载动态库,那么这时候就会执行以下调用了,当然Activity/Service/BroadcastReceiver/ContentProvider都是利用反射的方式创建的。

      1. LoadedApk.getClassLoader()
        1. ApplicationLoaders.getClassLoader(…)
          1. PathClassLoader(zip, libPath, parent);系统默认加载器加载dex文件。
            1. BaseDexClassLoader(dexPath, null, libraryPath, parent);
              1. DexPathList(this, dexPath, libraryPath, optimizedDirectory);
                1. DexPathList.makeDexElements(…)
                  1. DexPathList.loadDexFile(file, optimizedDirectory);
                    1. DexFile(file);
                      1. DexFile.openDexFile(fileName, null, 0);
                        1. DexFile.openDexFileNative(…)
                          1. Dalvik_dalvik_system_DexFile_openDexFileNative(…),jni实现。源码位置:dalvik/vm/native/dalvik_system_DexFile.cpp
                            1. dvmRawDexFileOpen(…),打开一个未被优化的dex文件。
                              1. dvmOpenCachedDexFile(…),打开被优化的dex文件。

                              2. dvmDexFileOpenFromFd(optFd, &pDvmDex),从被优化过的dex文件中读入文件内容并存入DvmDex结构体中。

                                1. dexFileParse((u1*)memMap.addr, memMap.length, parseFlags);常见脱壳点之一。
                          2. addToDexFileTable(pDexOrJar);添加加载的dex文件到hash表中,gDvm.userDexFiles。

      2. Instrumentation.newApplication(…),利用反射的方式创建Application

        1. Class.newInstance()
          1. Dex.create(ByteBuffer data),源码位置:libcore/dex/src/main/java/com/android/dex/Dex.java
            1. Dex(ByteBuffer data)构造函数,可在此处脱壳,取出data。
          2. System.loadLibrary,如果有的话,也是一个native方法。
            1. JNI_OnLoad(JavaVM* vm, void* /* reserved */),如果声明了该函数则调用否则不调用。
              1. env->RegisterNatives(clazz,gMethods, sizeof(gMethods)/sizeof(gMethods[0])),动态注册jni。
        2. Application.attach(Context context)
          1. Application.attachBaseContext(Context base)
      3. Instrumentation.callApplicationOnCreate(app),Instrumentation对象用于调用application和activity的生命周期。
        1. Application.onCreate()
  3. MainAcitvity.onCreate(Bundle savedInstanceState)

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

滚动至顶部