1、一般会在主工程里面新增一个module,类型为Android Library,命名为dexlibs
2、该module里面编写我们的插件内容,比如:
3、选择build,make该lib,这样会在该module下的build-》intermediates-》bundles-》debug下会生成一个classes.jar文件。
该文件就是工程编译出来的可用的jar包。但是该jar包只是被java虚拟机使用,而我们的android是davilk或art虚拟机,不能识别java字节码,必须通过dx工具转换一下才能被
DexClassLoader识别
4、接着,使用dx工具转换,该工具在Android\sdk\build-tools\,具体的sdk版本,比如我是使用的是\25.0.2,在该文件夹下面就有dx.bat这个可执行文件,把我们的源classes.jar放到该目录下,执行如下命令:
dx --dex --output=loader_dex.jar classes.jar
在该目录下就生成了loader_dex.jar文件。
5、这时候我们在宿主中,就能使用该jar包中的类了。如:
File dexOutputDir = getDir("dex",0);//在data/data/xx包名/下面创建一个app_dex文件夹。
String dexPath = Environment.getExternalStorageDirectory().toString() + File.separator + "loader_dex.jar";//sdcard中的
// 4.1以后不能够将optimizedDirectory(即第二个参数)设置到sd卡目录, 否则抛出异常. 所以我们使用内部存储路径dexOutputDir
DexClassLoader loader = new DexClassLoader(dexPath,dexOutputDir.getAbsolutePath(),null,getClassLoader());
try {
Class clz = loader.loadClass("com.tongxt.mylibrary.ShowToastImpl");
Method method = clz.getDeclaredMethod("showToast", Context.class);
method.invoke(clz.newInstance(), this);
} catch (Exception e) {
e.printStackTrace();
}
参考文章: