android 分包

前言:一个人的快乐,不是因为他拥有的多,而是因为他计较的少。

分包的重要性

架构一个App时,大家往往都在关注新潮的技术,却忽略了一点,那就是分包。很多人可能没有一套分包的原则,凭感觉甚至随心所欲地创建package或将代码放到任意的package中。

虽然最终不会影响App功能,但这个问题其实非常严重。一种不好的分包策略带来的影响将会一直持续在App的开发迭代周期中,主要表现为以下几点:

  1. 代码混乱,功能模块界限模糊
  2. 不易阅读与维护,尤其对新人来说
  3. 功能扩展与重用困难
  4. 包间耦合比较高

根据个人多年App开发经验及项目实践,现推荐一种Android分包策略,虽并非最优,但基本适合绝大多数的android应用开发。

一种分包策略

反例分析

先来看一个“反例”(已加引号,如此分包者轻拍)。曾见过一些第三方项目或开源项目,它们的分包策略是这样的:

  1. 把应用中所有的Activity放到一个包中,如com.example.activities
  2. 把应用中所有的Fragment放到另一个包中,如com.example.fragments
  3. ……

相信有相当一部分开发者是这样分包的,来分析下其优缺点。

优点呢?或许说分类特别清晰,如所有的Activity都在一起,但是仔细想想,这样又有什么意义呢?

缺点却非常明显:

  1. 当看到这样的一个App分包结构时,大家可能都不知道该App有哪些功能、应用入口在哪里
  2. 代码混乱,杂糅在一起,没有清晰的模块界限
  3. 可读性差,查找一个功能页面时,可能需要跨多个包才能找到
  4. 修改维护则更加麻烦,根本不知道某个类是否在其他包中使用
  5. ……

分包原则

分包并没有官方原则,因此是自由的,但完全自由等于没有自由。

先抛出个人推荐的分包原则:按功能模块分包。

这样说有点抽象,我们细化到一个App示例中去,假设一个App具有如下功能:

基础支持功能

  1. 网络请求
  2. 图片处理
  3. 数据库
  4. ……

业务功能

  1. 新闻相关功能模块
  2. 电影相关功能模块
  3. 音乐相关功能模块
  4. ……

对于以上示例App,我们按照功能模块来分包:

  1. 将网络功能相关代码归到一个包,如com.example.network,至于具体用OkHttp还是Volley或者自己封装HttpURLConnection都无所谓。
  2. 将图片加载、缩放、缓存等相关功能代码归到一个包,如com.example.image,同样跟使用哪种图片框架无关。
  3. 将Sqlite数据库相关操作的代码归到一个包,如com.example.db。
  4. 将新闻功能模块的相关业务代码归到一个包,如com.example.news,同时新闻功能相关的所有Activity和Fragment都放到这个包中。
  5. 将电影功能模块的相关业务代码归到一个包,如com.example.movie,同时电影功能相关的所有Activity和Fragment都放到这个包中。
  6. 将音乐功能模块的相关业务代码归到一个包,如com.example.music,同时音乐功能相关的所有Activity和Fragment都放到这个包中。
  7. 对于adapter,如是封装的通用的adapter,则可归到com.example.adapter中,如仅仅是某个Activity自己用的adapter,也可放到业务模块的包中,这里推荐所有adapter放到一个独立的包中,因为我们查找代码时,往往从功能模块角度入口,根据功能分包原则,可以快速找到对应包中的Activity,找到了Activity,其用到的adapter、entity便也可以迅速找到,因此不必也放到功能模块的包中。
  8. 对于自定义控件,可以统一归到一个包,如com.example.widget。
  9. 对于某些基类,如BaseActivity和BaseFragment等可以放到一个叫com.example.base的包中。
  10. 对于数据对象实体,可统一放到com.example.entity中,不要放到具体功能模块的包中,原因第7点已提及,另外实体还可能重用、继承等。
  11. 对于业务无关的公用方法和工具类,可以放到com.example.util中。
  12. ……

基于上述分包策略,在Android Studio中一个App的层次结构示意图如下:

         java
           |--- com
                |---example
                    |--- base
                    |    |--- BaseActivity.java
                    |    |--- BaseFragment.java
                    |    |--- xxx.java
                    |
                    |--- network
                    |    |--- HttpClient.java
                    |    |--- xxx.java
                    |
                    |--- image
                    |    |--- ImageManager.java
                    |    |--- xxx.java
                    |
                    |--- db
                    |    |--- DbManager.java
                    |    |--- xxx.java
                    |
                    |--- news
                    |    |--- NewsActivity.java
                    |    |--- NewsFragment.java
                    |    |--- xxx.java
                    |
                    |--- movie
                    |    |--- MovieActivity.java
                    |    |--- MovieFragment.java
                    |    |--- xxx.java
                    |
                    |--- music
                    |    |--- MusicActivity.java
                    |    |--- MusicFragment.java
                    |    |--- xxx.java
                    |
                    |--- entity
                    |    |--- Movie.java
                    |    |--- News.java
                    |    |--- xxx.java
                    |
                    |--- adapter
                    |    |--- AbsAdapter.java
                    |    |--- MovieAdapter.java
                    |
                    |--- widget
                    |    |--- CircleImageView.java
                    |    |--- xxx.java
                    |    
                    |--- util
                         |--- ToastUtil.java
                         |--- xxx.java

优点

使用上述分包策略后,主要优点如下:

  1. 从分包结构就能大概了解该App的功能
  2. 高度模块化,可读性及可维护性大大提升
  3. 功能模块导航清晰,很容易查找相关功能代码,哪怕是新人也能快速找到对应代码
  4. 包与包之间的耦合性降低,添加或删除功能模块变得简单
  5. 修改代码时,一般仅涉及某个功能,一般不用担心影响到其他包中的功能实现
  6. 更加抽象化、模块化,方便扩展和重用,尤其是基础功能模块
  7. 从代码访问权限角度来看,包内调用权限可替代包间调用,安全性也会提高

总结

分包本身就是一个开放性的问题,没有固定或最优的方案,上面推荐的策略也只是一些基本原则,具体细节可根据App实际情况制定,欢迎探讨。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,576评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,515评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,017评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,626评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,625评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,255评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,825评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,729评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,271评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,363评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,498评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,183评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,867评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,338评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,458评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,906评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,507评论 2 359

推荐阅读更多精彩内容