Android : Multi Module Structure

作者: 2c3d4f7ba0d4 | 来源:发表于2019-07-26 18:01 被阅读10次

    对于一个 Android 项目,我认为至少应该分为 4个模块。工具,基础,业务功能,App模块。

    工具模块

    请看下图:(一个小小的建议:所有模块都以 module_xxx)命名

    如上图模块中的 module_swutils 就是整个项目最常用的工具类,应该被所有项目依赖。其内容应该与项目业务无关,包括工具类,常量,等等。比如 日志模块的封装,图片加载模块的封装。并使用 ContentProvider 进行自动注册。

    object SwUtils {
        lateinit var application: Application
        fun init(application: Application) {
            SwUtils.application = application
            var isDebug = (application.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
        }
    }
    
    

    比如上面的 SwUtils, 保存全局的 Application 供本模块使用。另外建议每个模块都有唯一的 application 作为 context 使用,不用使用其他模块的。或者在每个模块用一个变量保存工具模块的 application,作为本模块使用。

    class UtilContentProvider : ContentProvider() {
        override fun query(
            uri: Uri,
            projection: Array<String>?,
            selection: String?,
            selectionArgs: Array<String>?,
            sortOrder: String?
        ): Cursor? {
            return null
        }
    
        override fun onCreate(): Boolean {
            SwUtils.init(context as Application)
            return true
        }
    
        override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>?): Int {
            return 0
        }
    
        override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
            return 0
        }
    
        override fun getType(uri: Uri): String? {
            return null
        }
    
        override fun insert(uri: Uri, values: ContentValues?): Uri? {
            return null
        }
    }
    
    

    上面使用 provider 对模块进行自动注册,这种用法很多,就不展开讲了。

    上面就是工具模块的整体结构:纯工具,与业务无关

    基础模块

    module_base 模块,我理解为基础模块。其内容包括对 Activity,Fragment,View 的基础封装, BaseActivity 之类的。另外还有一些被具体业务使用到的自定义view。此模块不建议存放xml资源,比如 string.xml (多语言)。这些资源应该放在具体用到的业务模块下。

    api project(":module_swutils")
    
    

    通过 api 的方式以来 工具模块,是的在其他模块也能使用。

    业务模块

    上面的 module_fun1, module_fun2, module_wechat 都是业务模块,具体实现项目的业务功能。

    在实现的过程中,遇到共有的部分,根据是否与业务有关,往下放入 base 或者 utils 模块。

    业务模块之间不相互依赖,组件间跳转可以使用 Arouter。

    业务模块依赖 base 模块。

    App功能

    App 作为项目的 Project,在理想的情况下应该不包含任何的业务逻辑实现,单纯只作为项目的启动模块。

    另外,除了这四个模块,可能由于工具模块或者base模块过大, 可以分一个 module_third 三方模块,用于存放对开源模块的一些封装。

    对于公司有多个项目的情况:

    由于 utils 是与业务完全无关的,因此可以维护该模块,并上传 maven 作为内部的共有模块进行使用。

    总结

    项目大致分为四个模块:

    utils:工具模块,完全与业务无关,纯函数

    base:基础模块,常用 UI 的封装,与业务有关的函数和常量,依赖上层

    funx:具体业务模块,依赖 base。

    App;壳工程,尽量不实现业务,只负责启动项目。

    有好的想法可以补充,欢迎交流。

    相关文章

      网友评论

        本文标题:Android : Multi Module Structure

        本文链接:https://www.haomeiwen.com/subject/tsgdrctx.html