zoukankan      html  css  js  c++  java
  • Android项目实战(四十八):架构之组件化开发

    什么要组件化开发?

    看一下普通项目的结构 , 一个项目下有多个Module(左侧图黑体目录),但是只有一个application,0个或多个library(在每个medel下的build.gradle文件下可以看到)。

    apply plugin: 'com.android.application'
    
    apply plugin: 'com.android.library'

    这样架构的缺点:

    1、每一次编译都是编译整个项目,项目大的时候编译几分钟几分钟的浪费

    2、业务集中,修改一处可能需要注意别处会影响的部分,需要开发人员都尽可能的熟悉整个项目代码。

        

     组件化开发即:

     开发期间(组件模式),将每一个Module都作为一个application , 使其可以单独编译,运行。

     发布时(集成模式),只留一个application(app壳) , 其他的Module都作为library。

     组件化的优点:

     1、加快编译效率,单个组件可以单独编译,运行,不需要再每次都编译运行整个项目,大大减少开发时间。

     2、降低开发成员熟悉项目的成本,只需要熟悉负责模块的代码即可,不需要熟悉整个项目的代码。

     3、控制代码权限,开发人员只可以控制部分模块的代码,不会影响到他人的代码,提高整体开发效率。

     4、组件模式中,各个组件基本是相互独立的。

    如何组件化开发?

    一、组件模式和集成模式的转换

    首先,Module分为两种类型:
    
    1、application属性,可以独立运行的Android程序,通常是默认创建的app
    
    apply plugin: ‘com.android.application’
    
    2、library属性,不可以独立运行,一般是Android程序依赖的库文件
    
    apply plugin: ‘com.android.library’

    这两种类型可以在各个Module里面的build.gradle 文件中设置

     很显然,当组合模式开发的时候,每个组件设为application,集成模式的时候,只留一个application,其他都为library。

     方式知道了,接下来实现,当很少的每个组件的时候,我们可以手动控制每一个每个组件的类型,但是多了的情况下就显得很麻烦了。

     解决方式就是使用项目根目录下的gradle.properties文件,因为项目中所有的build.gradle文件都可以获取gradle.properties的常量,所以只需要写一个参数,例如:isModule = false (注意的是gradle.properties中所有的数据类型都是String)

     接下来除了壳组件的其他所有build.gradle里面只需要根据这个参数来控制类型即可:

    if (isModule.toBoolean()) {
        apply plugin: 'com.android.application'
    } else {
        apply plugin: 'com.android.library'
    }

     经过上面的流程我们就可以很轻松的控制项目当前是集成模式还是组件模式。

    二、AndroidManifest合并问题

    相对于application和library对应的AndroidManifest文件内容是不同的,所以每一个组件需要根据当前是集成模式还是组件模式来动态的更换对应模式下的AndroidManifest.xml文件

    所以我们只需给除了壳(一般是app目录)以外的其他组件的目录下再添加一个AndroidManifest.xml 文件  该文件写成 application对应的内容即可。

    举例:

    我们可以在组件目录下的main下添加一个module文件夹,添加一个application对应的AndroidManifest.xml

        

     这样对于一个组件,就有两个AndroidManifest.xml 文件了,一个内容对应application ,一个内容对应library

     接下来只需要和切换集成模式和组件模式一样,动态控制用哪一个即可。

     在组件下的build.gradle下添加代码:

      sourceSets {
            main {
                if (isModule.toBoolean()) {
                    manifest.srcFile 'src/main/module/AndroidManifest.xml'
                } else {
                    manifest.srcFile 'src/main/AndroidManifest.xml'
                }
            }
        }

      注意application和library的AndroidManifest.xml 内容:

     application下的:

     

     library下的:

     

     -----------------------------------------------------------------------------------------------------------------------

     未完待续。。。

  • 相关阅读:
    Asp.Net多线程用法1
    Asp.Net操作FTP方法
    django 利用PIL 保存图片
    django —— Celery实现异步和定时任务
    豆瓣源安装requirements.txt
    一个有趣的python排序模块:bisect
    Python 多线程
    python list元素为dict时的排序
    python版本坑:md5例子(python2与python3中md5区别)
    单独的 python 脚本文件使用 django 自带的 model
  • 原文地址:https://www.cnblogs.com/xqxacm/p/9203094.html
Copyright © 2011-2022 走看看