安卓应用程序插件化开发框架 -AAP Framework
介绍
这个框架的初衷,是为了方便让程序模块化、插件化,将一个apk应用拆分为多个apk。
不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。
在这里我会以腾讯微信为例,如何使用这个框架。
(腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,结果就是每次插件的更新,都必须以整个程序的更新为代价)
都能干啥
框架的思想,主要是通过apk清单文件中的sharedUserId属性来吧多个apk融合为单一的dalvik虚拟机,也就是融合为一个进程,这样就变相逾越了android框架中不同apk权限不同无法互通的鸿沟(rpc啦什么的其它的毕竟不如这个来的实在)。 从
最简单的皮肤插件到复杂的涉及数据库的拓展功能,从普通activity跳转到把插件的activity转变为view并附加到主程序中的拓展功能,都是可以通过本框架来实现的,当然,本框架只是提供了一种途径,如何编码还得靠自己。
本人能力有限,可能有一些错误、疏漏或者不足之处,请不吝指教,我的博客地址在左下角,或者我的邮箱,都可以联系到我。
ps:下面会以腾讯微信为例,这里声明一下,本人没有对微信安卓客户端进行任意形式的反编译与破解工作,只是看球半天进行简单的猜测而已。
框架结构
本插件框架由三个包组成:
- org.igeek.android.pluginframework 这个包种类是框架的主要操作类
- PluginBuilder 组装插件
- PluginDescription 组装用户自定义的插件描述
- PluginInvoke 插件功能调用
- PluginSearch 查找插件
- org.igeek.android.pluginframework.annotation 未来可能会考虑使用注解
- PluginDescription 用于用户自定义描述类的注解
- PluginFeature 用于插件类的注解
- PluginMethod 用于插件类方法的注解
- org.igeek.android.pluginframework.beans 框架内部使用的一些beans
- Plugin 插件包
- PluginFeature 插件类
- PluginFeatureMethod 插件方法
- org.igeek.android.pluginframework.util 一些工具类
- XMLParse 插件包
如何使用
以腾讯微信为例,虽然从表面来看,它是插件化的多种功能的一种集成。
这是微信的插件管理界面,可以卸载安卓,但这些都是虚的,可能只是把服务关了,并非真正的卸载
主程序(APK)
- 、主程序清单
首先为工程想好一个名字,并在清单中加入sharedUserId属性,属性值就是想好的那个名字,例如微信:com.qq.weixin
1
|
< strong >android:sharedUserId="com.qq.weixin"</ strong >
|
- 、为插件描述写一个类
这就是插件描述首先在主程序中单独建立一个包,并写一个类,这个类相当于一个bean,具有相应的插件描述信息的字段,如微信,那么这个bean的字段就有 插件名:漂流瓶 插件logo:那个人头 插件描述:描述信息...
这个类在主程序中不会很多的使用,只会读取框架返回的插件的bean。
- 、引入本框架的jar包或导入源码
正式编码时,可在任何地方调用框架。具体步骤是这样的
1、查找插件 本框架是根据sharedUserId来查找插件。它首先会根据自身apk的sharedUserId值来查找系统中具有相同属性的包并加载。
- ��以说,插件apk的sharedUserId值也应与主程序相同
1
2
3
4
5
6
7
8
9
|
//首先,就是查找插件
PluginSearch psearch= new PluginSearch();
//第一次获得的是简要的插件描述
List<Plugin> plugins=psearch.getPlugins( this );
//然后将插件再组装一下
PluginBuilder pbuilder= new PluginBuilder( this );
//将用户所定义插件描述融合进去
plugins=pbuilder.buildPluginsDescrition(plugins);
|
这样就把所有插件找到手了,很简单吧?
1、调用插件 找到插件后肯定是调用,最简单应用,就是靠Button按钮来调用
比如微信的摇一摇,点了它就触发框架的插件调用
1
2
3
4
5
6
7
8
9
10
11
|
@Override
public void onClick(View v) {
//新建一个插件调用类
PluginInvoke pi= new PluginInvoke(AndroidPluginFrameworkActivity. this );
//这是真正的调用
//三个参数,第一个是Plugin类型,第二个是PluginFeature,第三个PluginFeatureMethod
pi.invoke(plug, pf, fm);
}
});
|
插件程序(APK)
- 、插件程序清单
同主程序的清单文件一样,sharedUserId必须有且和主程序的一样 插件的activity的意图过滤描述必须是这样 示例:
1
2
3
|
< strong >< intent-filter >
< category android:name = "android.intent.category.DEFAULT" />
</ intent-filter ></ strong >
|
- 、插件程序的功能
插件可以包含任意类,如同一个普通的apk工程一样。
但是,向主程序提供调用的类,必须是个activity,方法必须是无返回值的,有且只有一个Context参数,框架会反射这个方法,并将主程序的context句柄传入,也就是,不管你用不用这个context,他都是被框架传入的。
如果主程序规定了描述类,也就是框架中需要PluginDescription来调用的bean,在插件工程中,也必须有主程序这个bean,包名也必须一样。插件程序可以直接继承或者更改这个bean的字段,方便主程序去获取这个插件的描述信息。这种方式,是避过框架,给主程序一种方便。
- 、插件程序的plugin.xml配置
http://android-application-plug-ins-frame-work.googlecode.com/files/plugin.xml plugin.xml不能改名,必须放在工程的 assets 目录下。
内容大致是这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<? xml version = "1.0" encoding = "UTF-8" ?>
<!-- 这个xml配置文件放在插件工程的 assets 目录下 -->
<!-- 插件提供的功能(类) -->
< plugin-features >
<!-- 描述类,这个是自定义的 -->
<!-- 这个描述类使用户定义的,在主程序中必须有,插件工程中也必须有,并被继承 -->
< description name = "org.pakage.name.and.description.name" />
<!-- 这是一个功能(类),必须是activity的子类 -->
< feature name = "org.pakage.name.and.activity.name1" >
<!-- 这是一个方法 -->
<!-- name 方法名 -->
< method need-context = "true" name = "methodName1" >描述信息</ method >
< method need-context = "true" name = "methodName2" >描述信息</ method >
</ feature >
< feature name = "org.pakage.name.and.activity.name2" >
< method need-context = "true" name = "methodName1" >描述信息</ method >
</ feature >
</ plugin-features >
|
按着上面的套路来配置,就很容易了。
最后
上面说的比较泛,最好还是看看示例工程,里面包含了一个主程序和两个插件扩展,总共是4个工程,也就是说,在用户端是4个apkhttp://android-application-plug-ins-frame-work.googlecode.com/files/demo.zip
安卓应用程序插件化开发框架 -AAP Framework相关推荐
- Android应用程序插件化研究之DexClassLoader
文章首发:[Android应用程序插件化研究之DexClassLoader|大利猫](http://www.liuguangli.win/archives/366) 最近在研究Android应用的插件 ...
- 罗列几个Android插件化开发框架
携程插件化框架 ACDD插件化框架 360插件化框架 Android-Plugin-Framework DL APK动态加载框架 部分框架对比 DynamicLoadApk 迁移成本很重:需要使用『t ...
- 【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2nQzsuqq7Avgs8wsRizUhw 作者:Gc ...
- python组件化软件github_GitHub - cqingt/wepy: 小程序组件化开发框架
WePY 2 (alpha) 介绍 WePY (发音: /'wepi/)是一款让小程序支持组件化开发的框架,通过预编译的手段让开发者可以选择自己喜欢的开发风格去开发小程序.框架的细节优化,Promis ...
- python组件化软件github_GitHub - 872409/wepy: 小程序组件化开发框架
小程序框架wepy文档 扫码加入体验交流群. 快速入门 项目创建与使用 安装wepy 以下安装都通过npm安装 安装 wepy 命令行工具. npm install wepy-cli -g 在开发目录 ...
- 在WPF中使用Caliburn.Micro搭建MEF插件化开发框架
最终效果: 两个插件时: 删掉一个插件时: 代码下载地址:https://download.csdn.net/download/qq_36663276/10916071 概述: 每个插件类库各从自定义 ...
- 微信小程序组件化开发框架wepy 学习(二)
2019独角兽企业重金招聘Python工程师标准>>> 文件 1.文件结构 文件结构类似VUE文件 扩展名为 .wpy <template><!--渲染模板 对应w ...
- 微信小程序组件化开发框架wepy 学习(三)
2019独角兽企业重金招聘Python工程师标准>>> 前言 组件引用.循环渲染.computed计算属性.watch监听 官方文档说的很清楚.基本照着看看就能理解,本篇重点说父组件 ...
- android 程序开发的插件化
本文为 博客园 黑暗伯爵 原创,转载请注明 http://hangxin1940.cnblogs.com 原文地址:android 程序开发的插件化 模块化方法 之一 框架已经放出: android ...
最新文章
- ajax动态加载公共模块,Maven多模块项目搭建+SSM框架整合(四、Ajax异步获取数据,jq动态添加)...
- 蓝桥杯java a组_蓝桥杯十一届JavaA组-C++解题
- SVN下载谷歌上的代码
- iOS实现经典登录页面,手机号自动格式化
- 【人体姿态估计2】Real-time Multi-person 2d pose estimation using part affinity fields_2017
- linux 终端显示白底,mac终端使用Item2无法显示颜色的解决方法
- spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient 1
- python将输入值转化为元组_Python实现将元组中的元素作为参数传入函数的操作
- word横向网格线设置在哪里_word排版技巧:如何防止行距随字号而改变?
- java弱口令生成1001无标题,教你批量生成自动发卡平台需要的卡密数据
- 服务器运维查看大日志文件,Linux 运维必备的 40 个命令总结,收好了~
- win2003服务器安全设置
- python 启动新进程执行脚本
- 大数据创业的门槛到底有哪些?
- 4、RH850 F1 定时器OSTM功能和配置
- Python微信机器人之Python _ithcat 持续登陆错误 KeyError: ‘User’
- 学习记录3——PMSM数学建模——simulink内数学模型搭建以及仿真
- 年纪轻轻就要秃了?别怕,用它,让你重新找回浓密秀发!
- tp6 富文本编辑器
- C++中虚析构函数和纯虚函数的作用