DexClassLoader

DexClassLoader加载自己写的第三方jar包,例如金山毒霸需要加载ksremote.jar。

现在将DexClassLoader加载jar包成果分享一下。
   1.新建Android工程,封装功能java类。
   2.选中需要导出的文件夹,右键选中“Export”->"Java(Jar file)"导出jar文件。
   3.使用dx工具将jar包转换为android 字节码。
      命令:dx  --dex --Output=xx.jar    hello.jar
   4.将dx工具处理的xx.jar拷贝到工程raw目录下。
   5.在工程主Activity的onCreate函数中读取raw下的文件,并存储在当前应用目录。
      我的例子代码:
       InputStream inputStream = getResources().openRawResource(
        R.raw.mtnbinder);
    dexInternalStoragePath = new File(
        getDir(APP_JAR, Context.MODE_PRIVATE), DEX_NAME);
    if (!dexInternalStoragePath.exists()) {
      try {
        dexInternalStoragePath.createNewFile();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    
      FileOutputStream fileOutputStream = new FileOutputStream(
          dexInternalStoragePath);
      CopyFile.copyFile(inputStream, fileOutputStream);
        6.使用DexClassLoader调用jar包。
          我的例子代码:
           final File optimizedDexOutputPath = getDir(APP_JAR,
            Context.MODE_PRIVATE);
        try {
          DexClassLoader classLoader = new DexClassLoader(
              dexInternalStoragePath.getAbsolutePath(),
              optimizedDexOutputPath.getAbsolutePath(), null,
              getClassLoader());
          // com.mtn.binder.HookIPhoneSubInfo
          Class class1 = classLoader
              .loadClass("com.mtn.binder.HookIPhoneSubInfo");
          Method method = class1.getMethod("hook", new Class[] {});
          method.invoke(class1, new Object[] {});

运行之后,就可以看到调用jar包成功。

DexClassLoader,布布扣,bubuko.com

时间: 2024-10-10 14:44:04

DexClassLoader的相关文章

Andorid DexClassLoader的创建过程解析(基于5.0)

做Android插件框架时,经常会用到dex的动态加载,就要直接或间接的使用DexClassLoader,在new DexClassLoader的时候Android系统做了很多工作,下面我们详细分析一下: public class DexClassLoader extends BaseDexClassLoader { public DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath, Class

通过DexClassLoader动态加载代码

动态加载代码,会有多种需求,有的是APK过大,想缩小点:有的是部分代码需要灵活变动,例如视频站点的解析规则. 奉上一个Demo,在这个demo中验证了从dexclassloader加载 1.db 2.,sharedpreference 3.webview 4. so库 5.context 6.传入listener回调 7.加载不同package下的类 欢迎大家下载: http://download.csdn.net/download/ameryzhu/8970167 版权声明:本文为博主原创文章

Android中的类装载器DexClassLoader

http://blog.csdn.net/com360/article/details/14125683 java中,有个概念叫做“类加载器”(ClassLoader),它的作用就是动态的装载Class文件.标准的java sdk中有一个 ClassLoader类,借助这个类可以装载想要的Class文件,每个ClassLoader对象在初始化时必须制定Class文件的路径. 可能有人会问,在写程序的时候不是有import关键字可以引用制定的类吗?为何还要使用这个类加载器呢? 原因其实是这样的,使

Android插件化(二):使用DexClassLoader动态加载assets中的apk

Android插件化(二):使用DexClassLoader动态加载assets中的apk 简介 上一篇博客讲到,我们可以使用MultiDex.java加载离线的apk文件.需要注意的是,apk中的类是加载到当前的PathClassLoader当中的,如果apk文件过多,可能会出现ANR的情况.那么,我们能不能使用DexClassLoader加载apk呢?当然是可以的!首先看一下Doc文档. A class loader that loads classes from .jar and .apk

android DexClassLoader动态加载技术详解

介绍 做项目到一定庞大的时候就会发现方法数太多,安装包根本就装不上去了,这个也不足为奇,我们都知道当方法数目超过65536这个数目限制的时候,挡在2.x的系统上面就会出现无法安装的情况,这个时候动态加载技术就显得非的重要了,我们的项目中为了兼容2.x的手机也是用到了android的动态加载技术,这里我会详细的讲解一下怎么去用,怎么实战,我感觉,空谈理论不如动手来得实在. 实例 下面就通过一个例子反复的说明怎么来实现动态加载,通过不同的方法来调用. 准备工作 1:新建一个java工程(我比较懒我就

DexClassLoader和PathClassLoader类载入机制

0x00 在DexClassLoader和PathClassLoader载入Dex流程一文中,我们分析了dex文件怎样形成了DexFile结构体.本文中解说类载入机制,实际上就是生成ClassObject对象. 我们以DexClassLoader为例.解说类载入机制,PathClassLoader是一样的. 我们在载入类时一般会调用loadClass,那么我们就从loadClass来開始分析. 0x01 DexClassLoader类没有loadClass方法.所以调用的是父类ClassLoad

Android插件化开发之DexClassLoader动态加载dex、jar小Demo

一.温故动态加载ClassLoader机制 如果对Android的ClassLoader加载机制不熟悉,猛戳Android插件化开发动态加载基础之ClassLoader工作机制 http://blog.csdn.net/u011068702/article/details/53248960 二.介绍 我们知道在Android中可以跟java一样实现动态加载jar,但是Android使用德海Dalvik VM,不能直接加载java打包jar的byte code,需要通过dx工具来优化Dalvik

DexClassLoader使用-(1)

可以先参考java的java类加载器. 一.DexClassLoader 一般情况下,我们使用import就可以了,为什么还要使用类装载器呢? import中所引用的类文件有两个特点: 1.一定在存在于本地,当程序运行时需要这个类时,内部类装载器就会自动装载,程序员感知不到这个过程. 2.编译时一定要在现场,否则会因找不到引用文件而不能正常编译. 但是在有的情况下,要用的类不一定满足这些条件,如从运程下载一个类并在本地运行,例子如applet执行的java,另一种是要引用的class文件不方便在

被用坏的DexClassLoader,关于DexClassLoader内存泄露的问题

原因: 目前有两种猜测,第一种就是类加载容易,但是类卸载就不那么容易了,第二种猜测就是类缓存机制,从classloader的运行过程可以分析到有个过程是缓存常用类的,感觉这个过程没法释放,因为他会认为你以后会一直用. 测试内存泄露代码: 可以用DDMS测试下,当你调用GC的时候byte是可以回收的,但是classloader就没法回收了,也许你认为是因为调用了activity的classloader造成的,但是回头想想这个classloader可是整个应用的,除非你关闭应用,否则无法去掉clas