Android plugin插件化开发初试

这次尝试是根据别人的文章来完成的(参考文章在末尾),本文主要在记录这次尝试过程,直接来说下实现步骤。

1,创建测试工程,接口,实现类


  • 接口
    package com.jianbo.demoone.plug;

    import android.content.Context;

    public interface IToast {
        void showToast(Context context,String message);
    }
  • 实现类
package com.jianbo.demoone.plug;

    import android.content.Context;
    import android.widget.Toast;

    public class ToastImpl implements IToast {
        @Override
        public void showToast(Context context, String message) {
            Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
        }
    }  

2,在app的build.gradle创建task,将ToastImpl导出为Jar包,删除项目ToastImpl类


  • task,在studio 命令窗口输入gradlew makeJar,生成Jar位置(app/build/libs/origin.jar)
task makeJar(type: org.gradle.api.tasks.bundling.Jar) {
    //删除存在的
    delete 'com/jianbo/demoone/plug/origin.jar'
    //指定生成的Jar名
    baseName 'origin'
    //设置拷贝的文件
    from('build/intermediates/classes/debug/com/jianbo/demoone/plug/ToastImpl.class')
    //打进jar包后的文件目录
    into('com/jianbo/demoone/plug/')
}

3,通过sdk中dx的命令,得到内含class.dex的output.jar


在命令行下进入 SDK下的build-tools\21.0.2下(dx所在位置),执行dx –dex –output=output.jar origin.jar

4,测试,把得到的output.jar 放到手机sd卡跟目录下(sdcard/output.jar)


5,写java代码测试


//                dexOutputDir解压后的dex存放位置,此位置一定要是可读写且仅该应用可读写(安全性考虑),
//              所以只能放在data/data下。本文getDir("dex1", 0)会在/data/data/**package/下创建一个名叫”app_dex1“的文件夹
//              ,其内存放的文件是自动生成output.dex;如果不满足条件
 File dexOutputDir = getDir("dex1", 0);
                String dexPath = Environment.getExternalStorageDirectory().toString() + File.separator + "output.jar";
                DexClassLoader loader = new DexClassLoader(dexPath,
                    dexOutputDir.getAbsolutePath(),
                    null, getClassLoader());
                try {
                    Class clz = loader.loadClass("com.jianbo.demoone.plug.ToastImpl");
                    IToast impl = (IToast) clz.newInstance();
                    impl.showToast(MainActivity.this,"我是一个外部的实例");
                } catch (Exception e) {
                }

6,添加相应的文件权限,调用后会显示 “我是一个外部的实例”的Toast。


本文是完全参考 http://blog.csdn.net/u013478336/article/details/50734108 实现的。
有具体的细节疑问,请移步。

猜你喜欢

转载自blog.csdn.net/ecliujianbo/article/details/71173265