笔者从 2016 年初就因为公司业务需求转战 android sdk 开发, 应用插件化技术将公司 android sdk 重新翻版。先来说说需求。

由于笔者所在一家创业公司, android sdk 实际运营时间并不长, 处于业务成长阶段, 经常会面对各种需求更改以及运营通道稳定性等个方面的问题。由于种种的不稳定性, 会导致 sdk 可能会经常出现小规模修改的问题, 用户对这种行为当然是非常不满意的了。可以想象,每一次 sdk 更新商务部门的同学要扛着多少用户口水去和用户商谈,而技术部门又要承受到少商务部门同学的白眼。

为了彻底解决这种现状, 从 16 年初我就开始正式介入 android sdk 重新开发这边的工作。 需求 (1) 很明确, 就是要能够做到 一次对接。介绍一下这个需求, 一次对接, 对于正常的 sdk 开发来说是最基本的需求, 因为 sdk 就应该处于长期稳定的状态, 要不然用户不太愿意使用。 可是这对我们公司的现状来说是致命的, 恰恰是最基本的我们保障不了。为了能够留下为数可怜的那些用户们,一定要做些事情。需求 (2) 能够做到及时 升级。 当然这个 升级 的需求就是针对我们自己的现实状况, 产品处于成长期迭代的功能多少都会有。

主要的需求就是这两个。 从技术的角度仔细去分析这两个需求, 其实就是一个需求。 就是做 sdk 的 热更。笔者之前从事的是 cocos2d-x 游戏开发, 对 热更 不可谓不熟。对于移动领域的 app 开发热更技术也都是了解的, 不过都是建立在脚本语言基础上的。 如大家经常提及的 cocos2d-x/u3d lua/js, android/iOS h5等, 这些都有成熟的方案做参考, 而当时摆在我面前的却是翻阅了所有搜索引擎都没找到先例的问题。经过一番苦思冥想之后, 从自己的记忆中提取到了一个片段 - 插件化。

15 年年底的时候, 快放假那段时间翻阅 github, 看到了一个很简明的 android 插件化框架 PluginMgr。果断翻阅了当时能找到的关于 插件化 的所有技术文章, 看懂看不懂的都阅读一边。 最终还是选择了 PluginMgr。 我需要一个只需要支持 android activity 的插件化框架就可以了,另外,在 sdk 中使用也不能体积太大。它能满足我目前的所有需求。 但是缺点却也很明显, 作者当时已经在开发新的插件化框架了, 并没有太多的时间去做维护和更新, 这意味着我自己需要能够把控这个框架,这让我一度很迟疑。 经过一段时间后, 发现自己能够完全掌握所需要的技术栈。于是开始动手, 新版 sdk 框架部分开发大概一周左右,然后另一位同事加入, 帮我开发我们 sdk 业务 apk。

业务 apk 的开发是一个正常的 android 项目, 插件化框架对他开始就是个黑匣子, 他不需要关心。 在后来实际上线的时候, 我提供了一些 宿主 和 插件 交互的 api 给他替换掉以前的一些 api 调用就可以了。 最后索性将这部分封装做的彻底了点, 让他自己去调试自己的 业务 apk, 成功了就可以直接发布。

而我这边需要做的前期工作就是把 PluginMgr 做一些定制化的修改, 并修复一些原本的 bug。 然后就是做动态更新部分的, 这很好做, 完全可以把以前做过的 热更 部分拿过来做相应的改动就好了。 只不过我需要面向的是 更新 apk, 而不是原来的一个加密后的 脚本压缩包。

最终的目标就是长期维护热更和插件化壳, 需要发布新的内容或者是解决非框架bug, 就通过更新业务 apk来解决。 当然,这种技术方案也暴露出一些不好的地方, 如插件化框架对安卓不同机型的兼容问题, 我先后遇到 三星, OPPO 等不同的兼容问题。 还有就是一定要使用足够的测试去保证热更和插件壳的稳定性, 也遇到因为测试没发现的问题而导致的问题。

博客中就不涉及代码了, 主要是阐述一下自己的思路。 如有兴趣或问题, 相关探讨请联系@石头( cn.stonexy@gmail.com )。

PluginMgr https://github.com/houkx/android-pluginmgr

感谢开源领域内的同学们作出的贡献, 能够给我们不断提供技术解决方案。

插件化技术在安卓sdk开发中实际应用的更多相关文章

  1. Android插件化技术简介

    https://blog.csdn.net/io_field/article/details/79084630 可以通过反射 事先定义统一接口的方式,访问插件中的类和方法 还可以在AndroidMan ...

  2. Android插件化技术——原理篇

    <Android插件化技术——原理篇>     转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...

  3. 深入理解Android插件化技术

    深入理解Android插件化技术  转 https://zhuanlan.zhihu.com/p/33017826 插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概 ...

  4. Android动态加载技术(插件化技术)

    No1: 插件化技术的好处: 1)减轻应用的内存和CPU占用 2)实现热插拔,即在不发布新版本的情况下更新某些模块 No2: 插件化方案必须要解决三个基础性问题:资源访问.Activity生命周期的管 ...

  5. Android 插件化技术窥探

    在Android 插件化技术中(宿主app和插件app设置相同的sharedUserId),动态加载apk有两种方式: 一种是将资源主题包的apk安装到手机上再读取apk内的资源,这种方式的原理是将宿 ...

  6. gulp自己主动化任务脚本在HybridApp开发中的使用

    眼下做前端开发的同学可能都熟悉grunt.fis之类的自己主动化构建工具.事实上在HybridApp开发中我们也能够使用这些工具来简化我们的工作.gulp就是一个比grunt,fis都先进的构建工具. ...

  7. 关于安卓sdk开发环境的的更新-Android SDK下载和更新失败

    由于特别原因,我们更新安卓sdk时不会成功.解决办法: 修改C:\Windows\System32\drivers\etc\hosts文件.添加一行:74.125.237.1       dl-ssl ...

  8. 百度安卓sdk开发

    一 key问题 1 在百度地图api控制台申请key的流程主要用到了app包,开发工具的开发sha1和发布sha1值,这2个值的获取就非常关键了. 一般来说我们都是在windows上开发安卓,使用an ...

  9. H5对安卓WeView开发中的影响

     1.body,或者html 高度为100% 会导致下拉直接触发原生的刷新控件,而不是webView滑动到顶部后刷新,以及不会执行onScrollChanged 方法,并且getScrollY 总是返 ...

随机推荐

  1. RxJava开发精要5 – Observables变换

    原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...

  2. function(a)

    问题:  问个初级的问题int a = 8;function(a);这里在function中的a值是引用a内存中的数据,还是新开辟内存后将a的值赋值到新内存供函数调用.  回答: int a = 8; ...

  3. 【HDOJ】1042 N!

    肯定是大叔,本来以为用加法做乘法,后来想想这样麻烦,还是可以使用乘法的,按位乘,ov可以看成不止一位,程序如下所示: #include <stdio.h> #define MAX 4000 ...

  4. 【HDOJ】2103 Family planning

    题目挺有意思.虽然不是很难. #include <stdio.h> int main() { unsigned int m, n, case_n; unsigned ; scanf(&qu ...

  5. NOIP2013 货车运输 LCA倍增+最大生成树

    #include <cstdio> #include <iostream> #include <ctime> #include <vector> #in ...

  6. [Jacky] 解决Ext.Net GridPanel 选择的行数据刷新后不能获取最新值

    选择GridPanel中一行数据,当变更数据时并重新刷新之后不能获取最新值,需通过如下方式获取: var internalId = gridPanel.getSelectionModel().getL ...

  7. (转载)自己实现spring

    您还 « 上一页 1 2 3 下一页 » 浏览 9671 次 锁定老帖子 主题:spring深入源码1 简单实现ioc机制 精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 ( ...

  8. poj 2892 Tunnel Warfare(线段树)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7499   Accepted: 3096 D ...

  9. vlookup使用案例

    http://www.360doc.com/content/13/1119/20/9842991_330586745.shtml

  10. Scala学习笔记(三)类层级和特质

    无参方法 功能:将方法的定义转换为属性字段的定义: 作用范围:方法中没有参数,并且方法仅能通过读取所包含的对象属性去访问可变状态,而不改变可变状态,就可使用无参方法: 例子: abstract cla ...