Android插件化开发基础之App如何动态加载类

在 Java 里面,我们可以把一些类放到 .jar 文件里面,然后用 ClassLoader 动态加载。例如:

URLClassLoader ucl = URLClassLoader.newInstance(new URL[]  
{new URL("file:/sdcard/files/test.jar")});  
Class clazz = ucl.loadClass("com.test.TestClass");  

但是在 Android 上面,情况有所不同。

 

首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java 的 byte code 的,所以不能直接这么打包,而要用 dx 工具转成 Dalvik byte code 才可以。当然,dx 工具转了之后,jar 包里面就不是 .class 文件了,而是 .dex 文件。关于这一点可以参考我的另外一篇文章:http://blog.csdn.NET/quaful/archive/2010/12/23/6094940.aspx

 

第二个是,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("com.qihoo360.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());  

为什么有这个限制呢?我认为这其实是当前 Android 的一个 bug, 因为 PathClassLoader 会去读取 /data/dalvik-cache 目录下的经过 Dalvik 优化过的 dex 文件,这个目录的 dex 文件是在安装 apk 包的时候由 Dalvik 生成的。例如,如果包的名字是 com.qihoo360.test,Android 应用安装之后都保存在 /data/app 目录下,即 /data/app/com.qihoo360.test-1.apk,那么 /data/dalvik-cache 目录下就会生成 data@app@com.qihoo360.test-1.apk@classes.dex 文件。在调用 PathClassLoader 时,它就会按照这个规则去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照这个规则就会去读 /data/dalvik-cache/sdcard@test.apk@classes.dex 文件,显然这个文件不会存在,所以 PathClassLoader 会报错。

 

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






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 10 2022 年更新来了!

面向 Release Preview 频道的 Windows 10 预览体验成员&#xff0c;微软现已发布 Windows 10 Build 19044.1499。主要修复1.微软修复了阻止某些环绕声音频在 Microsoft Edge 中播放的问题。2.微软修复了使用中文输入法时&#xff0c;一些应用停止工作的意外错误。3.微软修复了在…

python小工具小发明_【kimol君的无聊小发明】—用python写截屏小工具

前言今天我看了一下自己的文件夹&#xff0c;发现了自己写了许多似乎很无聊的代码。于是乎&#xff0c;一个想法油然而生&#xff1a;“生活已经很无聊了&#xff0c;不如再无聊一点叭”。说干就干&#xff0c;那就开一个专题&#xff0c;我们称之为kimol君的无聊小发明。妙…啊…

npm执行命令后无任何响应(windows下)

曾经执行过npm config set prefix 命令&#xff0c; 导致npm的config乱掉了&#xff0c; 找到这个文件.npmrc&#xff0c; 然后删掉就可以了 。 我的.npmrc位置在C:\Users\Administrator下。转载于:https://www.cnblogs.com/josjo/p/6099631.html

职业技能培训

实战技能 精通web容器 Apache、Nginx 精通Redis、Mongodb、Memcache、Hadoop 精通CGI/FastCGI PHP扩展 精通Qt和Webkt 应用技能 gccgdbmakeautoconfSourceInsightvim理论素养 数据库数据结构操作系统算法WEB转载于:https://www.cnblogs.com/heidsoft/p/3418660.html

当代成年人的生活状态......

1 小喵咪举起了它的狙击枪▼2 简直有毒...▼3 哈哈哈哈哈▼4 电焊既视感▼5 请问需要小猫咪吗&#xff1f;▼6 哈哈哈哈哈▼7 一物降一物▼7 数学能有多好玩&#xff1f;▼你点的每个赞&#xff0c;我都认真当成了喜欢

c++ why can't class template hide its implementation in cpp file?

类似的问题还有&#xff1a; why cant class template use Handle Class Pattern to hide its implementation? || why there are linker problems (undefined reference) to my class template? 我出现问题的源码&#xff08;见main.cpp,Stack.h,Stack.cpp&#xff09;&…

Android插件化开发之动态加载技术系列索引

动态加载介绍 在Android开发中采用动态加载技术&#xff0c;可以达到不安装新的APK就升级APP功能的目的&#xff0c;可以用来到达快速发版的目的&#xff0c;也可以用来修复一些紧急BUG。 现在使用得比较广泛的动态加载技术的核心一般都是使用 ClassLoader &#xff0c;后者能够…

C# using static 声明

许多实际的扩展可以通过扩展方法来实现&#xff0c;并非所有实际的扩展都有可以扩展的类型。对于某些场景&#xff0c;简单的静态方法比较适合。为了更容易调用这些方法&#xff0c;可以使用 using static 声明除去类名。例如&#xff0c;如果打开了 System.Console using stat…

PHP性能追踪及分析工具xhprof的安装与使用

PHP性能追踪及分析工具xhprof的安装与使用 对于本地开发环境来说&#xff0c;进行性能分析xdebug是够用了&#xff0c;但如果是线上环境的话&#xff0c;xdebug消耗较大&#xff0c;配置也不够灵活&#xff0c;因此线上环境建议使用xhprof进行PHP性能追踪及分析。 我们今天就简…

python后面空格报错_python中空格和table混用报错原因

python是一门严格遵守缩进的语言&#xff0c;缩进的规则代表着程序的层级关系。我们来看一段代码。class MyForm(Form):value1 StringField(value1)value2 StringField(value2)value3 StringField(value3) #这行用的是Tab缩进submit SubmitField(Submit)learn pytho…

C 语言 int 型乘法溢出问题

2019独角兽企业重金招聘Python工程师标准>>> long l; int a, b; l a*b; 因为 a*b 的结果仍然以 int 型保存, 所以即使 l 为long,仍然会有溢出,并且截去了部分数据.出现问题. 转载于:https://my.oschina.net/simon203/blog/175885

Android插件化开发基础之Java类加载器与双亲委派模型

类加载器 Java虚拟机类加载过程是把Class类文件加载到内存&#xff0c;并对Class文件中的数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的java类型的过程。 在加载阶段&#xff0c;java虚拟机需要完成以下3件事&#xff1a; a.通过一个类的全限定名…

将k8s制作成3D射击游戏,好玩到停不下来,附源码

点击上方蓝字 关注【我的小碗汤】大家好&#xff0c;我是小碗汤&#xff0c;今天演示一个项目&#xff0c;利用Unity做场景、用C#做交互逻辑&#xff0c;将k8s制作成一个3D射击游戏。正好最近在学习Unity&#xff0c;所以利用这个项目开始上手挺合适的。源码、可执行文件可以自…

Struts学习笔记_i18n

1. I18N原理 a) ResourceBundle和Locale的概念 b) 资源文件 c) native2ascii //test.javaimport java.util.Locale; import java.util.ResourceBundle;public class Test {public static void main(String[] args) {ResourceBundle res ResourceBu…

map reduce相关程序

Test_1.java /** * Hadoop网络课程模板程序* 编写者&#xff1a;James*/ import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.co…

用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件

一,LegendForHtml5Programming1.0库件是什么?它是一个javascript库&#xff0c;它模仿了ActionScript的语法&#xff0c;用于html5的开发&#xff0c;目前实现的功能相对较少&#xff0c;还不能称之为引擎&#xff0c;希望将来可以作为html5的开源引擎&#xff0c;为html5开发…

JavaJVM之ClassLoader源码分析

层次结构和类图 ClassLoader层次结构&#xff1a;UML类图&#xff1a;sun.misc.Launcher.ExtClassLoader sun.misc.Launcher.AppClassLoader 显式加载类 在代码中显式加载某个类&#xff0c;有三种方法&#xff1a;this.getClass().getClassLoader().loadClass()Class.forName(…

python打包库_Python 打包自己的库到 PYPI (可pip安装)

背景在我们安装 Python 库的时候&#xff0c;通常我们都是pip install xxx真是又酷炫又方便那么&#xff0c;当我们自己写了一些自认为不错的库&#xff0c;想要分享给大家使用(或者是想要装X时)能不能也能做到这样呢&#xff1f;环境需求已经写好能正常使用的库/方法/项目 (可…