模块化浅谈:
1、安卓模块化开发介绍:

模块化开发思路就是:单独开发每个模块,用集成的方式把他们组合起来,就能拼出一个app。app可以理解成很多功能模块的组合,而且有些功能模块是通用的,必备的,像自动更新,反馈,推送,都可以提炼成模块,和搭积木很像,由一个壳包含很多个模块。
2、模块化开发的好处:
我们的应用在更新的时候有时候并不需要整个应用一起更新,这样为了一个很小的更新,却要动辄修改整个项目,这样无疑是非常浪费资源的。
模块化开发的好处就是我们可以单独去升级某个模块,升级的时候往往不只是增加资源,有时候会去删资源,这样做和其他的模块的资源不会掺和,比如push开始用的百度的后来换成极光的,对app的组合者其实是不关心的,对他影响很小。解耦很好。
如果是主力带实习生这种开发的话,核心代码就不用和他们分享,让他们去做独立的功能,做好直接调用就行。以后整理代码,重构什么的都只重构这个模块的代码,他们不会不小心改了核心代码。
模块化开发的架构分层:



命名建议:

**底层:**Library
**中间层:**Module + 业务或功能名字
**上层:**App + 项目名字

建议分层进行
**底层:**包含基础库和底层库
基础库:
包含所有模块需要的依赖库,以及一些工具类,比如封装了的常用网络请求,封装图片处理fresco,数据库相关等,还包含所有模块需要的依赖库;
底层库:
主要是使用C/C++开发的跨平台的引擎或者库,以so的形式存在。例如:游戏引擎cocos2d
中间层
首先、分模块肯定要按照功能分,独立的一个功能,不能杂。比如、更新、登录、分享、播放,都可以。
其次、我采取aar的形式作为模块的最小单位,为什么是aar不是jar,更不是library,因为jar不能带资源只能带java代码,library的话太容易被修改了,aar的好处是能带资源并且是编译好的,不能被修改。保证了模块的版本不会在被别人调用的时候随意修改,如果想修改就要联系做aar的人,让他去升级aar的版本。
用android studio,打aar用maven;aar其实就是依赖,只不过之前的依赖都是存到了maven远程库里,自己用的话可以自己建和私有的maven库,太蛮烦的话可以直接用本地的aar文件做依赖。
上层
将所有的业务模块聚合在一起,加上配置,形成主应用,一个模块化做的好的应用,主应用应该很简单,并且非常的稳定。

如何进行Android 模块化开发
进行Android 模块化开发前先复习一个基础知识,介绍一下 Studio 项目结构。

MyApplication 整个项目目录
app 项目中app模块目录
settings.gradle 定义项目包含哪些模块
app/build/ app模块build编译输出的目录
app.iml app模块的配置文件
External Libraries 项目依赖的Lib,编译时自动下载的
可以看出 Studio 新建的项目自身就是一个模块化项目,MyApplication 是整个项目,而app是一个模块,所以在后续自行增加更多的功能模块。

接下来我们开始分析模块化的步骤:
一.创建 Module 模块;
将所需的模块在对应项目的Project目录下拷贝出来,粘贴到要开发的项目的Project根目录下即可。也可以直接在project下新建一个Module。

File --> New --> New Module --> Android Library (建议选择这个) --> Finish
一个模块这样就创建完成了。默认的名字是app,根据项目的需要将模块的名字进行修改,直接Refactor > Rename…即可

二.将 Module 模块引入主项目中;
设置setting.gradle 中(这里只需要查看一下就好,studio已经为我们配置好了)

include ':projectName'

设置后发现项目目录下增加了一个模块

接下来我们开始配置模块化之间的关联:

1、在gradle.properties配置

# 开启并行编译
org.gradle.parallel=true
# 开启编译守护进程
org.gradle.daemon=true
# 标识模块的运行模式 true标识作为Module,否则表示作为Applicaiton运行
IS_MODULE = trueMIN_SDK_VERSION=16
COMPILE_SDK_VERSION=28
TARGET_SDK_VERSION=28

2、在项目的buildgradle写(也就是大buildgradle下

ext {compileSdkVersion = COMPILE_SDK_VERSION.toInteger()minSdkVersion = MIN_SDK_VERSIONtargetSdkVersion = TARGET_SDK_VERSIONisModule = IS_MODULE.toBoolean()
}


3、便于统一管理

 //这个没有快捷键,也提示不出来compileSdkVersion rootProject.ext.compileSdkVersionminSdkVersion rootProject.ext.minSdkVersiontargetSdkVersion rootProject.ext.targetSdkVersion

如下图:

4、做模块间的配置,app主模块不需要配置。

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

5、接下来我们分析模块间的关联。
我们若需要将两个模块关联起来,则只需要添加一句,假设我们app要关联baselibrary:

api project(':baselibrary')

在app的build.gradle中设置

 if (isModule) {api project(':baselibrary')api project(':testonemodel')api project(':testdemothree')}



那么到这里模块间的关联也就完成了,我们也可以互相调用了。但是我们模块间的通信又该怎么办呢,我们接下来介绍路由跳转的配置:

1、在各大模块中的buildegradle配置

  javaCompileOptions {annotationProcessorOptions {includeCompileClasspath = truearguments = [ AROUTER_MODULE_NAME : project.getName() ]}}


2、导入路由的依赖

api 'com.alibaba:arouter-api:1.4.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

这里需要注意,api其实相当于public的意思 而annotationProcessor ‘com.alibaba:arouter-compiler:1.2.2’ 这个依赖需要在每个模块都配置,放心配置,不会产生依赖冲突

//Android模块化开发,每一个模块配置一遍
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

3、在app的myapplication中初始化

   if (BuildConfig.DEBUG) {    // 这两行必须写在init之前,否则这些配置在init过程中将无效ARouter.openLog();     // 打印日志ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)}ARouter.init(this);// 尽可能早,推荐在Application中初始化


命名尽量规范

@Route(path = "/app/maintwo")

路由跳转格式

ARouter.getInstance().build("/app/maintwo").navigation();


记得在清单中配置application(模块内的activity注册在本模块中的清单文件中)

在你app下写个activity测试一下是否能在模块之间跳转
各模块间的路径不要一样,不然会存在路径错误
到这里模块间的关联,以及通信就完成了。已经可以开始进行项目开发了
‘一定要记得清单文件注册application’

接下来进行一些拓展:
Project 中模块以 aar 方式引入;
模块化方式分两种,第一种是以aar的方式引入项目中,因为有些模块在开发中可能功能不稳定或是不成熟,以arr形式引入不方便进行修改,所以这时候就可以以模块源码的方式引入。
1.导出 aar;
Android Library项目的gradle脚本在开头声明
apply plugin: ‘com.android.library’
执行./gradlew assembleRelease然后在build/outputs/aar文件夹里生成aar文件
2.引用本地的aar;
生成aar之后下一步就是如何引用本地的aar文件?本地的aar文件并没有像引用jar文件这么简单,官方也没有提供解决方案。好在国外的一些前辈总结出了方法,下面就以test.aar文件为例来详述下方法。
1.把aar文件放在一个文件目录内,比如就放在libs目录内
2.在app的build.gradle文件添加如下内容

repositories {flatDir {dirs 'libs' //this way we can find the .aar file in libs folder}
}

3.之后在其他项目中添加一句gradle依赖便方便的引用了该library

dependencies {compile(name:'test', ext:'aar')
}

Android 模块化开发过程中遇到的问题
1.资源名冲突;
Android Studio 默认 library 的所有的 resource 为 public , 所以在模块化开发过程中总会遇到资源冲突问题。列出两种解决方法。
方法一:
保护某些 resources 不被外部访问,可以创建res/values/public.xml,因为 public 是关键词,搜易需要用 new file 的方式创建。至少添加一行,为添加的视为 private。

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

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

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

2.重复依赖;
将所有的依赖都写在library层的module,将所有的依赖同意成一个入口给上层的app去引用。
3.控制台报错解决;

Error:Module 'qsp_release:libLive:unspecified' depends on one or more Android Libraries but is a jar

报这个错误的场景,Moudle A 的build.gradle下

apply plugin: 'java'
...
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile project(':library')...
}

可以看出 Moudle A 是一个jar形式的依赖模块,而library是apply plugin: 'com.android.library’所以引用报如上错误。

关于Android模块化开发介绍及使用相关推荐

  1. linux wifi开发书籍,Android WIFI开发介绍.pdf

    Android WIFI开发介绍: WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整个模块的核心.WifiSe ...

  2. Adreno GPU上Android 游戏开发介绍 (2)

    Adreno GPU上Android 游戏开发介绍(2) 高通真HDR 介绍 高动态范围 (HDR) 广色域 (WCG) 色量 显示技术 光显示概述 HDR10 颜色体积映射 高通真HDR 介绍 HD ...

  3. Android多媒体开发介绍

    Android多媒体开发介绍 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3. ...

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

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

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

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

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

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

  7. Android蓝牙开发介绍

    蓝牙(BlueTooth)是一种无线技术标准,是当今移动终端最流行的三种数据传输方案之一,其余两种是WiFi和NFC(由于红外传输只能是直线传输,故更多地用于遥控器等设备,不适合数据传输).蓝牙的传输 ...

  8. Android wifi开发介绍

    WIFI 模块 初始化 在 SystemServer 启动的时候,会生成一个 ConnectivityService 的实例, try { Log.i(TAG, "Starting Conn ...

  9. Android简单的模块化开发

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

最新文章

  1. Python 闭包相关之late binding机制
  2. AdminStudio功能模块与版本信息总结
  3. 程序员们,今天就让她陪你们放松一下吧。她还有大宝剑哦。【原创】
  4. c语言,c++求最大公因数与最小公倍数方法集合
  5. Axure经典实例高保真交互下载(微信元件高保真交互库+微信原型交互+安卓设备模板含登录注册引导欢迎流程+ios苹果设备模板)
  6. 20172324 2018-2019-1 《程序设计与数据结构》第三周学习总结
  7. 博途v14电脑要求_博途v15对电脑配置要求
  8. 【转载】C++ Interesting卡常数
  9. 瘦了红颜, 多了寂寞
  10. 选择结构与分支结构 计算器的实现
  11. 设计模式【2.1】-- 简单工厂模式怎么演变成工厂方法模式?
  12. 系统学习机器学习之特征工程(一)--维度归约
  13. linux ora-39002,ORA-39002:invalidoperation
  14. 如何让表格中的一列按照公式计算机,excel设置一列运用相同类型的公式的两种方法...
  15. JS中[].slice.call的理解
  16. 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】
  17. 数如何避免数据存储安全存在五大灾难?
  18. 【智能硬件】RV1126 CE 板软件指导
  19. python实现商品管理系统_python实现超市商品销售管理系统
  20. win10别人ping不通我的电脑解决方案

热门文章

  1. 电脑怎么显示我的桌面
  2. 【CentOS 7】安装问题- U盘安装及显示器显示“输入信号超出范围
  3. 微博四季度财报发布!赚钱能力很强,但更值得关注的是用户增长
  4. 谷歌眼镜:可穿戴电脑的实例
  5. 更快用计算机名,中国最快的计算机是什么名称?
  6. 分享88个ASP江湖论坛源码,总有一款适合您
  7. Android Tint着色器
  8. 使用 Rancher 进行首次金丝雀部署
  9. 【CSS】设置文字不能被选中解除限制
  10. 从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端