插件化技术在安卓sdk开发中实际应用
笔者从 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开发中实际应用的更多相关文章
- Android插件化技术简介
https://blog.csdn.net/io_field/article/details/79084630 可以通过反射 事先定义统一接口的方式,访问插件中的类和方法 还可以在AndroidMan ...
- Android插件化技术——原理篇
<Android插件化技术——原理篇> 转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...
- 深入理解Android插件化技术
深入理解Android插件化技术 转 https://zhuanlan.zhihu.com/p/33017826 插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概 ...
- Android动态加载技术(插件化技术)
No1: 插件化技术的好处: 1)减轻应用的内存和CPU占用 2)实现热插拔,即在不发布新版本的情况下更新某些模块 No2: 插件化方案必须要解决三个基础性问题:资源访问.Activity生命周期的管 ...
- Android 插件化技术窥探
在Android 插件化技术中(宿主app和插件app设置相同的sharedUserId),动态加载apk有两种方式: 一种是将资源主题包的apk安装到手机上再读取apk内的资源,这种方式的原理是将宿 ...
- gulp自己主动化任务脚本在HybridApp开发中的使用
眼下做前端开发的同学可能都熟悉grunt.fis之类的自己主动化构建工具.事实上在HybridApp开发中我们也能够使用这些工具来简化我们的工作.gulp就是一个比grunt,fis都先进的构建工具. ...
- 关于安卓sdk开发环境的的更新-Android SDK下载和更新失败
由于特别原因,我们更新安卓sdk时不会成功.解决办法: 修改C:\Windows\System32\drivers\etc\hosts文件.添加一行:74.125.237.1 dl-ssl ...
- 百度安卓sdk开发
一 key问题 1 在百度地图api控制台申请key的流程主要用到了app包,开发工具的开发sha1和发布sha1值,这2个值的获取就非常关键了. 一般来说我们都是在windows上开发安卓,使用an ...
- H5对安卓WeView开发中的影响
1.body,或者html 高度为100% 会导致下拉直接触发原生的刷新控件,而不是webView滑动到顶部后刷新,以及不会执行onScrollChanged 方法,并且getScrollY 总是返 ...
随机推荐
- HTML本地测试成功后上传博客注意事项
需要注意不要跟博客已经存在的样式(CSS)或功能(JavaScript)起冲突 功能名一定不要一样 样式名尽量不一样 如果样式名一样,存在属性名的对应属性值尽量跟博客内相同
- hdu4655Cut Pieces
http://acm.hdu.edu.cn/showproblem.php?pid=4655 先以最大的来算为 N*所有的排列数 再减掉重复的 重复的计算方法:取相邻的两个数的最小值再与它前面的组合 ...
- bzoj1930
一开始我觉得这不是一个弱弱的费用流吗? 每个豆豆拆点,入点出点随便连连 由于肯定是DAG图,边权为正的最大费用肯定能增广出来 于是我们只要跑总流量为2的最大费用最大流不就行了吗 但是 这样会TLE,因 ...
- OpenSSL 拒绝服务漏洞
漏洞名称: OpenSSL 拒绝服务漏洞 CNNVD编号: CNNVD-201312-058 发布时间: 2013-12-05 更新时间: 2013-12-05 危害等级: 漏洞类型: 威胁 ...
- Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞
漏洞名称: Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-067 发布时间: 2013-11-07 ...
- ubunt下的MinimalCD
ubuntu有MinimalCD,水平高的衍生版制作者基于MinimalCD安装并编译,定制出独特风格的ubuntu衍生版,如 crunchbang.水平不高的个人用户可以从Alternate(文字安 ...
- ☀【插件】iScroll
iScroll 4.2.5 中文API √http://www.gafish.net/api/iScroll.html -webkit-overflow-scrolling: touch <!D ...
- POJ 3159 Candies 差分约束dij
分析:设每个人的糖果数量是a[i] 最终就是求a[n]-a[1]的最大值 然后给出m个关系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c 所以对于这种情况,按照u ...
- Asm Shader Reference --- Shader Model 3.0 part
ps部分 概览 Instruction Set Name Description Instruction slots S ...
- 解决:javah 无法访问引用Android对象的问题
无法访问android.view.View 是没有引入android.jar包 javah的参数中 有一个-bootclasspath参数 让他指向android.jar包 例如 javah -jni ...