调用顺序图:

细节描述:
- ActivityThread.main(),如果某个应用进程未启动,Zygote则会调用该函数启动主进程。源码位置:frameworks/base/core/java/android/app/ActivityThread.java
-
ActivityThread.handleBindApplication(),通过消息队列的方式绑定Application。
- ActivityThread.getPackageInfoNoCheck(…),创建LoadedApk对象。
-
LoadedApk.makeApplication(…),创建Application对象,利用反射的方式创建并绑定,如果Application中使用了static{System.loadLibrary(“…”);}的方式加载动态库,那么这时候就会执行以下调用了,当然Activity/Service/BroadcastReceiver/ContentProvider都是利用反射的方式创建的。
- LoadedApk.getClassLoader()
- ApplicationLoaders.getClassLoader(…)
- PathClassLoader(zip, libPath, parent);系统默认加载器加载dex文件。
- BaseDexClassLoader(dexPath, null, libraryPath, parent);
- DexPathList(this, dexPath, libraryPath, optimizedDirectory);
- DexPathList.makeDexElements(…)
- DexPathList.loadDexFile(file, optimizedDirectory);
- DexFile(file);
- DexFile.openDexFile(fileName, null, 0);
- DexFile.openDexFileNative(…)
- Dalvik_dalvik_system_DexFile_openDexFileNative(…),jni实现。源码位置:dalvik/vm/native/dalvik_system_DexFile.cpp
- dvmRawDexFileOpen(…),打开一个未被优化的dex文件。
- dvmOpenCachedDexFile(…),打开被优化的dex文件。
-
dvmDexFileOpenFromFd(optFd, &pDvmDex),从被优化过的dex文件中读入文件内容并存入DvmDex结构体中。
- dexFileParse((u1*)memMap.addr, memMap.length, parseFlags);常见脱壳点之一。
- dvmRawDexFileOpen(…),打开一个未被优化的dex文件。
- addToDexFileTable(pDexOrJar);添加加载的dex文件到hash表中,gDvm.userDexFiles。
- Dalvik_dalvik_system_DexFile_openDexFileNative(…),jni实现。源码位置:dalvik/vm/native/dalvik_system_DexFile.cpp
- DexFile.openDexFileNative(…)
- DexFile.openDexFile(fileName, null, 0);
- DexFile(file);
- DexPathList.loadDexFile(file, optimizedDirectory);
- DexPathList.makeDexElements(…)
- DexPathList(this, dexPath, libraryPath, optimizedDirectory);
- BaseDexClassLoader(dexPath, null, libraryPath, parent);
- PathClassLoader(zip, libPath, parent);系统默认加载器加载dex文件。
- ApplicationLoaders.getClassLoader(…)
-
Instrumentation.newApplication(…),利用反射的方式创建Application
- Class.newInstance()
- Dex.create(ByteBuffer data),源码位置:libcore/dex/src/main/java/com/android/dex/Dex.java
- Dex(ByteBuffer data)构造函数,可在此处脱壳,取出data。
- System.loadLibrary,如果有的话,也是一个native方法。
- JNI_OnLoad(JavaVM* vm, void* /* reserved */),如果声明了该函数则调用否则不调用。
- env->RegisterNatives(clazz,gMethods, sizeof(gMethods)/sizeof(gMethods[0])),动态注册jni。
- JNI_OnLoad(JavaVM* vm, void* /* reserved */),如果声明了该函数则调用否则不调用。
- Dex.create(ByteBuffer data),源码位置:libcore/dex/src/main/java/com/android/dex/Dex.java
- Application.attach(Context context)
- Application.attachBaseContext(Context base)
- Class.newInstance()
- Instrumentation.callApplicationOnCreate(app),Instrumentation对象用于调用application和activity的生命周期。
- Application.onCreate()
- LoadedApk.getClassLoader()
-
MainAcitvity.onCreate(Bundle savedInstanceState)