Android插件开发初探

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

为什么要插件化?

功能越来越多

代码、安装包越来越大

小的更新也需要重新发布

更新频繁,安装成本太大

用户无法选择性加载需要的模块

……

插件化的好处

主安装包较小

强制模块化,降低耦合度

减少整体更新的次数

插件可单独静默更新

用户可以有所选择

……

插件化的要求

没有独立运行的入口

主应用控制,下载、安装、删除、静默升级、打开和关闭

主应用和插件资源共享

安装包的组成

需要安装的插件

对比一个安装包的组成,我们要处理的东西也就是很多:

主应用可以以Intent方式启动具体的插件,同时带入Map类型参数或者json串参数

使用相同的android:sharedUserId,资源数据共享

根据sharedUserId来查找插件

queryIntentActivities查找符合这个action的所有activity(或其它)即插件

query方式可以获得插件的路径以及实现接口类的类名

通过检索sharedUserId能够得到路径却无法获得到类名

通常可以使用一个描述文件(xml、json)描述插件结构

createPackageContext()

getResourcesForApplication()

动态加载普通类

- Java 可以用 ClassLoader 动态加载.jar 中的Class文件,android可以吗?

- PathClassLoader

- DexClassLoader

接口类

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) {

}

}

}

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

Classref in pre-verified class resolvedtounexpected implementation

重复定义错误

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

不是普通类怎么办?

系统组件如何接收回调?

如何加载资源?

PackageInfo处理?

Resources的处理?

Assets的处理?

动态加载系统组件和资源

PluginLib

PluginHost

PluginTest

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

主应用列出安装的Plugins,点击启动对应的PluginActivity

当然,我们也可以根据此简单的机制来完成一个完整的插件系统。

可以基本完整实现一个Activity

可以继续增加其他组件的插件,完成更多的功能(Service,Receiver,ContentProvider,Application?)

此插件机制的缺点

Manifest中注册的信息由系统控制,因此插件需要权限信息需要预先注册在主程序中。

目前实现有一定的限制,如插件宿主的相互调用、插件间的相互调用

Github上的插件框架,基于Fragment的开源插件框架

/*

* @author zhoushengtao(周圣韬)

* @since 2015年1月27日 上午14:02:22

* @weixin stchou_zst

* @blog http://blog.csdn.net/yzzst

* @交流学习QQ群:341989536

* @私人QQ:445914891

/

android插件框架机制的选择,Android插件开发初探——基础篇相关推荐

  1. Android 插件框架机制之Small

    Android 插件框架机制系列文章: Android 插件框架机制之预热篇 Android 插件框架机制之DroidPlugin 引言 上一篇文章提到过Small,这次就简单说一下Small,这只是 ...

  2. Android插件开发初探——分析篇

    承接上文 Android插件开发初探--基础篇 http://blog.csdn.net/yzzst/article/details/45582315 我们通过使用DexClassLoader能够将c ...

  3. 腾讯零反射全动态Android插件框架Shadow解析

    简介 最近几年,腾讯对于开源事业也是越来越支持,今天要说的就是在腾讯被广泛使用的Shadow框架,一个经过线上亿级用户量检验的反射全动态Android插件框架. 首先,让我们来看一下官方对于Shado ...

  4. Android 插件框架实现思路及原理

    插件框架实现思路及原理 一.技术可行性 a) apk的安装处理流程 i. apk会copy到/data/app: ii. 解压apk中的class.dex,并对其进行优化,获得odex(即JIT).最 ...

  5. Android插件框架VirtualAPK

    VirtualAPK是滴滴出行自研的一款优秀的插件化框架,主要有如下几个特性. 功能完备 支持几乎所有的Android特性: 四大组件方面 四大组件均不需要在宿主manifest中预注册,每个组件都有 ...

  6. 滴滴开源Android插件框架

     登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 查看所有私信查看所有通知 暂没有新通知 返回通知列表 下一条 上一条 分享资讯传PPT/文档提问题写博客传资源创建项目创建代码片 wz ...

  7. 基于Proxy思想的Android插件框架

    本文所有代码托管在Github:android-plugin 意义 研究插件框架的意义在于以下几点: 减小安装包的体积,通过网络选择性地进行插件下发 模块化升级,减小网络流量 静默升级,用户无感知情况 ...

  8. Android 反编译初探-基础篇

    前言 本文目标: 工具:介绍反编译需要用到的工具 原理:反编译基本原理 实践:替换一个未混淆&未加固apk的启动页面 工具 1.Android Studio 版本:Android Studio ...

  9. Android Dialer,Mms(1),高并发系统基础篇

    33.使用ComponentName启动另一个应用的Activity时出现java.lang.SecurityException: Permission Denial的解决方案: 原因分析: 在SDK ...

最新文章

  1. android11和ios,安卓与iOS细节对比:Reno Ace与iPhone 11 Pro Max,结果很意外
  2. [leetcode] 22. Generate Parentheses
  3. Rancher使用--后端流水线
  4. spring security CSRF 问题 Invalid CSRF Token 'null' was found on ......
  5. 变量声明和函数声明的意义详解
  6. CodeForces - 224C. Bracket Sequence (栈模拟)简单做法
  7. nginx-exporter安装使用
  8. rust怎么调整夜晚亮度_买手机时LCD屏和OLED屏怎么选?终于明白了!
  9. html5移动端开发(rem和媒体查询@media)
  10. j2ee不同数据库的驱动和URL写法
  11. python地址簿3.7版本_用python编写地址簿程序的问题
  12. Web前端开发要掌握的技能有哪些?
  13. python apscheduler执行_如何使Python apscheduler在后台运行
  14. java ee jsp程序_JavaEE程序设计及项目开发教程(JSP篇)
  15. 物联网PaaS平台大盘点
  16. 机房服务器配置方案文件,机房搬迁实施方案模版
  17. Windows 下定制黑苹果 USB 驱动教程
  18. JAVA架构之路(设计模式之观察者模式)
  19. const* 和 *const
  20. 学生免费申请JetBrains许可

热门文章

  1. WebService到底是什么?
  2. PM你真的很忙吗?如何进行时间管理
  3. SM30里如何输入物料号自动带出物料描述
  4. SAP PP生产订单相关信息的获取
  5. 会计职业道德教育的途径
  6. 浅谈SAP系统的预测模型与预测公式
  7. SAP 登陆界面菜单文本修改 (Modification of SAP Logon Menu text)
  8. jquery 取对象数组下标_JQuery使用index方法获取Jquery对象数组下标的方法
  9. 选32位 64位 oracle,32位PLSQL配置为64位的Oracle和64位系统
  10. 服务器部署java网站,服务器部署java网站