- 浏览: 83827 次
- 性别:
- 来自: 北京
文章分类
最新评论
http://www.cnblogs.com/hangxin1940/archive/2011/12/14/2288169.html
在android的项目开发中,都会遇到后期功能拓展增强与主程序代码变更的现实矛盾,也就是程序的灵活度。
由于linux平台的安全机制,再加上dalvik的特殊机制,各种权限壁垒,使得开发一个灵活多变的程序,变得比较困难,不像pc平台下那么容易。
瞅瞅elipse的插件,瞅瞅360的插件,在android下,我们一开始很难写好一个主程序,然后通过插件机制来应对以后的功能拓展,于是程序变得不那么灵活多变了。
比如一款android下的安全软件,新版本增加了一个功能,如短信拦截,往往会因为一个模块的增加,而重新编译一个apk包,这样周而复始,哪怕只增加50kb的功能代码,用户也需要升级一个完整的apk,往往是5~6M的体积。
最近思来想去,想到一个方法,既然tencent qq在android下面可以以apk的形式来换皮肤,这资源文件的拓展都可以这样简便的搞,为何功能性的拓展就不可以?
想出来了两种解决方案。
先来说说第一种。
demo下载在最后
先说分析思路。
android下,默认的情况是,每个apk相互独立的,基本上每个应用都是一个dalvik虚拟机,都有一个uid,再配合上linux本身的权限机制,使得apk互通很难直接进行。但作为一个独立应用的集成,不管多少个apk,都可以并为一个单独的dalvik虚拟机,直观的反映给开发人员就是在shell下列出进程,那几个apk同时加载后,会一个进程存在。
这主要就是工程的清单文件 Mainfest中配置了,只需要一句话,以我的测试demo为例:
....
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.igeek.plugintest.main"
<!-- 就是这句关键代码 -->
android:sharedUserId="org.igeek.plugintest"
android:versionCode="1"
android:versionName="1.0">
.....
在上面的代码中,android:sharedUserId是指共用一个uid,也就是,凡是这个属性相同的工程,都会共用同一个uid,这样,权限壁垒就消除了,dalvik也会融合为一个,可以测试一下,写几个工程,没有这个属性和有这个属性的情况下,同时运行,在列出当前进程,就直观的说明了。
程序拓展的插件化,当然需要一个主程序,主程序是实现基本功能,以及UI,还有插件的检索以及插件的调用。
这里贴出我demo中的主activity代码:
View Code
看注释吧,主要有两点
插件的扫描
这种方案是,每个插件以一个单独的apk发布,这样可以在程序中很灵活的知道是否有新的插件,提示用户下载安装,插件的apk清单描述为Action为非Luncher,Category为Default。
主程序侦听packgeManager的安装完成广播,之后扫描同包名(插件当然得这么定义了,只要通过packgeManager能判断是否为自己的插件就行)的apk,之后列出来,让用户选择是否加载。
插件的加载与调用
在获取包后,通过调用系统的api可以得到 sharedUserId 与主程序相同的apk的context,也就是句柄,获得了句柄,通过这个context可以得到classloader,之后就简单了,如何知道这个插件提供什么功能?
这个可以用xml描述,比如这个xml是插件apk的一个资源,就像spring这个框架一样。xml中描述了这个插件有哪些类,提供哪些方法,这些方法需要传入什么参数,返回什么类型。我的demo中为了方便,是用接口,每个插件有一个类提供一个相同的方法,来获取一个map集合,获得这个插件的描述。
ok,到这里就知道加载的插件提供什么功能了。
在上面贴出来的代码中,是循环遍历每个插件,并把每个插件提供的功能以Button的方式显示给用户,点击按钮,就执行了插件的功能,执行时,并不是activity转向(这样就无意义了),而是在主程序自身的context句柄中执行,也就是在自身的窗体中执行。
代码中有一段注释,说明,如果插件有用到context时,记得传递进去的是主程序的context,这样窗体才能附加到这个句柄中,如果传递的是插件的context,它没有一个窗体实例,是无法将一些窗体附加进去的,无任何效果。
这里只提供思路,有时间的话研究一下,看能不能搞个通用的框架出来。还有另一种方法,不通过apk形式,以后会写出来。
这里有一些待验证的问题,比如插件的权限问题,如果插件需要的一些权限在主程序中没有声明,会是个什么情况,能不能实时申请呢?这个需要高人指点。或者在主程序中把能声明的权限预先声明了也不错。还有就是native层代码的问题,如果插件包含了native层代码,会是个什么情况,这也需要验证。
这是demo下载:
http://files.cnblogs.com/hangxin1940/android_plugin_program.rar
在android的项目开发中,都会遇到后期功能拓展增强与主程序代码变更的现实矛盾,也就是程序的灵活度。
由于linux平台的安全机制,再加上dalvik的特殊机制,各种权限壁垒,使得开发一个灵活多变的程序,变得比较困难,不像pc平台下那么容易。
瞅瞅elipse的插件,瞅瞅360的插件,在android下,我们一开始很难写好一个主程序,然后通过插件机制来应对以后的功能拓展,于是程序变得不那么灵活多变了。
比如一款android下的安全软件,新版本增加了一个功能,如短信拦截,往往会因为一个模块的增加,而重新编译一个apk包,这样周而复始,哪怕只增加50kb的功能代码,用户也需要升级一个完整的apk,往往是5~6M的体积。
最近思来想去,想到一个方法,既然tencent qq在android下面可以以apk的形式来换皮肤,这资源文件的拓展都可以这样简便的搞,为何功能性的拓展就不可以?
想出来了两种解决方案。
先来说说第一种。
demo下载在最后
先说分析思路。
android下,默认的情况是,每个apk相互独立的,基本上每个应用都是一个dalvik虚拟机,都有一个uid,再配合上linux本身的权限机制,使得apk互通很难直接进行。但作为一个独立应用的集成,不管多少个apk,都可以并为一个单独的dalvik虚拟机,直观的反映给开发人员就是在shell下列出进程,那几个apk同时加载后,会一个进程存在。
这主要就是工程的清单文件 Mainfest中配置了,只需要一句话,以我的测试demo为例:
....
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.igeek.plugintest.main"
<!-- 就是这句关键代码 -->
android:sharedUserId="org.igeek.plugintest"
android:versionCode="1"
android:versionName="1.0">
.....
在上面的代码中,android:sharedUserId是指共用一个uid,也就是,凡是这个属性相同的工程,都会共用同一个uid,这样,权限壁垒就消除了,dalvik也会融合为一个,可以测试一下,写几个工程,没有这个属性和有这个属性的情况下,同时运行,在列出当前进程,就直观的说明了。
程序拓展的插件化,当然需要一个主程序,主程序是实现基本功能,以及UI,还有插件的检索以及插件的调用。
这里贴出我demo中的主activity代码:
View Code
看注释吧,主要有两点
插件的扫描
这种方案是,每个插件以一个单独的apk发布,这样可以在程序中很灵活的知道是否有新的插件,提示用户下载安装,插件的apk清单描述为Action为非Luncher,Category为Default。
主程序侦听packgeManager的安装完成广播,之后扫描同包名(插件当然得这么定义了,只要通过packgeManager能判断是否为自己的插件就行)的apk,之后列出来,让用户选择是否加载。
插件的加载与调用
在获取包后,通过调用系统的api可以得到 sharedUserId 与主程序相同的apk的context,也就是句柄,获得了句柄,通过这个context可以得到classloader,之后就简单了,如何知道这个插件提供什么功能?
这个可以用xml描述,比如这个xml是插件apk的一个资源,就像spring这个框架一样。xml中描述了这个插件有哪些类,提供哪些方法,这些方法需要传入什么参数,返回什么类型。我的demo中为了方便,是用接口,每个插件有一个类提供一个相同的方法,来获取一个map集合,获得这个插件的描述。
ok,到这里就知道加载的插件提供什么功能了。
在上面贴出来的代码中,是循环遍历每个插件,并把每个插件提供的功能以Button的方式显示给用户,点击按钮,就执行了插件的功能,执行时,并不是activity转向(这样就无意义了),而是在主程序自身的context句柄中执行,也就是在自身的窗体中执行。
代码中有一段注释,说明,如果插件有用到context时,记得传递进去的是主程序的context,这样窗体才能附加到这个句柄中,如果传递的是插件的context,它没有一个窗体实例,是无法将一些窗体附加进去的,无任何效果。
这里只提供思路,有时间的话研究一下,看能不能搞个通用的框架出来。还有另一种方法,不通过apk形式,以后会写出来。
这里有一些待验证的问题,比如插件的权限问题,如果插件需要的一些权限在主程序中没有声明,会是个什么情况,能不能实时申请呢?这个需要高人指点。或者在主程序中把能声明的权限预先声明了也不错。还有就是native层代码的问题,如果插件包含了native层代码,会是个什么情况,这也需要验证。
这是demo下载:
http://files.cnblogs.com/hangxin1940/android_plugin_program.rar
发表评论
-
Android SDK下载速度慢无法更新?使用国内镜像站加速
2016-01-29 18:18 720https://blog.kuoruan.com/24.htm ... -
探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法
2014-08-01 12:02 395原文地址:http://blog.zhourunsheng.c ... -
关于ViewPager和Fragment
2014-07-07 14:18 1006原文地址:http://www.cnblogs.com/iho ... -
Android移动操作系统的脆弱性分类研究
2014-03-18 14:46 616下载地址:http://www.paper.edu.cn/re ... -
Android实战技巧:深入解析AsyncTask
2014-03-06 11:21 343原文地址:http://blog.csdn ... -
Ubuntu android真机调试
2014-03-06 11:01 445关闭adb服务,切换到root,重启adb服务,离开root ... -
64位Ubuntu配置android环境报错(...adb": error=2, 没有那个文件或目录)
2014-02-07 13:29 578原文地址:http://blog.csdn.net/jayho ... -
【Android 声音处理】MediaPlayer和SoundPool
2014-01-14 17:08 1889原文地址:http://blog.sina ... -
Android自定义组件之一:View详解
2013-07-15 16:08 755原文地址:http://www.eoeandroid.com/ ... -
Android中error inflating class fragment
2013-06-19 17:21 1086原文地址:http://blog.csdn.net/qp120 ... -
拿来主义Android优秀开源项目
2013-06-05 11:57 886http://dengzhangtao.iteye.com/b ... -
android sqlite db-journal文件产生原因及说明
2013-06-05 11:37 3553原文地址:http://blog.csdn.net/chthq ... -
Android系统自带Camera方向判别
2013-05-22 16:40 661使用了OrientationEventListener, 也就 ... -
android onTouchEvent和setOnTouchListener中onTouch的区别
2013-03-27 10:35 724原文地址:http://blog.csdn ... -
Android源码编译整理总结
2013-01-08 11:37 677原文地址:http://www.cnblogs.com/hoj ... -
安卓图表引擎AChartEngine(一) - 简介
2012-12-20 17:47 956原文地址:http://blog.csdn.net/lk_bl ... -
微技巧:Android手机隐藏指令大全
2012-12-07 11:36 761原文地址:http://news.xinhuanet.com/ ... -
自定义控件(attrs定义属性的使用)
2012-12-04 11:38 1145这里为了演示使用自定义变量,字体大小改用自定义的属性。 首先 ... -
二进制在数学中的妙用
2012-11-14 15:50 799原文地址:http://blog.csdn.net/hackb ... -
国外程序员推荐:每个程序员都应读的书
2012-11-06 10:58 796原文地址:http://blog.jobbole.com/58 ...
相关推荐
在Android程序开发中,插件化技术是一种将应用程序的核心功能与可动态加载的模块分离的高级编程技巧。这种技术能够显著提升应用的灵活性、可扩展性和维护性。下面将详细介绍Android程序开发的插件化及其相关知识点。...
ApkPlug框架是实现Android插件化的一种解决方案,它的目标是提供一种简单、高效的方式来实现应用的模块化。 在ApkPlug框架中,主要有以下几个关键组件: 1. **InstallBundle.java**:这是一个关键的类,负责处理...
综上所述,Android插件化开发是一个复杂而强大的技术,它通过动态加载和组件通信实现了应用功能的模块化和动态扩展。在实际开发中,我们需要根据项目的具体需求,选择合适的插件化策略和工具,以实现最优的开发效果...
在Android开发中,插件化技术是一种非常重要的高级技术,它允许我们动态地加载和卸载应用程序的功能模块,而无需重新安装整个应用。占位式插件化是其中的一种实现方式,尤其适用于大型应用或者需要频繁更新功能的...
在Android平台上,插件化开发是一种常见的技术,它允许开发者将功能模块化,使得应用程序能够动态地加载和卸载这些模块,而无需重新发布整个应用。`WeiPlugin`是一个专门针对Android平台的插件开发模块,它利用Java...
模块化是一种软件设计方法,它将应用程序分解为一系列可重用的、独立的模块,每个模块都有明确的职责和接口。在Android中,模块化有助于代码组织,便于维护和扩展,同时也可以方便地实现插件化。例如,"mainapp"可能...
在实际应用中,插件化技术可以用于大型应用的模块化开发,便于团队协作,减少版本迭代的影响,同时也可以用于热更新,提升用户体验。然而,由于Android系统的碎片化和安全限制,插件化开发也面临着一些挑战,如兼容...
在Android应用开发中,插件化技术是一种将应用程序的功能模块分离出来,使其可以在运行时动态加载的技术。这有助于提升应用的灵活性和可维护性。OpenAtlas是一款开源的Android插件框架,它支持四大组件(Activity、...
在Android应用开发中,插件化技术是一项重要的高级技术,它使得应用程序可以动态加载插件模块,提高了软件的灵活性和可扩展性。其中,Small是一个广受开发者关注的开源插件化框架,本文将详细探讨Small框架在Android...
- **模块化开发**:将大型应用划分为多个独立的模块,每个模块作为一个插件,便于管理和维护。 - **快速迭代**:允许开发者单独更新插件而不必重新发布整个应用,加快产品迭代速度。 - **功能扩展**:通过增加新的...
在Android平台上,插件化开发是一种先进的技术,它允许开发者将应用程序的部分功能模块化,以插件的形式动态加载,从而实现灵活更新、降低维护成本、提高用户体验等目标。本笔记将深入探讨Android插件化开发的相关...
在Android开发领域,插件化技术是一种高级技巧,它允许开发者将应用的功能模块化,使得在不更新主应用的情况下,可以动态加载或卸载这些功能模块。本入门工程旨在帮助初学者理解并掌握Android插件化的实现原理和实践...
在Android开发中,插件化技术是一种高级的编程技巧,它允许一个主应用程序动态加载其他模块,这些模块被称为插件。这种技术可以极大地提高代码的复用性,降低维护成本,同时提供更好的灵活性,使应用能够根据需要...
* 插件化:是指将移动应用程序拆分成多个独立的模块,每个模块都是一个插件,插件之间可以独立开发、测试和维护,从而提高开发效率和系统维护性。 * 平台化:是指将移动应用程序的基础设施和公共服务抽象出来,形成...
在Android开发领域,插件化框架是一个重要的技术分支,它允许开发者将应用程序的功能模块化,以便于动态加载和卸载,提高应用的可维护性和灵活性。"Android插件化框架研究.zip"是一个开源项目,专注于...
在Android应用开发中,插件化技术是一种将应用程序的部分功能以插件的形式动态加载到主程序中,使得应用能够实现热更新、模块化开发等高级功能。本文将深入探讨基于阿里巴巴开源项目Atlas的Android插件化开发初体验...
Eclipse Android 开发插件是Android开发者在Eclipse集成开发环境中进行应用程序开发的重要工具。它极大地简化了Android项目创建、管理、调试以及构建的过程,使得开发者可以更专注于代码编写和功能实现。 首先,...
这种技术的核心是将一部分功能模块化,使其可以独立于主程序(宿主程序)之外进行开发、更新和管理。在Android系统中,插件化开发特别受欢迎,因为它能提高代码复用性,简化维护,同时提供更好的灵活性和扩展性。 ...
在Android应用开发中,插件化技术是一种将功能模块化,允许在运行时动态加载和卸载的技术。360官方发布的Android插件化开发框架是针对这一需求的解决方案,旨在帮助开发者实现更加灵活和高效的代码管理。这个框架...