欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android插件开发初探——基础篇

来源: 开发者 投稿于  被查看 38323 次 评论:268

Android插件开发初探——基础篇


Android插件开发初探

对于Android的插件化其实已经讨论已久了,但是市面上还没有非常靠谱成熟的插件框架供我们使用。这里我们就尝试性的对比一下Java中,我们使用插件化该是一个怎么样的流程,且我们如何将此流程移植到Android框架上去使用。很多代码都是内部资料,不喜勿喷,谢谢~

为什么要插件化?

功能越来越多 代码、安装包越来越大 小的更新也需要重新发布 更新频繁,安装成本太大 用户无法选择性加载需要的模块 ……

插件化的好处

主安装包较小 强制模块化,降低耦合度 减少整体更新的次数 插件可单独静默更新 用户可以有所选择 ……

插件化的要求

没有独立运行的入口 主应用控制,下载、安装、删除、静默升级、打开和关闭 主应用和插件资源共享

安装包的组成

entervcq9xvS2r77fzOW1xLLlvP6jrM2syrG0+MjrTWFwwODQzbLOyv278tXfanNvbrSuss7K/SDKudPDz+DNrLXEYW5kcm9pZDpzaGFyZWRVc2VySWSjrNfK1LTK/b7dubLP7SC4+b7dc2hhcmVkVXNlcklkwLSy6dXSsuW8/iBxdWVyeUludGVudEFjdGl2aXRpZXOy6dXSt/u6z9XiuPZhY3Rpb261xMv509BhY3Rpdml0eaOou/LG5Mv8o6m8tLLlvP4gcXVlcnm3vcq9v8nS1LvxtcOy5bz+tcTCt7620tS8sMq1z9a907/awOC1xMDgw/sgzai5/bzsy/dzaGFyZWRVc2VySWTE3Lm7tcO1vcK3vrbItM7et6i78bXDtb3A4MP7IM2os6O/ydLUyrnTw9K7uPbD6Mr2zsS8/qOoeG1soaJqc29uo6nD6Mr2suW8/r3hubkgY3JlYXRlUGFja2FnZUNvbnRleHQoKSBnZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbigpDQo8cD48c3Ryb25nPravzKy809TYxtXNqMDgPC9zdHJvbmc+PGJyIC8+DQotIEphdmEgv8nS1NPDIENsYXNzTG9hZGVyILavzKy809TYLmphciDW0LXEQ2xhc3POxLz+o6xhbmRyb2lkv8nS1MLwo788YnIgLz4NCi0gUGF0aENsYXNzTG9hZGVyPGJyIC8+DQotIERleENsYXNzTG9hZGVyPC9wPg0KPHA+PHN0cm9uZz6907/awOA8L3N0cm9uZz48L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> package com.plug; public interface InterfacePlug { public String function_01(); public int function_02(int a,int b); }

实现类

import com.plug.InterfacePlug;
public class PlugImpl  implements InterfacePlug{
    @Override
    public String function_01() {
        return null;
    }

    @Override
    public int function_02(int a, int b) {
        return a+b;
    }
}

主应用类

package com.host;

public class MyhostActivity extends Activity {
    public void useDexClassLoader() {
        DexClassLoader cDexClassLoader =
                new DexClassLoader(/mnt/sdcard/Myplugdex.jar, /data/data/com.host, null, this.getClass()
                        .getClassLoader());
        try {
            Class class1 = cDexClassLoader.loadClass(com.plug.PlugImpl);
            InterfacePlug interfacePlug = (InterfacePlug) class1.newInstance();
            int ret = interfacePlug.function_02(12, 13);
            tv.setText( return value : + ret);
        } catch (Exception e) {
        }
    }
}

enter

导出插件包时只能导出实现类,否则会出现

Classref in pre-verified class resolvedtounexpected implementation
重复定义错误

当然,安装包的解析与插件安装远不止于类文件的加载,我们还需要:

不是普通类怎么办? 系统组件如何接收回调? 如何加载资源? PackageInfo处理? Resources的处理? Assets的处理?

动态加载系统组件和资源

PluginLib
enter

PluginHost
enter

PluginTest

enter

我们一个简单的插件框架就如下图所示:
enter

主应用列出安装的Plugins,点击启动对应的PluginActivity
enterAndroidDynamicLoader UI基于Fragment 反射得到Resources 通过uri进行页面跳转

/*
* @author zhoushengtao(周圣韬)
* @since 2015年1月27日 上午14:02:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流学习QQ群:341989536
* @私人QQ:445914891
/

 

用户评论