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

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

大家好,又见面了,我是全栈君。

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客)

概述:

        随着应用的不断迭代。应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号。强制用户进行更新.结果频繁的更新,反而容易减少用户使用黏性.或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

       怎么办?

參考浏览器-插件开发模式:

         一. 来能够将自己的应用分拆。某些功能能够在插件中实现,用到时再进行下载,并且不用安装.  假设有新功能的加入,不须要更新应用,仅仅要预留插件管理,我们就能够通过加入插件的方式。动态更新自己的应用,该功能须要改进或扩展,更新插件就可以,无需频繁安装或卸载(容易造成用户反感).

        二. 相应同系应用,正常的引流方式仅仅能引导用户进行新应用的下载和安装,假设使用插件化开发,则无需安装应用,关闭插件功能也十分方便,省去应用安装和卸载的过程,能够实现无缝引流.

    这里要向大家推荐一个开源的动态载入框架DL, 该项目由singwhatiwanna发起,眼下一共同拥有三个人开发。我有幸成为了当中的contributor.

     假设你对DL动态载入框架还不熟悉。建议先看一下这篇文章:

    APK动态载入框架DL解析 http://blog.csdn.net/singwhatiwanna/article/details/39937639

假设你看过之后还会不太清晰,请看下DL插件化框架的全景图,例如以下

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

这里我主要向大家介绍一下利用DL框架进行开发的详细步骤:

1. 首先我们须要从github上获取项目代码:

   https://github.com/singwhatiwanna/dynamic-load-apk

   这里我们能够看到下载后的文件夹例如以下

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

 

        lib文件夹就是我们的公共插件库

        sample文件夹是相应的demo,  详细的project能够參照上面的DL全景图中的三种模式:

        由于一般项目中。代码管理和开发团队相对独立,  一般插件project的团队是非常难接触主项目团队的代码.因此,这里主要以第一种,也是我们最为推荐的方式进行, 採用插件不依赖宿主的方式进行开发. 不须要两个团队过多的交互,开发效率相对较高.


2 导入libproject,例如以下所看到的:

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

能够看到bin文件夹下的dl-lib.jar, 假设我们须要对libproject进行改动。又一次build获取相应的dl-lib.jar就可以


3. 插件project的开发, 导入demo中的main-pluginproject

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

    首先还是要强调插件开发的注意事项,以免出现不必要的错误

    插件也须要引用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

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

  

    在宿主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,就能够看到终于的效果:

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

       相信大家经过如上步骤,能够对DL动态载入框架进行开发有了一定了解.眼下DL框架仍在不断扩展中。欢迎对我们的项目进行star,fork。或者提出宝贵的建议.,如有问题请及时反馈,我们会在兴许版本号中进行修复或者改进:

    https://github.com/singwhatiwanna/dynamic-load-apk

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116064.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • java编程规范(持续更新)

    java编程规范(持续更新)

    2021年7月4日
  • eclipse配置tomcat安装及配置教程_vbras部署教程

    eclipse配置tomcat安装及配置教程_vbras部署教程想用Tomcat作为服务器,必须分以下两步。首先要配置好JDK的环境变量,再去下载Tomcat的压缩包。下载、安装JDK,并且配置好环境变量1、打开浏览器,输入JDK搜索,根据搜索结果下载安装包安装应用2、先接受协议,再根据自己的电脑下载相应的JDK版本,默认安装就行了。3、配置环境变量。找到安装路径,默认安装的一般都是在这个路径下C:\ProgramFiles\Java\jdk1.8.0_774、然后点击电脑开机键,打开控制面板5、然后点击系统安全,打开进入6、点击系统7、点击“高.

    2022年9月16日
  • struts2原理及创建struts工程步骤

    struts2原理及创建struts工程步骤

    2021年7月18日
  • mac平台adb、tcpdump捕手android移动网络数据包

    mac平台adb、tcpdump捕手android移动网络数据包

    2022年1月4日
  • 数据结构 || 二维数组按行存储和按列存储[通俗易懂]

    数据结构 || 二维数组按行存储和按列存储[通俗易懂]问题描述:设有数组A[n,m],数组的每个元素长度为3字节,n的值为1~8,m的值为1~10,数组从内存收地址BA开始顺序存放,请分别用列存储方式和行存储方式求A[5,8]的存储首地址为多少。解题说明:(1)为什么要引入以列序为主序和以行序为主序的存储方式?因为一般情况下存储单元是单一的存储结构,而数组可能是多维的结构,则用一维数组存储数组的数据元素就存…

    2022年7月16日
  • 【2021-09-07】JS逆向之空气质量历史数据查询

    【2021-09-07】JS逆向之空气质量历史数据查询文章仅供学习使用,请勿用于非法活动文章目录前言一、页面分析二、数据获取三、总结前言目标网站:aHR0cHM6Ly93d3cuYXFpc3R1ZHkuY24vaGlzdG9yeWRhdGEvZGF5ZGF0YS5waHA/Y2l0eT0lRTYlOUQlQUQlRTUlQjclOUUmbW9udGg9MjAyMTA5反爬类型:反调试,动态js,数据加密一、页面分析打开网页后,f12调用开发者工具,弹出提示框解决办法:点这玩意设置里直接打开开发者工具,或者新开一个网页,f12再进链接然

    2022年6月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号