Android 使用动态载入框架DL进行插件化开发
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 (来自时之沙的csdn博客)
概述:
随着应用的不断迭代。应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号。强制用户进行更新.结果频繁的更新,反而容易减少用户使用黏性.或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.
怎么办?
參考浏览器-插件开发模式:
一. 来能够将自己的应用分拆。某些功能能够在插件中实现,用到时再进行下载,并且不用安装. 假设有新功能的加入,不须要更新应用,仅仅要预留插件管理,我们就能够通过加入插件的方式。动态更新自己的应用,该功能须要改进或扩展,更新插件就可以,无需频繁安装或卸载(容易造成用户反感).
二. 相应同系应用,正常的引流方式仅仅能引导用户进行新应用的下载和安装,假设使用插件化开发,则无需安装应用,关闭插件功能也十分方便,省去应用安装和卸载的过程,能够实现无缝引流.
这里要向大家推荐一个开源的动态载入框架DL, 该项目由singwhatiwanna发起,眼下一共同拥有三个人开发。我有幸成为了当中的contributor.
假设你对DL动态载入框架还不熟悉。建议先看一下这篇文章:
APK动态载入框架DL解析http://blog.csdn.net/singwhatiwanna/article/details/39937639
假设你看过之后还会不太清晰,请看下DL插件化框架的全景图,例如以下
这里我主要向大家介绍一下利用DL框架进行开发的详细步骤:
1. 首先我们须要从github上获取项目代码:
https://github.com/singwhatiwanna/dynamic-load-apk
这里我们能够看到下载后的文件夹例如以下
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdDEyeDM0NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
lib文件夹就是我们的公共插件库
sample文件夹是相应的demo, 详细的project能够參照上面的DL全景图中的三种模式:
由于一般项目中。代码管理和开发团队相对独立, 一般插件project的团队是非常难接触主项目团队的代码.因此,这里主要以第一种,也是我们最为推荐的方式进行, 採用插件不依赖宿主的方式进行开发. 不须要两个团队过多的交互,开发效率相对较高.
2 导入libproject,例如以下所看到的:
能够看到bin文件夹下的dl-lib.jar, 假设我们须要对libproject进行改动。又一次build获取相应的dl-lib.jar就可以
3. 插件project的开发, 导入demo中的main-pluginproject
首先还是要强调插件开发的注意事项,以免出现不必要的错误
插件也须要引用DL的jar包。可是不能放入到插件project的libs文件夹以下,换句话说,就是插件编译的时候依赖jar包可是打包成apk的时候不要把jar包打进去,这是由于,dl-lib.jar已经在宿主project中存在了,假设插件中也有这个jar包,就会发生类链接错误。原因非常easy。内存中有两份一样的类。反复了。至于support-v4也是相同的道理。
对于eclipse非常easy。仅仅须要在插件project中创建一个文件夹。比方external-jars,然后把dl-lib.jar和support-v4.jar放进去。同一时候在.classpath中追加例如以下两句就可以:
<classpathentry kind="lib" path="external-jars/dl-lib.jar"/>
<classpathentry kind="lib" path="external-jars/android-support-v4.jar"/>
然后是插件开发中的详细步骤
(1) 假设原有的为Activity,这里须要改为继承DLBasePluginActivity,假设原来为FragmentActivity,那么须要继承DLBasePluginFragmentActivity, for example:
public class MainActivity extends DLBasePluginActivity
TestFragmentActivity extends DLBasePluginFragmentActivity
(2) 假设须要插件独立安装执行, 仅仅要将jar放到libs以下就可以,若支持动态载入。仍需按上述注意事项加入 exteral-jars中
(3)插件所须要权限须要在宿主project中声明
假设是实际开发,一般为从server获取插件,这里我们方便自己调试演示,将执行生成相应的插件apk,放入sd卡上的DynamicLoadHost文件夹中
4. 宿主project中将上述生成的dl-lib.jar加入libs就可以,例如以下所看到的为demo中提供的宿主project
在宿主project中,首先我们须要获取要调用的插件apk相应的MainActivity,DL的demo中插件路径为 sd卡上的DynamicLoadHost文件夹,没有的话须要创建。或者依据自己需求进行改动.
String pluginFolder = Environment.getExternalStorageDirectory() + "/DynamicLoadHost";
File file = new File(pluginFolder);
File[] plugins = file.listFiles();
if (plugins == null || plugins.length == 0) {
mNoPluginTextView.setVisibility(View.VISIBLE);
return;
} for (File plugin : plugins) {
PluginItem item = new PluginItem();
item.pluginPath = plugin.getAbsolutePath();
item.packageInfo = DLUtils.getPackageInfo(this, item.pluginPath);
if (item.packageInfo.activities != null && item.packageInfo.activities.length > 0) {
item.launcherActivityName = item.packageInfo.activities[0].name;
}
mPluginItems.add(item);
}
接着是调起响应的apk,这时须要使用dl-lib.jar:
(1)通过Class.forName的方式获取我们须要调用的插件apk中MainActivity的class对象
(2) 就上面提到的,我们须要推断该对象继承自DLBasePluginActivity还是DLBasePluginFragmentActivity,得到相应的代理class对象
(3)使用相应的代理class对象调起插件apk
PluginItem item = mPluginItems.get(position);
Class<? > proxyCls = null; try {
Class<? > cls = Class.forName(item.launcherActivityName, false,
DLClassLoader.getClassLoader(item.pluginPath, getApplicationContext(), getClassLoader()));
if (cls.asSubclass(DLBasePluginActivity.class) != null) {
proxyCls = DLProxyActivity.class;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
Toast.makeText(this,
"load plugin apk failed, load class " + item.launcherActivityName + " failed.",
Toast.LENGTH_SHORT).show();
} catch (ClassCastException e) {
// ignored
} finally {
if (proxyCls == null) {
proxyCls = DLProxyFragmentActivity.class;
}
Intent intent = new Intent(this, proxyCls);
intent.putExtra(DLConstants.EXTRA_DEX_PATH,
mPluginItems.get(position).pluginPath);
startActivity(intent);
}
最后执行宿主projectmain-host,就能够看到终于的效果:
相信大家经过如上步骤,能够对DL动态载入框架进行开发有了一定了解.眼下DL框架仍在不断扩展中。欢迎对我们的项目进行star,fork。或者提出宝贵的建议.,如有问题请及时反馈,我们会在兴许版本号中进行修复或者改进:
Android 使用动态载入框架DL进行插件化开发的更多相关文章
- Android 使用动态加载框架DL进行插件化开发
http://blog.csdn.net/t12x3456/article/details/39958755/ 转载自: 时之沙: http://blog.csdn.net/t12x3456
- DL动态载入框架技术文档
DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管 ...
- 【我的Android进阶之旅】Android插件化开发学习资料
1.目前开源的插件开发框架大致有哪些? 1. 任玉刚 的 dynamic-load-apk Github 地址:https://github.com/singwhatiwanna/dynamic-lo ...
- 插件化开发—动态载入技术载入已安装和未安装的apk
首先引入一个概念,动态载入技术是什么?为什么要引入动态载入?它有什么优点呢?首先要明确这几个问题.我们先从 应用程序入手,大家都知道在Android App中.一个应用程序dex文件的方法数最大不能超 ...
- Android插件化开发,初入殿堂
好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架CJFrameForAndroid. 好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架C ...
- Android 插件化开发(四):插件化实现方案
在经过上面铺垫后,我们可以尝试整体实现一下插件化了.这里我们先介绍一下最简单的实现插件化的方案. 一.最简单的插件化实现方案 最简单的插件化实现方案,对四大组件都是适用的,技术面涉及如下: 1). 合 ...
- Android组件化和插件化开发
http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...
- Android插件化开发
客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...
- Android插件化开发---执行未安装apk中的Service
欢迎各位增加我的Android开发群[257053751] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...
随机推荐
- Maven+SpringMVC+MyBatis 上传图片
上传文件我一直都觉得很难,好吧,所有涉及文件操作的我都觉得不容易.然后今天尝试了从网页上传图片保存到服务器.这个例子的前提是搭建好了服务器端框架:Maven+Spring MVC+MyBatis.当然 ...
- excel读入数据库
POI3.9效率大幅度提高,支持xls以及xlsx. 首先需要POI的JAR包,MAVEN配置如下: <!-- excel start --> <dependency> < ...
- android-适配Adapter
Adapter是把数据和用户界面视图绑定到一起的桥梁类,负责创建用来表示父视图中的每一个条目的子视图,并提供对底层数据的访问. public class MainActivity extends Ac ...
- 帝国cms7.0导航栏当前栏目显示不同样式
以下代码演示帝国导航调用 栏目id为14.15.2.34的栏目内容.同时加入php语句,如果栏目显示为当前栏目,则变量<?=$on?> 显示为 an ,否则就显示为空 [e:loop={& ...
- 如何修改Protel99SE原理图的标题栏
本文主要讲述了如何修改Protel99SE原理图中的标题栏内容,使用者可以根据需要修改. 标题栏的格式: 1.添加模板:(1)菜单栏Design\Template\Set Template File ...
- Qt开发小工具之gif转换器(使用QMovie截取每一帧为QImage,然后用QFile另存为图片文件)
最近,QQ上好多各种gif表情.每一个都很经典呀..于是我就想把它转换成一张张静态图片...没学过ps.于是写了几行代码.完工.核心代码如下 主要是借助QMovie类.文件读取模式选择QMovie:: ...
- SQL中采用Newtonsoft.Json处理json字符串
原文 SQL中采用Newtonsoft.Json处理json字符串 使用环境: SQL Server2005; VS2010; 关于SQL中部署CLR程序集的方法,网上一搜一大把,需要了解的自行查阅, ...
- 隐藏nginx 版本号信息(转)
为了安全,想将http请求响应头里的nginx版本号信息隐藏掉: 1. nginx配置文件里增加 server_tokens off; server_tokens作用域是http server loc ...
- Oracle中sign函数和decode函数的使用
Oracle中sign函数和decode函数的使用 1.比较大小函数SIGN sign(x)或者Sign(x)叫做 符号函数,其功能是取某个数的符号(正或负): 当x>0,sign(x)=1; ...
- 盘点:移动服务 #AzureChat
感谢大家帮助我们顺利推出史无前例的 #AzureChat.移动服务和 Notification Hub 是 Windows Azure 平台上令人振奋的服务.我们很高兴能借这次在线讨论的机会,倾听各位 ...