第一種:
只適合jni編程
ContextWrapper --->字段: mBase
rtn ----> ContextImpl
ContextImpl --->字段:mPackageInfo
rtn ---->LoadedApk
LoadedApk --->字段:mClassLoader
----------------------------------------------------替換自己的dexclassLoader,可實現動態加載----------------------------------------------------
-----以下是代碼片段,僅供參考------------------------------------
jclass contextClass = env->FindClass("android/content/ContextWrapper");
jfieldID mBaseFieldID = env->GetFieldID(contextClass, "mBase", "Landroid/content/Context;");
jobject mBase = env->GetObjectField(context, mBaseFieldID);
jclass mBaseClass = env->GetObjectClass(mBase);
jfieldID mPackageInfoFieldID = env->GetFieldID(mBaseClass, "mPackageInfo", "Landroid/app/LoadedApk;");
jobject mPackageInfo = env->GetObjectField(mBase, mPackageInfoFieldID);
jclass mPackageInfoClass = env->GetObjectClass(mPackageInfo);
jfieldID mClassLoaderFieldID = env->GetFieldID(mPackageInfoClass, "mClassLoader", "Ljava/lang/ClassLoader;");
jobject mClassLoader = env->GetObjectField(mPackageInfo, mClassLoaderFieldID);
.....................................................
env->SetObjectField(mPackageInfo, mClassLoaderFieldID, myClassLoader);
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------->>>
第二種:
android.app.ActivityThread ---->靜態方法,反射獲取當前線程 currentActivityThread
Class obj_class = Class.forName("android.app.ActivityThread");
Method method = obj_class.getMethod("currentActivityThread", new Object[] {});
return method.invoke(null, new Object[] {});
currentActivityThread 字段:mPackages --->api <19 可以強轉HashMap 否則 ArrayMap
android.app.LoadedApk = HashMap .get(包名)
android.app.LoadedApk 字段:mClassLoader
--------------------------------反射替換------------------------------