Android开发系列之动态添加dex(解决app频繁更新问题)

用处

1.解决频繁更新的问题。

java动态添加jar包

在实现android动态添加dex前,我们先来实现java的动态添加jar包,毕竟这是祖先,而且相对也简单些!

准备工作

1.用于把jar添加进Classloader的方法:

	static void addJarToClassLoader(String jarPath) throws NoSuchMethodException, SecurityException, MalformedURLException{
		File libPath = new File(jarPath);// 系统类库路径
		
		File[] jarFiles = libPath.listFiles(new FilenameFilter() {// 获取所有的.jar和.zip文件
			@Override
			public boolean accept(File dir, String name) {
				return name.endsWith(".jar") || name.endsWith(".zip");
			}
		});
		
		if (jarFiles != null) {
			// 从URLClassLoader类中获取类所在文件夹的方法
			// 对于jar文件,可以理解为一个存放class文件的文件夹
			Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
			boolean accessible = method.isAccessible();		// 获取方法的访问权限
			try {
				if (accessible == false) {
					method.setAccessible(true);		// 设置方法的访问权限
				}
				// 获取系统类加载器
				URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
				for (File file : jarFiles) {
					URL url = file.toURI().toURL();
					try {
						method.invoke(classLoader, url);  
						System.out.printf("读取jar文件[name={}]", file.getName());
					} catch (Exception e) {
						System.err.printf("读取jar文件[name={}]失败", file.getName());
					}
				}
			} finally {
				method.setAccessible(accessible);
			}
		}
	}

2.一个被加载的jar包(我自己实现的一个测试包,若不想麻烦,直接下载这个即可。
http://download.csdn.net/download/qq_26914291/10039692
3.一个用于加载jar的主程序。
3.可以正常开发java项目的eclipse。

实现步骤

创建主程序

1.创建一个简单的包含main入口的程序即可。

public static void main(String[] args) {


	}

添加测试包

1.把测试包放在C:/jar/ 文件夹下(路径可以自己定义)。
2.用eclipse->右键菜单->构建路径->添加库->用户库->下一步。
Android开发系列之动态添加dex(解决app频繁更新问题)_第1张图片
3.点击右上角用户库->新建->输入用户库名称(一定要勾选系统库)->点击确定.
Android开发系列之动态添加dex(解决app频繁更新问题)_第2张图片
4.然后用户库列表就会出现刚新建的库->然后添加外部jar->将刚C:/jar/ 下jar测试包添加进去。
Android开发系列之动态添加dex(解决app频繁更新问题)_第3张图片
测试包添加完毕!

调用

1.将jar添加进系统ClassLoader

private final static String jarPath="C:/jar/";

public static void main(String[] args) {
		try {
			addJarToClassLoader(jarPath);
		} catch (Exception e) {
			System.err.println(e);
			e.printStackTrace();
		} 
	}

2.然后调用jar包里函数,再通过打印函数打印返回值

	System.out.println("ischina:"+larson.mtest.jarloadtest.LanguageUtils.ischina("哈哈"));

我这里的测试包实现的是一个判断输入字符是否中文的的方法。
3.打印结果:

ischina:true

OK!调用成功!哈哈!

注意事项

1.addJarToClassLoader(jarPath);函数一定要放在打印函数之前执行.
2.jar路径为C:/jar/ 是一个文件夹路径,不是jar文件路径!
3.添加用户库时,一定要勾选系统库选项,具体原因就是如果不勾选,则测试包包就会编译进当前java项目中。

优点

1.这样动态调用jar包就不用使用麻烦的反射调用了,就跟正常调用函数一样!

小结

1.学会了java如何加载其它的jar文件!
2.学会了以一种更加便捷的方式调用其它jar包文件里的类!

android动态添加dex

准备工作

1.用于将jar包加载进ClassLoader的方法:

void addJarToClassLoader(String jarPath){
File optimizedDexOutputPath = new File(jarPath);
DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(),Environment.getExternalStorageDirectory().toString(), null, getClassLoader());
}

参考文章

1.动态加载dex的两种方式
2.Java中动态加载jar文件和class文件
3.Android动态加载jar/dex
4.深入浅出Android动态加载jar包技术
5.Android动态加载外部jar包及jar包中图片等资源文件
6.Android动态加载入坑指南

你可能感兴趣的:(android开发)