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

  --------------------------------反射替換------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM