一种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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

优点

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

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

总结

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

时间: 2024-08-26 17:31:17

一种Android分包策略推荐的相关文章

Android加密策略

前言: 我们做项目的时候经常使用到加密算法,我了解的常用的加密算法有对称加密和非对称两大类型,对称加密 就是加密和解密使用同一个密钥,比如说大家广为使用的DES加密算法:非对称加密反之就是加密和解密使用不同 的密钥,一个"公钥"一个"私钥",它们必须配对使用,否则不能打开文件,当然公钥是对外公布的,私钥不能对外公 布,只能由持有人自己知道,他的优越性就在这,因为对称式的加密方法如果在网络上传输加密文件就很难不把密 钥告诉对方,不管用什么方法都有可能被别窃听到.而非对

Android分包MultiDex原理详解

MultiDex的产生背景 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的.这个过程会生成一个ODEX文件,即Optimised Dex.执行ODex的效率会比直接执行Dex文件的效率要高很多. 但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面.但是这个链表的长度是用一个short类型来保存的,导致

Android使用Google推荐的联网框架Volley,让连接网络更加简单

大家好,随着技术的进步,科技的发达,很少有应用是单机的了,大部分都需要联网访问服务器,以前我们都用 httpclient和httpurlconnection,感觉是不是非常麻烦,而Google特别为开发者考虑,推出了Volley,从此妈妈再也不担心我的联网问题了,哪里联不上联哪里,Volley让联网更容易和更快,并且Volley请求会异步执行,不阻挡主线程联网请求无非就是Get或者Post,我们很少用到DELETE这个请求方式,说了这么多废话,下面让我们看看Volley到底能干啥.它真的有这么神

(转)Android开发书籍推荐:从入门到精通系列学习路线书籍介绍

Android开发书籍推荐:从入门到精通系列学习路线书籍介绍 转自:http://blog.csdn.net/findsafety/article/details/52317506 很多时候我们都会不断收到新手的提问"Android开发的经典入门教材和学习路线?"."android 开发入门教程有哪些推荐?"等类似的问题,我们不断重复回答这些问题,这让我们萌生了做< Android开发书籍推荐:从入门到精通系列学习路线书籍介绍>的想法,整理收集开发大牛的

Android定时器,推荐ScheduledThreadPoolExecutor

Android定时器,推荐ScheduledThreadPoolExecutor 官方网址:http://developer.android.com/reference/java/util/Timer.html 实现定时器的功能,有如下几种方法:1.Thread的sleep(long)方法2.Handler的postDelayed(Runnable, long)方法3.Timer与TimerTask结合的方法这3种方法,本质上是一样的,都跟线程相关:这里主要讲下Timer. 定时器可以有个名称(

Android各层推荐开发书籍及参考资料

Android各层推荐开发书籍及参考资料 转自:http://blog.csdn.net/fancylovejava/article/details/8657058 Android系统按照架构来说一共分为六个部分,因此按照自己的感受推荐一下各个部分适合的书籍,不喜勿喷. 1.Android Application <Android Developer 文档>.<Pro Android>.<Professional Android Application Development

根据Android架构分层推荐开发书籍

Android系统的架构可以分为六个部分.笔者根据自己的体会为大家推荐每个部分对应的精品书籍,不喜勿喷.  1.Android Application <Android Developer Document>.<Pro Android>.<Professional Android Application Development>.<Google Android SDK开发范例大全>. Google IO Android Documents. 2.Androi

android 开源框架推荐

同事整理的 android 开源框架,个个都堪称经典.32 个赞! 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduling) (3)  网络请求的优先级处理 (4)  缓存 (5)  多级别取消请求 (6)  和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.android-async-http  项目地址:ht

Android设计模式—策略模式

1.策略模式概念 定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换.策略模式主要是管理一堆有共性的算法,客户端可以根据需要,很快切换这些算法,并且保持可扩展性. 策略模式的本质:分离算法,选择实现. 2.策略模式实现 下面针对策略模式说一个小型的实现例子,个人觉得学习设计模式,最好的方法是看看设计模式概念,然后先看看简单的模式实现的例子.策略模式实现起来,主要需要3部分:抽象接口.实现算法.上下文. //算法的接口 public interface PriceStrategy {