首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java 的 byte code 的,所以不能直接这么打包,而要用 dx 工具转成 Dalvik byte code 才可以。当然,dx 工具转了之后,jar 包里面就不 是 .class 文件了,而是 .dex 文件。

第二个是,Android 里面虽然也提供了 URLClassLoader 的实现,但是并不能用。要动态加载其它类,可以用的 Class Loader 有:
DexClassLoader,PathClassLoader,其中,DexClassLoader 可以加载 apk, jar 或者 dex 文件,例如:
复制代码 代码如下:
File jarFile = new File("/sdcard/test.dex");
# if ( jarFile.exists() ) {
DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader());
Class<?> c = cl.loadClass("xiaogang.test.Test");

但是 DexClassLoader 要求指定一个可写的目录,即 DexClassLoader 构造函数的第二个参数,在上例中是 /sdcard/test
这个参数的含义是:directory where optimized DEX files should be written
因为 Dalvik 在加载 dex 文件时,会动态进行优化,DexClassLoader 要求指定优化后 dex 文件存放的位置。

PathClassLoader 的限制要更多一些,它只能加载已经安装到 Android 系统中的 apk 文件,也就是 /data/app 目录下的 apk 文件。其它位置的文件加载的时候都会出现 ClassNotFoundException. 例如: 复制代码 代码如下:
PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/" , ClassLoader.getSystemClassLoader());

由于 PathClassLoader 会去读取 /data/dalvik-cache 目录下的经过 Dalvik 优化过的 dex 文件,这个目录的 dex 文件是在安装 apk 包的时候 由 Dalvik 生成的。例如,如果包的名字是 xiaogang.test,Android 应用安装之后都保存在 /data/app 目 录下,即 /data/app/xiaogang.test-1.apk,那么 /data/dalvik-cache 目录下就会生成 data@app@xiaogang.test-1.apk@classes.dex 文件。在调用 PathClassLoader 时,它就 会按照这个规则去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照这个规则就会去读 /data /dalvik-cache/sdcard@test.apk@classes.dex 文件,显然这个文件不会存在,所 以PathClassLoader 会报错。

在 Google 修正这个问题之前,我们要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加载已安装的 apk 。

更多相关文章

  1. android支付宝客户端html5网页偶尔无法自动关闭问题
  2. Android实现自定义带文字和图片的Button
  3. Android动态加载so文件
  4. Android之JNI和NDK的那些事
  5. 再识Intent-实现调用Android内置浏览器打开网页
  6. Android高手进阶教程(五)之 ----Android(安卓)中LayoutInflater
  7. Android(安卓)环境的配置 以及 模拟器的使用
  8. linux和android端的pthread学习
  9. AndroidManifest.xml文件的作用和简单使用

随机推荐

  1. android 使用contentobserver监听数据库
  2. Android(安卓)GPIO LED 驱动与HAL分析
  3. 详解Android系统启动是如何启动的
  4. 图解 Android(安卓)Handler 线程消息机制
  5. android如何开发流量监控软件
  6. Android(安卓)学习资料
  7. Android编程简单实现拨号器功能的方法
  8. Android(安卓)low memory killer 详解
  9. Android开发指南-框架主题-资源和资产
  10. android 触摸事件、点击事件的区别