基于插件开发的Android实现流程

标签: 插件 开发 android | 发表时间:2014-03-11 05:47 | 作者:hailushijie
出处:http://blog.csdn.net

转载请注明地址:http://blog.csdn.net/droyon/article/details/20951797

本文记述“柯元旦”Android内核剖析中基于类装载器的“插件”架构。

插件的概念:

1、插件不能独立运行,而必须运行于一个宿主程序中,即由宿主程序去调用插件程序。

2、插件一般可以独安装。

3、宿主程序中可以管理不同的插件,包括查看插件的数目,禁用或者使用某个插件。

4、宿主程序应该保证插件的向下兼容性,即新版本的宿主程序可以运行较老版本的插件。

下面详细看一下这种架构:

1、宿主程序:

新建Android项目PluginDevAndroid



2、插件项目1:Plugin1


3、插件项目2:


4、综述:

4.1、接口类一般定义在宿主项目中,比如本例中的IPluginDev.java

4.2、插件项目需要应用IPluginDev时,则必须通过一个外部的jar包,并且该jar包是以Library的形式被添加到Plugin项目的build Path,而不是以“外部的”jar方式添加。

如图:


4.3、宿主程序想要知道系统中有哪些插件,可以定义一个Action,本例中使用的是如下action。


这样的话,宿主程序就可以通过PackageManager类的queryIntentActivities函数查询相关的插件的列表了。

得到了 插件的PackageName,就可以访问插件的资源内容。例如:

				Resources res = pm.getResourcesForApplication(packageName);
				int id = 0;
				id = res.getIdentifier("version", "string", packageName);
				String version = res.getString(id);
				Log.d("hlwang", "MainActivity test version is:"+version);
这段代码中,首先获取插件的Resource对象,接着得到名称为version字段的字符串id值,然后再调用getString获得该变量的值,于是宿主程序就知道插件程序中的资源内容了。


关键代码:

private void test(){
		Intent intent = new Intent("com.example.plugindevandroid.plugin",null);
		final PackageManager pm = getPackageManager();
		final List<ResolveInfo> plugins = pm.queryIntentActivities(intent, 0);
		
		for(ResolveInfo r:plugins){
			ActivityInfo activityInfo = r.activityInfo;
			
			String div = System.getProperty("path.separator");
			String packageName = activityInfo.packageName;
			String packageName0 = getPackageName();
			String dexPath = activityInfo.applicationInfo.sourceDir;
			String dexOutputDir1 = activityInfo.applicationInfo.dataDir;
			String dexOutputDir2 = getApplicationInfo().dataDir;
			String libPath = activityInfo.applicationInfo.nativeLibraryDir;
			
			Log.d("hlwang", "MainActivity test div is:"+div
					+",packageName is:"+packageName
					+",packageName0 is:"+packageName0
					+",dexPath is:"+dexPath
					+",dexOutputDir1 is:"+dexOutputDir1
					+",dexOutputDir2 is:"+dexOutputDir2
					+",libPath is:"+libPath);
			
			DexClassLoader dexCl = new DexClassLoader(dexPath, dexOutputDir2, libPath, getClassLoader());
			Log.d("hlwang", "MainActivity test clazzName is:"+packageName+".PluginVersion");
			try{
				Class clazz = dexCl.loadClass(packageName+".PluginVersion");
				IPluginDev plugin = (IPluginDev) clazz.newInstance();
				String name = plugin.getName();
				Log.d("hlwang", "MainActivity test name is:"+name);
				
				Resources res = pm.getResourcesForApplication(packageName);
				int id = 0;
				id = res.getIdentifier("version", "string", packageName);
				String version = res.getString(id);
				Log.d("hlwang", "MainActivity test version is:"+version);
				
				
				PluginObject p = new PluginObject();
				p.name = name;
				p.version = version;
				Log.d("hlwang", "MainActivity test p is:"+p);
				mList.add(p);
			}catch(Exception e){
				Log.d("hlwang", "MainActivity exception eeeeeeeeeeeee");
				e.printStackTrace();
			}
			
		}
		Log.d("hlwang", "MainActivity test list size is:"+mList.size());
		setListAdapter(new ArrayAdapter<PluginObject>(this,
                android.R.layout.simple_list_item_1, mList));
	}
这段代码中,首先得到插件的List<ResolverInfo>列表。

然后得到插件的packageName,以及插件的dexPath目录。

再次,得到dexOutputDir目录。

libPath一般只c/c++使用的库文件。


DexClassLoader的参数意义:

dexPath:插件apk或者jar包文件的路径

dexOutputDir:将目标apk或者jar包解压的文件的存放目录。因为宿主程序只对本应用程序所在的目录由存取权限。


运行截图:



作者:hailushijie 发表于2014-3-10 21:47:30 原文链接
阅读:30 评论:0 查看评论

相关 [插件 开发 android] 推荐:

基于插件开发的Android实现流程

- - CSDN博客推荐文章
转载请注明地址:http://blog.csdn.net/droyon/article/details/20951797. 本文记述“柯元旦”Android内核剖析中基于类装载器的“插件”架构. 1、插件不能独立运行,而必须运行于一个宿主程序中,即由宿主程序去调用插件程序. 3、宿主程序中可以管理不同的插件,包括查看插件的数目,禁用或者使用某个插件.

Android 使用动态加载框架DL进行插件化开发

- - CSDN博客移动开发推荐文章
如有转载,请声明出处: 时之沙:  http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客).         随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余增加.项目新功能的添加,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,只能紧急发布补丁版本,强制用户进行更新.结果频繁的更新,反而容易降低用户使用黏性.或者是公司业务的不断发展,同系的应用越来越多,传统方式需要通过用户量最大的主项目进行引导下载并安装..

Android开发Tips

- - CSDN博客推荐文章
欢迎Follow我的 GitHub, 关注我的 CSDN.. 介绍一些, 在Android开发中, 会经常使用的小知识点.. submodule与git可以保持实时同步. 导入, 路径多于一个, 前面不添加冒号(:).. 使用PackageManager.. // 检查App是否安装 private boolean appInstalledOrNot(String uri) {.

DexClassLoader 实现 Android 插件加载

- - RincLiu.com
Java 中的 ClassLoader:. Java 中 ClassLoader 用于动态加载 Class 到 JVM,包含. BootstrapClassLoader(C++ 编写,用于加载系统核心类)、 ExtClassLoader(用于加载 lib/ext/ 目录的扩展 API)、 AppClassLoader(加载 CLASSPATH 目录下的类).

《Android插件化技术——原理篇》

- -
| 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头. 从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结其中的技术原理. 由于本人水平有限,插件化框架又相当复杂,文中若有错误或者不准确的地方望高手指点.

jquery插件的开发

- - CSDN博客推荐文章
插件的概念大家并不陌生了,插件可以很方便我们进行代码开发,大大节约了我们的开发时间. 以前我用jquery都是自己洗一大把的代码,复用性不高维护也不方便. 因此自己学着开发了2个简单的jquery插件. 下面先看下jquery插件的分类. jQuery开发分为两种:. 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法.

Android 开发者调查

- - 爱范儿 · Beats of Bits
Startup 是为 Android 开发者提供盈利模式的一个公司. Android 开发者只要在应用上推广 Startup 服务,并且为网站带去流量,就可以得到网站给予的补贴. 今年 3 月的时候,Startup 网站对 Android 开发者进行了一次调查. 现在,他们将调查的结果制成了信息图,并 发布在网站之上.

Android敏捷开发指南

- - 互联网的那点事
本文紧密结合移动开发方法与技术,围绕Android平台的开发探讨提供更高质量移动产品的解决方案. 作者中分析了移动开发中常见的问题,从两方面阐述了ThoughtWorks使用的测试开发方案和相应的架构方法与常用工具应用,并进一步阐述了为移动开发流程所提供的持续发布方案. 随着云计算、移动互联等一系列新技术概念的崛起,新一轮的IT经济正在不断扩大发展.

Android应用开发资源

- - InfoQ cn
Android应用设计和开发人员现在可以参考由Android用户体验(UX)团队官方发布的 Android设计指南. 该指南提供了开发者应该遵循的基本原则,并列出了很多细节指导,涉及 设备与显示、 主题、 触控交互、 度量与栅格、 排版、 色彩、 图标设计,以及如何 编写用户交互界面的提示语.

Android 开发视频推荐

- - 大猫の意淫筆記
作为 Android 死忠粉,总是想自己来两手,无奈没摸过后台开发,面向的唯一对象就是马总. 花了个把星期入个门,发现还是挺好玩的. 市面上的 Android 入门书有2个主要问题,一个是都要求有 Java 基础,另一个是跟不上 Android 版本更新.所以并不推荐买书学习. 斯坦福大学公开课:编程方法学.