zoukankan      html  css  js  c++  java
  • 动态加载dex的两种方式

    DexClassLoader 加载的类是没有组件生命周期的,也就是说即使DexClassLoader通过对dex的动态加载完成了对组件的加载,当系统启动该组件时,还会出现加载类失败的异常。
    有两种方式可以解决上面出现的问题:

    方法一:http://blog.csdn.net/androidsecurity/article/details/8809542,更改系统的classloader使其为自定义的加载器。

    特点:两个dex具有明显的分割线,第一个dex只起启动作用,后面不会出现第一个dex的类加载信息,也就是所谓的“加壳程序”。

    主要点:

    1.替换classloader:RefInvoke.setFieldOjbect("android.app.LoadedApk", "mClassLoader",wr.get(), dLoader);

    2.替换application:RefInvoke.setFieldOjbect("android.app.ActivityThread","mInitialApplication", currentActivityThread, app);

    3.替换contentprovider RefInvoke.setFieldOjbect("android.content.ContentProvider","mContext", localProvider, app);

    方法二:http://www.cnblogs.com/twlqx/p/4716026.html,利用分包处理的方法,将第二个dex的类信息加入到第一个dex的pathclassloader的element中。

    特点:两个dex的类可以互相调用,一般而言,外部dex包含关键的隐藏的类信息。

    主要点:

    1.加载外部dex:

    DexClassLoader dexClassLoader = new DexClassLoader(libPath, sApplication.getDir("dex", 0).getAbsolutePath(), libPath, sApplication.getClassLoader());

    2.合并pathclassloader和dexclassloader的element属性,并赋值给pathclassloader的element

     Object dexElements = combineArray(getDexElements(getPathList(pathClassLoader)), getDexElements(getPathList(dexClassLoader)));

     Object pathList = getPathList(pathClassLoader);  

     setField(pathList, pathList.getClass(), "dexElements", dexElements);  

  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/twlqx/p/4717035.html
Copyright © 2011-2022 走看看