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

在这里插入图片描述

模块化浅谈:
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 = true

MIN_SDK_VERSION=16
COMPILE_SDK_VERSION=28
TARGET_SDK_VERSION=28

在这里插入图片描述

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

ext {
    compileSdkVersion = COMPILE_SDK_VERSION.toInteger()
    minSdkVersion = MIN_SDK_VERSION
    targetSdkVersion = TARGET_SDK_VERSION

    isModule = IS_MODULE.toBoolean()
}

在这里插入图片描述
3、便于统一管理

 //这个没有快捷键,也提示不出来
  compileSdkVersion rootProject.ext.compileSdkVersion
  minSdkVersion rootProject.ext.minSdkVersion
  targetSdkVersion 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 = true
                arguments = [ 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’所以引用报如上错误。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值