android替换当前应用的ClassLoder两种方式
2016-03-28 17:15
447 查看
第一种:
只适合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
--------------------------------反射替换------------------------------
只适合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
--------------------------------反射替换------------------------------
相关文章推荐
- AndroidAnnotations开发框架使用详解
- 《50 Android Hacks》学习心得二:自定义ViewGroup
- Android Spinner点击选中Item不再调用onItemSelected方法的方案
- android install soft
- 30天入门 Android 开发, Google 与你一起圆梦
- Android 内存泄漏案例和解析
- Android 中的 Service 全面总结
- android include 标签多次调用内部控件
- Android 开发进阶指南
- Android自定义控件(二)
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- android:clipToPadding和android:clipChildren
- android 各种Span使用得当可以用Edittext做一个文本编辑器
- Android - Shared Preference (分享首选项) 具体解释
- 深入理解Android的startservice和bindservice
- Android中Parcelable序列化总结
- Android系统开发教程之Android开发在虚拟机的优化
- 关于在Android Studio中使用Assets目录下的资源的问题
- android 利用PullToRefresh组件利用实现下拉刷新的操作步骤
- Android Studio中安装Genymotion插件