Android动态加载学习

今天看了下动态加载相关的一些东西,记录一下:

一:原理

一听动态加载肯定就和classloader有关,Android中的动态加载自然也不例外。由于Android是采用dalvik虚拟机,所以在Android中可以使用的classloader只有DexClassLoader和PathClassLoader两种了。这两种主要的区别就是DexClassLoader可以加载任何路径的apk/dex/jar,而PathClassLoader只能加载/data/app中的apk,也就是已经安装到手机中的apk。这个也是PathClassLoader作为默认的类加载器的原因,因为一般程序都是安装了,在打开,这时候PathClassLoader就去加载指定的apk(解压成dex,然后在优化成odex)就可以了。

二:动态加载jar过程

1.在app中定义动态加载部分的接口,创建实现该接口的动态加载类,导出该类文件的jar包,利用”..\android_sdk\build-tools\19.1.0“中的dx工具将jar转为dex再打包为jar。(有的文章说是platform-tools目录下的dx,是错的)

2.从网络或其他途径获取需要的jar包,并放在制定目录

3.代码中利用DexClassLoader获取动态加载的类的实例注意需要加载的jar包或者apk放在data/data/包名目录和sd卡都可以,不过:new DexClassLoader(dexPath,dexOutputDirs,null,getClassLoader()); 中的第二参数,dexoutputdirs不能放在"..data/data/包名目录"以外的地方,否则会报错。

4.调用动态加载的类

上面的过程只是最简单的动态加载特定代码,不适用与加载资源和加载完整应用的情形。

三:动态加载资源文件(待续)

主要是反射调用assetmanager的addAssetPath将需要加载的apk中的资源加载进宿主app,然后在加载进的apk中得到资源

 

 

你可能感兴趣的:(Android动态加载学习)