本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构。
关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的。
从艺术的角度看,其实我们是在追求一种美。

本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程模板。
 1. 微盘
 2.网易新闻

1.微盘
      微盘的架构比较简单,我把最基本,最主干的画了出来:

      第一层:com.sina.VDisk:com.sina(公司域名)+app(应用程序名称) 。
      第二层:各模块名称(主模块VDiskClient和实体模块entities)
      第三层:各模块下具体子包,实现类。
      从图中我们能得出上述分析中一个最简单最经典的结构,一般在应用程序包下放一些全局的包或者类,如果有多个大的模块,可以分成多个包,其中包括一个主模块。
      在主模块中定义基类,比如BaseActivity等,如果主模块下还有子模块,可以在主模块下建立子模块相应的包。说明一点,有的时候如果只有一个主模块,我们完全可以省略掉模块这一层,就是BaseActivity.java及其子模块直接提至第二层。
      在实体模块中,本应该定义且只定义相应的实体类,供全局调用(然而实际情况可能不是这样,后面会说到)。在微盘应用中,几乎所有的实体类是以xxx+info命名的,这种命名也是我赞成的一种命名,从语义上我觉得xxxModel.java这种命名更生动更真实,xxxModel给我一种太机械太死板的感觉,这点完全是个人观点,具体操作中以个人习惯为主。还有一点,在具体的xxxInfo,java中有很多实体类中是没有get/set的方法,而是直接使用public的字段名。这一点,我是推荐这种方式的,特别是在移动开发中,get/set方法很多时候是完全没有必要的,而且是有性能消耗的。当然如果需要对字段设置一定的控制,get/set方法也是可以酌情使用的。

2.网易新闻

网易新闻确实做的不错,从应用的角度看,是我最欣赏的应用之一。它的工程结构是怎么样的呢?
 
      网易新闻的工程结构和前面2各app又有很多的不同,它并没有按照模块来分,而是主要按照组件的类型来分的,然后把此类型所有的类全部放在其下。那么这种把所有activity全部放在activity包下的分法的确在android开发中比较普遍。
      1).第一层被分成了两层,可以看出来,这里肯定是采用了公用包jar,如此说来,我们开发公用包的时候也应该按照"公司域名+公用模块名称"组合方式来命名比较好。
      2).第三层(绿色层)中activity和service包下都是存放所有的activity组件和service组件,其实这里面包含了一种代码习惯。往往activity相关的类如监听器,线程,适配器等非常多的类,这些不好直接丢在activity包下,而是直接写在相应的activity中以匿名或者内部类形式定义,否则activity包和service包看上去会比较杂乱。
      因为android的app很可能不是很大,activity或者service包也不会杂乱,所以网易新闻的这种方式也是很有参考借鉴价值的。

关于第一种方案进阶:

我们先来看下目前大部分app的单一项目结构原型。大致如下图所示: 
 
一眼望去这结构不是挺清晰的么?每个业务都放在单独的包名下,网络库、图片加载库等第三方库与上层业务都完美的剥离了,我们再来看下他们的直接的依赖关系图: 
 
虽然上面的依赖关系举例有点太过于极端,但是真实场景中是存在的。各个业务之间代码互相引用,所以这种结构也是架构整改的根本动机,也是当务之急应该考虑的事情。为了更好的满足各个业务的迭代而彼此不受影响,更好的解决上面这种让人头疼的依赖关系,开始着手app架构整改。

从上面的分析我们可以得出适合业务组件化的几种情况:

(1)业务较多、而且复杂 
(2)业务之间的依赖需要解耦 
(3)团队成员较多,需要各自开发相对独立的业务

业务组件化方向:

APP业务组件化架构整改的方向就是告别结构臃肿的时代,让各个业务变得相对独立。模块工程和类库工程之间遵循向下依赖关系,各个模块之间的遵循平级依赖关系。先看下整改后的各个独立业务模块与类库工程之间的向下依赖关系图: 
 
整改的方向由一个项目工程拆分成若干个模块工程,由app壳工程提供统一的入口,每个业务独立的模块module共享项目的依赖库。由壳工程集成需要引入的业务模块,至于各个独立的业务模块之间的调用依赖关系,我们借助一个中间层充当路由功能,这个路由我们放在各个业务模块共同引用的依赖库那一层。由路由统一调度他们之间的依赖关系,路由调度解决平级依赖问题示意图: 
 
通过APP壳工程提供的路由功能,各个模块之间调用不再采用传统的显示调用,而是采用隐式调用的方式。从而使各个模块之间不再存在依赖关系。 
APP业务组件化架构整改技术方案:

业务组件化大致需要解决以下几个问题。 
1.)业务组件的生命周期

按照理想状态的来看待的话,各个业务组件之间没有任何依赖关系,这时我们可以把每个独立的业务组件看成一个可运行的app,所以业务组件的生命周期和应与独立的app保持一致。 
2.)业务组件之间通信

在各个单独业务组件内,基本上保持原来的调用方式,组件之间通信采用URL Schema方式实现页面跳转,格式为 schema://host/action?param1=value1¶m2=value2 。关于schema映射表维护由上面提到的Router(路由)这么一个角色来维护,

schema解析由系统Framework来维护。其中schema映射表可以做成后台配置文件形式。也可以代码维护,不过组件需要预先注册。以上说的对于传递基本参数是没啥问题的。如果要传递对象的话,转成Json 字符串就可以了。

关于schema可以参考我的这篇博客:Android业务组件化之URL Schema使用

APP 业务组件化架构整改带来的好处:

如此规模大的架构整改需要付出更高的成本,还会涉及一些潜在的风险,那么整改后的架构能够带来哪些好处呢?

(1)加快迭代速度,各个业务模块组件更加独立,不再因为业务耦合情况,在发版时候,由于互相等待而迟迟不能发布版本。

(2)稳定的公共模块采用依赖库方式,提供给各个业务线使用,减少重复开发和维护工作量。

(3)迭代频繁的业务模块采用组件方式,各业务线研发可以互不干扰、提升协作效率,并控制产品质量。

(4)为新业务随时集成提供了基础,所有业务可上可下,灵活多变。

(5)降低团队成员熟悉项目的成本,降低项目的维护难度。

(6)加快编译速度,提高开发效率

总结:

本篇主要来分析为何要实现业务组件化、组件化的方向、组件化的技术方案简单探讨、组件化带来的好处,由于目前还处于实施初期,很多观点有可能是错误的,很多技术坑还没涉及,后续会跟进更多相关实现方案。

Android 客户端应用开发结构框架的更多相关文章

  1. Android 客户端应用开发的架构

    本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐 ...

  2. openfire Android学习---android客户端聊天开发之登录 和 注销登录

    一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...

  3. 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发

    掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime ...

  4. Android开发之 Android应用程序目录结构解析

    建立的HelloWorld的应用项目,其代码是由ADT插件自动生成的,形成Android项目特有的结构框架. 接下来让我带领大家解析一个Android程序的各个组成部分,这次我们拿一个Hello,Wo ...

  5. 使用Mina框架开发 QQ Android 客户端

    Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步AP ...

  6. 用Jersey为Android客户端开发Restful Web Service

    平时在做Android客户端的时候经常要与服务器之间通信,客户端通过服务端提供的接口获取数据,然后再展示在客户端的界面上,作为Android开发者,我们平时更多的是关注客户端的开发,而对服务端开发的关 ...

  7. 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

    申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...

  8. Android &Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

  9. Mina框架的学习笔记——Android客户端的实现

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...

随机推荐

  1. 自己实现JDK动态代理

    实验的目录结构 1.JDK动态代理 先来一段jdk动态代理的demo,首先创建一个接口,Person public interface Person { public void eat(); } 实现 ...

  2. linux命令详解——lsof

    lsof全名list opened files,也就是列举系统中已经被打开的文件.我们都知道,linux环境中,任何事物都是文件, 设备是文件,目录是文件,甚至sockets也是文件.所以,用好lso ...

  3. 2019-2020-1 20199319《Linux内核原理与分析》第四周作业

    MenuOS的构造 基础知识 1.操作系统的两把宝剑:①中断上下文的切换:保存现场和恢复现场:②进程上下文的切换. 2.Linux内核以A.B.C.D方式命名:A和B变得无关紧要,C是内核的真实版本, ...

  4. 标准C语言(4)

    分支语句可以在程序执行的时候从几组语句里选择一组,执行而忽略其他组,在编写程序的时候如果遇到多种可能性,每种可能性需要专门的语句处理,这种情况下就可以考虑采用分支结构解决问题 if关键字可以用来编写分 ...

  5. mysql 存储过程(二)

    存储过程(Stored Procedure): 一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行. 优点(为什 ...

  6. java8学习之Stream陷阱剖析

    上一次[http://www.cnblogs.com/webor2006/p/8297603.html]在最后用stream.iterate()生成了6个奇数,接着基于它来实现如下需求:找出该流中大于 ...

  7. 安装theano时候发现报错:cannot install ''numpy'.It is a distutils installed project and thus we cannot ...

    发现我安装theano的时候需要numpy需要1.9以上版本,而我之前自带的numpy是1.8版本,所以版本有问题.根本原因是theano需要的numpy版本不符合要求,但是numpy已经安装过了,所 ...

  8. hiho #1043 : 完全背包

    01背包和完全背包解析 在上一节的01背包中,每种物品只能使用一次. 初始化j=V,逆序推能够保证 dp[v-c[i]] 保存的是状态是 dp[i-1][v-c[i]] ,也就是每个物品只被使用了一次 ...

  9. html访问全过程

    1)解析Web页面的URL,得到Web服务器的域名 2)通过DNS服务器获得Web服务器的IP地址 3)与Web服务器建立TCP连接 4)与Web服务器建立HTTP连接 5)从Web服务器获得URL指 ...

  10. 一种sqlor的拆分

    原脚本declare @Phone nvarchar(50)declare @CompanyNO nvarchar(50)set @Phone='13914124223'set @CompanyNO= ...