安卓应用程序插件化开发框架 -AAP Framework

2019-03-02 00:54|来源: 网路

介绍

这个框架的初衷,是为了方便让程序模块化、插件化,将一个apk应用拆分为多个apk。
不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。
在这里我会以腾讯微信为例,如何使用这个框架。 ( 腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,结果就是每次插件的更新,都必须以整个程序的更新为代价)

都能干啥

框架的思想,主要是通过apk清单文件中的sharedUserId属性来吧多个apk融合为单一的dalvik虚拟机,也就是融合为一个进程,这样就变相逾越了android框架中不同apk权限不同无法互通的鸿沟(rpc啦什么的其它的毕竟不如这个来的实在)。
从最简单的皮肤插件到复杂的涉及数据库的拓展功能,从普通activity跳转到把插件的activity转变为view并附加到主程序中的拓展功能,都是可以通过本框架来实现的,当然,本框架只是提供了一种途径,如何编码还得靠自己。
本人能力有限,可能有一些错误、疏漏或者不足之处,请不吝指教,我的博客地址在左下角,或者我的邮箱,都可以联系到我。
ps:下面会以腾讯微信为例,这里声明一下,本人没有对微信安卓客户端进行任意形式的反编译与破解工作,只是看球半天进行简单的猜测而已。

框架结构

本插件框架由三个包组成:

 

  • org.igeek.android.pluginframework 这个包种类是框架的主要操作类
    1. PluginBuilder 组装插件
    2. PluginDescription 组装用户自定义的插件描述
    3. PluginInvoke 插件功能调用
    4. PluginSearch 查找插件
  • org.igeek.android.pluginframework.annotation 未来可能会考虑使用注解
    1. PluginDescription 用于用户自定义描述类的注解
    2. PluginFeature 用于插件类的注解
    3. PluginMethod 用于插件类方法的注解
  • org.igeek.android.pluginframework.beans 框架内部使用的一些beans
    1. Plugin 插件包
    2. PluginFeature 插件类
    3. PluginFeatureMethod 插件方法
  • org.igeek.android.pluginframework.util 一些工具类
    1. XMLParse 插件包

 

如何使用

以腾讯微信为例,虽然从表面来看,它是插件化的多种功能的一种集成。 但是,这都是虚的,每次更新时你会发现,哪怕一个小小的功能添加,都会让用户更新整个程序,截至目前(2011-12-17),微信让我更新到3.5,修复了一些小bug,增加了1个插件功能,以及其它的小改进,就得让我下载并升级整个程序,6.8m啊。。
在工程开发时,预留插件的使用、管理页面,如:

这是微信的插件浏览页面,所有可暴露在这里的插件都会被列出来

 这是微信的插件管理界面,可以卸载安卓,但这些都是虚的,可能只是把服务关了,并非真正的卸载

主程序(APK)

  • 、主程序清单
首先为工程想好一个名字,并在清单中加入sharedUserId属性,属性值就是想好的那个名字,例如微信:com.qq.weixin
   android:sharedUserId="com.qq.weixin"
  • 、为插件描述写一个类
 这就是插件描述

 

首先在主程序中单独建立一个包,并写一个类,这个类相当于一个bean,具有相应的插件描述信息的字段,如微信,那么这个bean的字段就有  插件名: 漂流瓶  插件logo: 那个人头  插件描述: 描述信息...

 

这个类在主程序中不会很多的使用,只会读取框架返回的插件的bean。

 

  • 、引入本框架的jar包或导入源码

 

正式编码时,可在任何地方调用框架。具体步骤是这样的
1、查找插件 本框架是根据sharedUserId来查找插件。它首先会根据自身apk的sharedUserId值来查找系统中具有相同属性的包并加载。
  • ��以说,插件apk的sharedUserId值也应与主程序相同
        //首先,就是查找插件
       
PluginSearch psearch=newPluginSearch();
       
//第一次获得的是简要的插件描述
       
List<Plugin>  plugins=psearch.getPlugins(this);
       
       
//然后将插件再组装一下
       
PluginBuilder pbuilder=newPluginBuilder(this);
       
//将用户所定义插件描述融合进去
        plugins
=pbuilder.buildPluginsDescrition(plugins);

 

这样就把所有插件找到手了,很简单吧?

 

1、调用插件 找到插件后肯定是调用,最简单应用,就是靠Button按钮来调用
比如微信的摇一摇,点了它就触发框架的插件调用
        @Override
       
publicvoid onClick(View v){
               
//新建一个插件调用类
               
PluginInvoke pi=newPluginInvoke(AndroidPluginFrameworkActivity.this);
       
               
               
//这是真正的调用
               
//三个参数,第一个是Plugin类型,第二个是PluginFeature,第三个PluginFeatureMethod
                pi
.invoke(plug, pf, fm);
               
       
}
       
});

插件程序(APK)

  • 、插件程序清单

 

同主程序的清单文件一样,sharedUserId必须有且和主程序的一样 插件的activity的意图过滤描述必须是这样 示例:

 

  <intent-filter>
               
<categoryandroid:name="android.intent.category.DEFAULT"/>
 
</intent-filter>
  • 、插件程序的功能
插件可以包含任意类,如同一个普通的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 目录下。
内容大致是这样:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这个xml配置文件放在插件工程的 assets 目录下 -->


<!-- 插件提供的功能(类) -->
<plugin-features>

       
<!-- 描述类,这个是自定义的 -->
       
<!-- 这个描述类使用户定义的,在主程序中必须有,插件工程中也必须有,并被继承 -->
       
<descriptionname="org.pakage.name.and.description.name"/>
       
       
<!-- 这是一个功能(类),必须是activity的子类 -->
       
<featurename="org.pakage.name.and.activity.name1">
       
               
<!-- 这是一个方法 -->
               
<!-- name 方法名 -->
               
<methodneed-context="true"name="methodName1">描述信息</method>
               
<methodneed-context="true"name="methodName2">描述信息</method>
               
       
</feature>
       
       
<featurename="org.pakage.name.and.activity.name2">
               
<methodneed-context="true"name="methodName1">描述信息</method>
       
</feature>
</plugin-features>
按着上面的套路来配置,就很容易了。

最后

上面说的比较泛,最好还是看看示例工程,里面包含了一个主程序和两个插件扩展,总共是4个工程,也就是说,在用户端是4个apk http://android-application-plug-ins-frame-work.googlecode.com/files/demo.zip
转自: http://code.google.com/p/android-application-plug-ins-frame-work/

转自:http://www.cnblogs.com/shanzei/archive/2012/03/23/2413866

相关问答

更多
  • 删除您从其网站下载的BouncyCastle.jar,然后单击此链接下载Codename one支持的CN1Lib版本。 将文件放在项目的lib文件夹中,并在项目中refresh libs 。 Remove the BouncyCastle.jar you downloaded from their website and click this link to download the CN1Lib version supported by Codename one. Place the file in t ...
  • 使用框架可以节省大量时间,并帮助您按逻辑组织应用程序。 如果应用程序很小,那么像CodeIgniter或Kohana这样的框架是理想的。 如果您正在构建一个需要扩展Symfony的大型应用程序,或者可能需要查看Zend。 如果您要在Symfony中启动您的应用程序,您将立即获得: 使用路由重写URL 一个表单框架,用于处理与您的Web表单有关的所有事情 国际化和本地化 电子邮件 高速缓存 管理员区域生成器,帮助您快速添加数据 单元测试框架 此外,整个框架是可扩展和可控的,以满足您的需求。 如果没有框架,你必 ...
  • 检查Jasper报告 。 “JasperReports是世界上使用最广泛的开源报告引擎。” Check Jasper Reports. "JasperReports is the world's most widely used open source reporting engine."
  • 在对互联网进行大量研究并与Google支持人员交谈之后,我发现Google App Engine并未接受外部数据库。 我们有两种选择来解决这个问题, 从XML文件中的外部站点导出数据库,并在该文件上使用simpelXMLelement来读取或操作它。 其他选项是使用Google Cloud SQL将您的数据库存储在Google App Engine上。 (这需要一张信用卡,我使用了ICICI银行的借记卡,工作正常。) After doing lot of research on Internet and t ...
  • 这是一个更简单的答案: 应用程序框架使书写应用程序更加简单 创建应用程序很困难。 应用程序必须提供他们通过操作系统语义获得的输入和输出。 现代应用程序通常是基于GUI的,GUI应用程序比非GUI应用程序要复杂得多。 就这么简单。 该框架将所有与操作系统接口的复杂性简化并为您简化。 它为您处理所有细节的细节。 很明显,某些框架比其他框架做得更好。 使用一个很少被讨论的应用程序框架有一个缺点(大概是因为我们都对我们不必做的工作量感到满意)。 为了提供操作环境的简化视图,一个框架必须将您变成某种“风格”。 如果你 ...
  • 使用坚实的可靠框架的优点: 其他人为你做了很多工作。 其他人已经给你一个坚实的概念模型作为你的应用程序的基础。 对框架的改进可以改进您的应用程序。 使用可靠的可靠框架的缺点: 你的应用程序依赖于其他人的工作。 您必须使用框架的概念模型作为您的应用程序的基础。 如果这不合适,你的发展将会变得更加困难。 为了将框架的改进融入到您的应用程序中,您必须重复测试。 打破框架中的更改可能会破坏您的应用程序。 让框架作者做出或接受对应用程序成功至关重要的建议更改可能很困难。 如果您对未被接受的框架进行更改,则必须继续修补 ...
  • 通过以下步骤获得输出, 1)创建了一个角度项目 (可选)我正在使用角度IDE创建角度项目 2)在角度项目html文件中添加了对cordova.js文件引用的引用。 3)创建一个科尔多瓦项目 4)为cordova项目增加了平台和插件。 对于我的情况,我添加了浏览器平台和cordova设备插件。 5)在实现OnIt的角度工程中添加了如下插件回调函数。 注意:在' onDeviceReady '之 ...
  • 使用MVC模式的优点已经存在于当前的android框架中,您可以分别查看您的视图,首先调用您的活动类文件,然后将视图分配给它。 您可以拥有可用于通过控制器填充视图的模型。 除了上面,我真的觉得在Android应用程序中使用任何模式的任何优势。 毫无疑问,您可以将应用程序设计为遵循任何一种模式,但您只需为项目添加更多文件/复杂性,这也将花费更多时间。 The advantages of using MVC pattern is already there in current android framewor ...
  • 我认为移动框架的主要优点是作者在UI小部件中投入的时间/精力。 问题归结为:您是否有与您的应用程序关联的进程无法在特定框架内处理? 如果没有,那么你可能想要通过不重新发明轮子并使用框架来处理细节来节省时间。 I think the main advantage to a mobile frameworks is the time/effort the author(s) put into UI widgets. The question boils down to: do you have processe ...
  • 您已经尝试过这个来获取数据吗? $.ajax({ url: yoururl, type: 'GET', data: yourdata, cache: false, success: function(data){ //Do stuff } }) You already tried this to get your data? $.ajax({ ur ...