为什么要学习这个,动态加载dex,因为学习android插件化必须要了解这个才行。
Android使用Dalvik虚拟机加载可执行程序,所以不能直接加载基于class的jar,而是需要将class转化为dex字节码,从而执行代码。优化后的字节码文件可以存在一个*.jar中,只要其内部存放的是*.dex即可使用。
将class的jar包转化为dex需要用到命令dx(在*\android-sdk\build-tools\version[23.0.1] 或 *\android-sdk\platform-tools下能找到);命令使用方式为:dx --dex --output=output.jar origin.jar,该命令将包含class的origin.jar转化为包含dex的output.jar文件。
Android支持动态加载的两种方式是:DexClassLoader和PathClassLoader,DexClassLoader可加载jar/apk/dex,且支持从SD卡加载;PathClassLoader据说只能加载已经安装在Android系统内APK文件
public void loadDex(View view){
String dexpath = Environment.getExternalStorageDirectory().toString() + File.separator + "output.jar";
File dexOutputDir = getDir("dex", 0);
DexClassLoader loader = new DexClassLoader(dexpath, dexOutputDir.getAbsolutePath(), null, getClassLoader());
Class libProviderClazz = null;
try {
libProviderClazz = loader.loadClass("com.example.DynamicImp");
IDynamic lib = (IDynamic)libProviderClazz.newInstance();
Toast.makeText(MainActivity.this, lib.helloWorld(), Toast.LENGTH_SHORT).show();
} catch (Exception exception) {
exception.printStackTrace();
}
}
参考链接:https://blog.youkuaiyun.com/u013478336/article/details/50734108
http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html