android替换当前应用的ClassLoder两种方式

第一种:

  只适合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

  --------------------------------反射替换------------------------------

 

转载于:https://www.cnblogs.com/july2015/p/5329797.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值