Android studio导出jar包,作为插件化jar包的步骤

1、一般会在主工程里面新增一个module,类型为Android Library,命名为dexlibs

Android studio导出jar包,作为插件化jar包的步骤_第1张图片

2、该module里面编写我们的插件内容,比如:

Android studio导出jar包,作为插件化jar包的步骤_第2张图片

3、选择build,make该lib,这样会在该module下的build-》intermediates-》bundles-》debug下会生成一个classes.jar文件。

该文件就是工程编译出来的可用的jar包。但是该jar包只是被java虚拟机使用,而我们的android是davilk或art虚拟机,不能识别java字节码,必须通过dx工具转换一下才能被

DexClassLoader识别

Android studio导出jar包,作为插件化jar包的步骤_第3张图片

Android studio导出jar包,作为插件化jar包的步骤_第4张图片

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();
        }

参考文章:
Android动态加载jar、apk的实现
android动态加载Jar/dex--原创



你可能感兴趣的:(疑难杂症,插件化,android,studio,导出jar,dx)