概述

单独开发每个模块,用集成的方式把他们组合起来,拼出一个app。如通用的模块,自动更新的模块,反馈模块,推送模块都可以单独以模块来开发,最后进行集成。我们可以通过一个壳来包含很多个模块。

好处

可以单独升级模块。耦合度低。同时,也很好地解决了“牵一发而动全身”的问题。方便分工。与其他团队合作时,如外包的团队,可以很好的地将核心代码与外包部分隔离开,不用和他们分享核心代码,让他们去做独立的功能,做好直接调用就行。方便以后重构代码,不用担心会改到核心代码。

架构分层

  • 顶层
    将所有的业务模块聚合在一起,加上配置,形成主应用。一个模块化做得好的应用,主应用都会比较简单且稳定。
  • 中间层
    模块按照功能划分。比如app可以划分为更新、登录、分享、播放等模块。采用aar作为模块的最小单位,之所以选择aar是因为jar不能带资源只能带java代码,library太容易被修改。aar的好处是能带资源并且是编译好的,不能被修改。保证了模块的版本不会在被别人调用的时候随意修改,如果想修改就要联系做aar的人,让他去升级aar的版本。
    在android studio里,用maven打包aar。aar其实就是依赖。
  • 底层:包含基础库和底层库
    (1)基础库:包含所有模块需要的依赖库,以及一些工具类,比如封装了的常用网络请求,封装图片处理fresco,数据库相关等,还包含所有模块需要的依赖库;
    (2)底层库:主要是使用C/C++开发的跨平台的引擎或者库,以so的形式存在。

Android Studio 项目结构

  • MyApplication 整个项目目录
  • MyApplication/build.gradle是整个项目的gradle构建脚本
  • MyApplication/gradle.properties是整个项目的gradle设置
  • MyApplication/MyApplication.iml是整个项目的配置文件
  • MyApplication/settings.gradle是定义整个项目包含哪些模块
  • app项目中app模块目录
  • app/build/是app模块build编译输出的目录
  • app/app.iml是app模块的配置文件
  • app/.gitignore是app模块的版本管理忽略文件
  • app/build.gradle是app模块的gradle构建脚本
  • app/proguard-rules.pro是app模块的混淆文件
  • External Libraries 项目依赖的Lib,编译时自动下载的

Android Studio 新建的项目自身就是一个模块化项目。因为MyApplication 是整个项目,而app是一个模块。可以在后续自行增加更多的功能模块。

在Android Studio进行模块化开发

1.创建 Module 模块
有两种方式。
方式一:针对已存在的模块,只需要将模块复制到项目的根目录(如上面的MyApplication目录)下即可。这种方式需要在根目录下的setting.gradle文件中设置一下,格式:

include ':projectName'

方式二:直接在project下新建一个Module。操作步骤:

File --> New --> New Module --> Android Library (建议选择这个) --> Finish

这种方式会自动在根目录下的setting.gradle文件中设置。

如:

在主模块app模块的build.gradle中设置:

dependencies {...implementation project(path: ':modulea')
}

模块中 application 和 library 状态切换配置

组件化插件化是两个不同的概念。插件化作用在“运行时”,而组件化作用在“编译时”。插件化是基于多APK,而组件化本质上只有一个APK。
(1)用一个属性来控制gradle构建插件的切换。 如果我们创建的Module是要作为一个库library来给别的模块使用,那么就应该使用com.android.library这个gradle插件来构建。如果我们Module是一个应用,而不是插件,那么就要使用com.android.application这个gradle插件来构建。我们可以在gradle.properties文件(在根目录下)来配置一些属性,然后在各个Module的build.gradle的构建脚本里就可以根据这属性来判断要使用哪个插件,如:
gradle.properties

# false表示是集成化开发模式,true表示是组件化开发模式
isModule = false

isModule = false:表示这个模块是一个Module(插件);
isModule = true:表示这个模块是一个app(组件);

(2)在模块的build.gradle文件中使用isModule属性。

在modulea模块的build.gradle中使用isModule来判断要使用哪个构建脚本插件:

if(isModule.toBoolean()){apply plugin: 'com.android.application'
}else{apply plugin: 'com.android.library'
}
android {...defaultConfig {...// library下删除applicationId// 如果是组件就要给一个applicationIdif(isModule.toBoolean()){applicationId "com.wong.modulea"}}
...
}

(3)提供两套 AndroidManifest.xml并进行动态切换


android {...sourceSets {main{// 应用if(isModule.toBoolean()){manifest.srcFile 'src/main/buildApp/AndroidManifest.xml'}else{// 插件manifest.srcFile 'src/main/buildModule/AndroidManifest.xml'}}}
}

(组件)src/main/buildApp/AndroidManifest.xml的内容可能如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.wong.modulea" ><application><activity android:name=".WarehouseActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application></manifest>

(插件)src/main/buildModule/AndroidManifest.xml的内容可能如下:
buildModule 的 AndroidManifest.xml, activity 等在这里可以正常注册。这里注册后主程序就可以不用写了。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.wong.modulea"><application><activity android:name=".WarehouseActivity"></activity></application></manifest>

(4)在app模块的build.gradle配置如下:

dependencies {...if(!isModule.toBoolean()){implementation project(path: ':modulea')}
}

这样就完成了。

Android 模块化开发过程中可能遇到的问题

1.资源名冲突
默认情况, library 的所有的 resource 为 public , 在模块化开发过程中很容易遇到资源冲突问题。两种解决方法:
(1)保护某些 resources 不被外部访问,通过创建res/values/public.xml来完成,至少添加一行,就会被视为 private。

<resources><public name="mylib_app_name" type="string"/>
</resources>

(2)在 library 的 build.gradle 中添加 resourcePrefix , 则所有的资源须以此 prefix 开头,否则报错。注意,图片资源虽然不提示报错误,但是也需要修改名字。

android {...buildTypes {...}resourcePrefix 'my_prefix_'
}

2.依赖重复
解决方法:将所有的依赖都写在library层的module里,将所有的依赖统一一个入口给顶层的app用。

最后送上demo

谢谢阅读

Android 模块化开发相关推荐

  1. 关于Android模块化开发介绍及使用

    模块化浅谈: 1.安卓模块化开发介绍: 模块化开发思路就是:单独开发每个模块,用集成的方式把他们组合起来,就能拼出一个app.app可以理解成很多功能模块的组合,而且有些功能模块是通用的,必备的,像自 ...

  2. 使用ARouter进行Android模块化开发,详解系列文章

    @Override public void process(Postcard postcard, InterceptorCallback callback) { - // No problem! ha ...

  3. 使用ARouter进行Android模块化开发,2021年Android春招面试经历

    初始化SDK if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效 ARouter.openLog(); // 打印日志 ARouter.openDe ...

  4. Android多模块覆盖率,Android模块化开发中统计aar库的代码覆盖率

    现在android 开发都喜欢用模块化的方式,然后以aar文件的方式导入到主项目,但是这对于统计代码覆盖率就有点麻烦了,因为统计时候都忽略这些第三方库,那么我们如何将这些aar文件纳入到代码覆盖率的统 ...

  5. Android简单的模块化开发

    1.为什么要模块开发 1.解耦性强:随着业务的增多,代码变的越来越复杂,每个模块之间的代码耦合变得越来越严重,解耦问题急需解决. 2. 编译时间大大减少:以为业务场景对,代码越来越大,同时编译时间也会 ...

  6. Android模块化和组件化开发

    目录 一.模块化介绍 1.1:模块化简介 1.2:模块化和组件化的区别 1.3:模块化的优点 1.4:模块化的层级介绍 二.如何实现组件化 2.1:实现模块化需要解决的问题 2.2:各个问题的解决方法 ...

  7. Android - 组件化、模块化开发

    转载请注明出处:https://blog.csdn.net/mythmayor/article/details/107184467 一.组件化与模块化介绍 组件化 组件:最初的目的是代码重用,功能相对 ...

  8. 码农人生——从未学过Android如何开发Android App 案例讲解-第002期案例

    标题有点晃眼,本次分享是002期博文的实践故事,不会有任何代码.也不会教别人android 如何开发,类似博文已经有大批大批,而且还会有陆陆续续的人写,我写的文章,主要是经验之谈,希望总结出的一些方法 ...

  9. web前端模块化开发_真正的模块化Web应用程序:为什么没有开发标准?

    web前端模块化开发 OSGI , SpringSource , Jboss模块 ,J2EE和清单永远不会结束.所有这些技术都向他们的最终用户/开发人员保证了相同的东西,或多或少是Java模块化Web ...

  10. Android 多进程开发

    前言 正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行.但是如果需要将某些组件(如Servic ...

最新文章

  1. 概率统计笔记: 卡方分布(介绍)
  2. UNIX再学习 -- 信号处理
  3. apache的rewrite规则无法加载问题
  4. [分享]Host文件的原理解释及应用说明
  5. 数据之路 Day5 - Python基础5
  6. 英国出土1600年前的文物,上面居然刻着简体中文?!
  7. virtualenv创建独立的Python环境
  8. JS实现子类调用父类的同名函数函数
  9. python爬虫作业帮_【Python爬虫】01作业
  10. symbian VC环境配置及其helloword详解
  11. 使用DX查看系统配置
  12. 【Qt】x509证书操作之获取证书链并验证
  13. 安卓 文本框怎么贴近边缘_【安卓,iOS】全网最火的充电提示音教程来啦
  14. win10服务器文件夹显示不全,Win10系统文件/文件夹图标显示不正常的解决方法
  15. 二阶系统级联_IIR数字滤波器的级联型结构中每个二阶级联子系统的系数可多带带控制一对零点或极点,有利于控制系统的频响...
  16. 利用人性弱点的互联网产品(二)色欲
  17. python——今天是第几天
  18. “鸡血驱动”为CS:GO、LOL注入“强心剂”!英特尔锐炫A750显卡实测
  19. 2008-09赛季NBA直播表(cctv5 广东体育)
  20. 苹果平板怎么卸载软件_苹果手机需要关闭和卸载一些无用的软件

热门文章

  1. boost asio异步服务端实现步骤
  2. Android | Sensor.TYPE_ORIENTATION被废弃后的解决办法
  3. 目标检测之RFB-NET(论文翻译辅助阅读)
  4. selenium自动化入门之实现163邮箱发送邮件
  5. 2345手机助手 v1.2 官方版
  6. LittleVGL v7.5.0在STM32F103x上的移植
  7. SphereEx 创始人张亮荣获『2021 年度海纳奖——分布式数据库十佳实践人物』
  8. 五子棋项目结束总结_五子棋比赛活动总结
  9. 经济危机离你并不遥远!
  10. 小Q系列故事——世界上最遥远的距离