戏说移动江湖开发历程

大主线

细说移动开发历程

大技术

组件化开发

1、组件路由

2、组件配置动态加载

3、组件骨架架构

插件化开发

1、静态插件化

2、动态插件化

细节雕琢

1、网络层的优化和架构*

2、动态埋点的实现*

3、技术层架构(MVP,MVVM等模式)

大天地

后续按照大技术块各个技术点深入浅出的分享出来,请订阅关注。

前言

本文阅读需要8分钟。

你可能的收获:

  • 理解整个公司移动开发的基线和主线
  • 学会移动开发组开发过程碰到问题和解决方案
  • 学会移动开发过程各个技术的细枝末叶
  • 希望能给读者开发项目有点启发和思索

正文

我理解的技术开发人员,除了业务和技术的热爱,其同时也需具备独立思考的能力。~~

在这个高速变换的二次元移动开发时代,很多产品和公司应付追赶日新月异之变化都是争分夺秒攻城略地,伴随而来的移动研发也是进随着‘敲锣打鼓开天辟地‘。

所以我们有必要分析和思索当下移动开发的周期,就个人理解则把移动开发生命周期分四大周期,这个四个周期同步伴随着公司发展整个过程。

这个四个生命周期分别命名为:

1.成长期

2.混沌期

3.统一期

4.分化期

成长期一般在公司的第1~2年;

混沌期一般在公司的第2~3年;

统一和分化期在公司第3年以后;其中统一和分化期有可能多次迭代进行。

所谓的成长期,也就是传说中的野蛮发展,此时公司主导方向快速迭代跟进市场,作为研发里程以及人员数目这块都是从无到有的过程,其宗旨也是开发追赶产品实现快速上线过程。

此时开发技术选型都是以个人因素为走向,因此前期项目选型和架构都是个人技术喜爱占主导,自己熟悉的技术和框架才是最快最有效的,可以快速追赶上线进度。

譬如喜欢rxjava,喜欢mvp模式很快就会在这个项目就起主导方案和技术架构.甚至有些开发同仁直接从网上所谓架构好的现成项目开干怼。

此时段公司的唯一宗旨就是首战市场产出产品,快速迭代占据每个开发人员的脑海中,细节等一切可以忽略,要啥自行车。

接下来,随着公司业绩第一枪打响,同时融资也下来了,开始招兵买马大干一场,人员补给上来,开始出现混乱和磨合期,新来人员觉得老代码就是一坨翔,各种心底鄙视和不爽;

老员工觉得新员工桀骜不驯啥都不懂喜欢装逼。但是公司补给人员的目的是更加快速迭代项目,公司还动不动搞个什么敏捷开发鬼模式实现1~2周迭代一个版本(就喜欢搞事)。

需求继续开展代码还得迭代而新老开发人员依葫芦画瓢编写代码,慢慢的(可以N个),慢慢的过段时间发现代码充斥各种耦合,不规范代码,文件包混乱,业务各种穿插,

一句话混乱的一锅粥,各种线上bug突突的冒出来;线上bug一统计,fuck指标超过5-10%,开始全组上下静心反思,产生出版本重构迭代统一思想。

项目重构功能改善等统一口号就出现了,此时一般分两波人马,一拨人马继续业务迭代而另外一波人马进行项目重构;此事的核心就是减少线上bug数的量级,

完成公司要求线上bug不能超过3%的指标,这个时候重构重点基于线上bug进行维度分析,通过问题按多少进行划分,差不多这个时候的问题如下:

1、Bug的可视化实时监控和统计;

2、引用内存未释放导致crash的bug;

3、内存泄漏导致crash的bug;

4、进入市场机型问题引起的bug;

5、网络访问慢的反馈;

6、奇葩未知的bug;

问题1的思考,引入第三方系统,例如bugly等

问题2的思考,引入Eventbus解决回调地狱问题和回调引起泄漏未释放问题;

问题3的思考,引进LeakCanary内存泄漏检测,和prof分析大法根据各个问题进行突破;

问题4的思考,无解,能解决一个是一个,主要公司机型跟不上,可以通过网上机型提供商进行问题测试,贵不说而且感觉没啥用;

问题5的思考,略;

关于公司指定的线上bug指标,是否完成也是需要多版本迭代现网运行后才能统计;既然是现网bug就有轻重之分,如果重大bug一般立即发布新版本更新,轻微的bug放到下一个版本迭代修复,那有没有现网bug热修复方案,肯定有的,成熟的有tinker等第三方库;

虽然以上问题加班加点的搞完后,但是随着公司业务的发展和市场的强大推广,多个业务线如雨后春笋一般立项开干,看着当前项目架构模式(如图一)

初期架构

图(一)

长叹一声,埋在心头的那个一个极大隐患和不安慢慢露出来,项目中依旧充斥代码各种耦合和混乱,加上‘混乱代码加上新代码依旧还是混乱代码’定理一直压着头顶上,这项目框架肯定无法跟上公司新业务线的发展和规划;有压力就有动力,深思熟虑后不知觉分层分模块架构慢慢浮现出来,每个业务线都是一个Module模块,接下来每来一个业务线就按照这模块模样复制粘贴一份接着开怼业务。一般这种情况需要持续到三个业务线后基本就会出现模块间混乱调用,资源文件各种重复且代码到处飞,加上权限控制不到从而每个人都有权限编写基础库从而使各个业务公共代码下沉到基础库导致庞大臃肿,多模块混合编译速度极度慢等不良问题一大堆冒出来,回过头看看项目现状,我去,又来了,忙不完的事。看看图二(偷图,侵图删)如果你把自己当处女座,你肯定会发狂,要么炒老板鱿鱼要么静下心思考分析。

图(二)

分析后得出以下几个急需解决的问题,

1. 模块间的调用进行解耦合实现模块热拔式方案

2. 是时候加上代码权限管理

3. 模块打包AAR实现模块间引入

4. 解决编译速度慢问题

5. 自动化打包问题

问题1的思考,既然实现解耦合同时实现热拔式方案,说白点就是当前模块开关关闭,被其他引用的模块无法感知到这个模块被关闭,即其他模块引用的代码必须不能硬编码此模块的方法和引用类等等,方案就是组件路由,调用方通过字符串path查询模块的服务和功能。

问题2的思考,代码权限管理一般通过git或者svn去实现。

问题3的思考,可以通过gradle脚本实现模块打包上传私服。

问题4的思考,gradle本身问题加上模块多导致编译速度慢,根据业务线的独立性那我们可以通过编写业务模块时给此模块实现App模式,减少其他不必要的代码编译和运行。实现方案大体如下:

在模块gradle编译脚本通过标识符来区分是模块还是可独立运行的App

 sourceSets {

         main {

             jniLibs.srcDirs = [‘libs‘]

             if ("true".equals(FINANCE_IS_APPLICATION)) {

                 manifest.srcFile ‘src/main/diff/appmodule/AndroidManifest.xml‘

                 java.srcDirs = [‘src/main/java‘, ‘src/main/diff/appmodule/java‘]

                 res.srcDirs = [‘src/main/res‘, ‘src/main/diff/appmodule/res‘]

                 assets.srcDirs = [‘src/main/assets‘, ‘src/main/diff/appmodule/assets‘]

             } else {

                 manifest.srcFile ‘src/main/diff/libmodule/AndroidManifest.xml‘

                 java.srcDirs = [‘src/main/java‘, ‘src/main/diff/libmodule/java‘]

                 res.srcDirs = [‘src/main/res‘, ‘src/main/diff/libmodule/res‘]

                 assets.srcDirs = [‘src/main/assets‘, ‘src/main/diff/libmodule/assets‘]

             }

         }
  }

这样我们需要单独运行此模块,在gradle.properies把FINANCE_IS_APPLICATION为true然后编译就可以实现业务代码编写和运行。有人问,如果我需要实现主App里面的新业务,那你可以关闭其他无关的模块实现快速编译提高开发效率。

问题5的思考,随着项目的增大和多渠道的打包,此时需要进行考虑项目周边的业务服务,例如提供给测试人员的打包测试,正式版的发布等等自动化产出问题。

一般自动化服务可以通过搭建jenkins服务,或者配合python脚本实现自动化打包功能,其

脚本的功能因公司而异。

图(三)

所以此时迫切需要一个熟悉gradle,python等脚本的同志(gradle本身是grovvy语言)。保证新业务的开发的情况下整个过程的重构和完善至少需要半年时间(大公司除外)。

慢慢发现,组件化架构无声无息的出现了,是不是很神奇。

回过头发现组件化架构已经进行了一小部分,信心十足,继续干,此时必须祭出毛爷爷的红本子,大声的朗读出来,我爱编程,皮肤好好!!

我们发现已经做了业务模块化代码分离和模块间路由互调通信以及gradle组件化脚本;

你的成长是建立在公司的成长上,随着公司业务发展庞大,种种缘由业务伴随着也会出现分支独立,需要某些子业务线独立出App提供专业的服务和体验;需要撒播种子开花结果,原先的子模块可能变成独立App,所以发现目前的架构是没法实现,对,走过来,请在菩提树下思考;其根本缘由就是组件化不完全导致的。其中最大问题就是主项目模块涉及到大量的以前最早的业务代码和功能,现在最迫切问题是需要把主项目的业务剥离变成一个业务子模块加一个纯粹的项目骨架,其中项目骨架必须上升一级变成新的主项目模块,此主项目模块包含项目公共业务。说白点,把项目骨架套在其他子模块就是一个独立的App可以运行;

作为对比,图四为原架构图,图五为主项目模块上升一级为项目骨架的架构图

其中主项目骨架必须包含的功能有:

1、项目升级降级功能;

2、第三方库的引用和初始化工作;

3、实现子模块加载和引入以及初始化工作;

4、周边服务或插件的引入和初始化工作;例如Tinker和bugly等

图(四)

组件化成型架构

图(五)

这个时候组件化大体已经完整成型,现在唯一需要做的就是通过gradle脚本去做粘合器,脚本配合jenkins动态实现模块间和主项目骨架的组合;

上面说的组件化成型是主体骨架完整了,但是需要根据自己的公司业务继续进一步解耦和分离,一般如:

1. 全局配置文件的分离,实现配置文件根据子模块业务走,例如网络地址的配置和网络请求地址的分离;

2. 业务配置文件的分离,配合服务端一起实现模块化分离;

3. 各个子模块的公共业务动态加载块;

4. 耦合代码的分离和重构;

此过程应该做到了项目模块以及代码的各种解耦和分离,看起来非常清爽和干净。不知觉又开始唱起了:我爱编程,皮肤好好!!

突然有一天你听到有人说插件化,你心里暗暗一笑,我们项目早就实现了热拔式插件化;

一讨论发现原来不是你想的插件化,他们说的插件化是把业务模块动态存放到网上,需要的时候加载进来;

哇咔咔,原来插件化分两种,一直静态插件化和动态插件化;

不知觉的发现我们已经实现了静态插件化功能,细水长流说的就是这个,哦,应该是水到渠成;

动态插件化的前提必须是项目已经具备成型的组件化后才能实现动态插件化功能。

目前已经可以独立出各个子模块打包成AAR、JAR、APK;接下来就是需要在主项目骨架上添加一项动态插件化功能;完美

现在动态插件化市面上有很多成熟的方案,因为这个不像组件化过程,组件化其实本身和业务和项目有很大关联,需要根据自己的业务以及已有的业务框架进行加工和架构实现;而

动态插件化实现机制和业务体系和自身架构无关系,可以大胆的引入第三方成熟的插件;例如美团公司,阿里公司的动态插件化。

其实,回味下整个过程,发现这些都是一步步的走下去的,不可能一步到位,这才人生;

有人问是不是接下来高枕无忧,哈哈,too x too native, 这才是万里长征前几步而已,接下来需要细节上和技术上进一步雕琢,周边服务的完善和安全等配套实施都需要等你去实现;路遥茫茫。。。

细节上雕琢随便列举几个:

1、例如上面提到的bug中出现网络性能慢,这个就可以深入挖掘各个实现,例如腾讯就这个小点实现了Mars开源框架;

2、业务UI框架的封装(减少重复开发以及性能问题);

3、性能监控;

4、配置管理中心;

5、动态埋点;

6、各个业务核心点的优化;

7、编写的组件化的重构和优化;

8、技术层架构(MVP,MVVM等模式)

9、分布式架构;

最终你会发现,很多功能只有在你组件化结束后或者插件化结束后再去实施会达到事半功倍效果,实现集中优化改动分布最小化,极大减少改动的风险和bug风险;

以上过程其实是一个分久必合合久必分的过程。当项目走向做到极致的时候还是没法应付庞大用户群和业务群,请转行养猪。。。

插件化路由实现,源码详见,觉得好请点击star:我的路由

链接:https://www.jianshu.com/p/df2a6717009d,转载请注明来源

阅读更多

react-native技术的优劣

学习React Native必看的几个开源项目

开发了几个小程序后,说说我对小程序的看法

NDK项目实战—高仿360手机助手之卸载监听

(Android)面试题级答案(精选版)

如果有什么 问题,欢迎和我交流 微信公众号:终端研发部

技术

原文地址:https://www.cnblogs.com/gooder2-android/p/9109147.html

时间: 2024-10-12 21:25:42

戏说移动江湖开发历程的相关文章

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节

京东上市:中国电商江湖的基本面分析

夏天午后的容易犯困,来杯速溶咖啡提下神.本文要主要的介绍是DataPool的几个常用的数据插件,做财经或体育实时数据是肯定会用的,希望本文可以快速的让你对DataPool的强大有一个初步认识,就想一杯速溶咖啡能够迅速为你送去一丝咖啡的清香. 干货来了.本文有四个DataPool插件要介绍: DataText,最基础的插件,板砖一个.DataObject,高级板砖.DataArray,安装序号存放板砖的一个数组.DataTable按照名字存放板砖的表格. 一. DataText,假设我有个运动员的

【Docker江湖】之docker部署与理解

转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thinkgamer Docker江湖 [Docker江湖]之Docker部署与理解 [Docker江湖]之hub上镜像的使用,Dockerfile语法解读和数据管理 [Docker江湖]之创建带有SSH服务的镜像 写在前边的话 在之前便想学习Docker技术了,可是一直没有机会,近期在做elk的一个项目

看江湖老炮用尽洪荒之力解读网络协议(下)

作者言:老炮总结的有些协议比喻也不是很恰当,毕竟网络协议是一门科学,而江湖规矩是口口相传的道义:如果把此文当成一份凉菜,"老炮如是说"的话语只能做为一点调味,具体调的好不好,老炮也恍惚,老炮只是用心在调,咸了淡了您多包涵,欢迎品尝.上篇叙述了网络协议的上三路,本篇介绍网络协议的下四路.下面看一位老炮如何解读这些网络协议(下)传输层传输层是整个协议层次结构的核心,是惟一负责总体数据传输和控制的一层.它属于OSI模型7层的中间层,网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而

13、Cocos2dx 3.0游戏开发找小三之3.0中的Director :郝萌主,一统江湖

重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706967 游戏中的基本元素 在曾经文章中.我们具体介绍了游戏开发的概念以及 Cocos2d-x 与其它游戏引擎的不同之处,甚至已经学会了它与众不同的 内存管理机制. 想必大家已经非常期待開始探索 Cocos2d-x 游戏开发的世界了. 在后面的文章中,我们将结合详细的实例,从 Cocos2d-x 游戏开发的基本元素讲起. 从这章開始,我会在学习引

Linux江湖23:使用Eclipse和Gnu Autotools管理C/C++项目

在我该系列的之前的所有随笔中,都是采用 Linux 发行版自带的包管理工具(如 apt-get.yum 等)进行软件的安装和卸载,从来没有向大家展示使用源代码自行编译安装软件的方法.但是长期混迹于 Unix/Linux 世界的童鞋们都知道,从源代码自行编译安装软件并不是那么的难,一般都是这样三个步骤: configure make make install 之所以能够把源代码的构建管理得如此简单,这得益于 Gnu 的 Autotools 工具链.在上面的三个命令中,configure 是一个脚本

《老码说编程之玩转Swift江湖》一书终于出版了

今天我们的第一本基于XCode6.1最新版Swift语法编写的书籍上市发售了,它有个可爱的名字:<老码说编程之玩转Swift江湖>,还有个漂亮的封面: 本书不是出身名门,它只是五位IT老码农的孩子 五月份的一天,我们几个老码农一起去软件园门口的小面馆吃饭,聊天之余突然对码农的生活产生了很多的抱怨,无聊,没事做,忧虑未来的路在何方,最后大家的意见趋于一致,决定学点什么或者做点什么,通过这次的讨论,一个以学习为主的小团队诞生了并且取了一个无奈的名字:老码团队-OldCoder,听起来多么的苍凉.

01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理

http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 管理NHibernate二级缓存 NHibernate二级缓存由ISessionFactory创建并由ISessionFactory自行维护.我们使用NHibernate操作数据时,ISessionFactory能够自动同步缓存,保证缓存的有效性.但是当我们批量操作数据时,往往NHibernate不能维护缓存持久有效.ISessionFactory提供了可编程方式的缓存管理方法.

微信公众账号开发历程及心得01

1.昨天主要使用BAE对php的开发接口测试代码进行了调试,使用SVN,将对checkout下载的index.php进行代码编写,并再次上传commit.在微信中配置相应url和token即可. 2.今天主要进行j2ee的开发部署与功能学习,初次听说到dom4j从xml进行解析的开源框架,还有xstream实现Java类到xml的转换的jar包. 利用这两个便可完成对微信平台所发消息的xml解析及消息回复的xml封装.中间业务过程便是j2ee的知识了~ 3.在部署时有些问题需要注意.java类型