关于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 = 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模块化开发介绍及使用相关推荐
- linux wifi开发书籍,Android WIFI开发介绍.pdf
Android WIFI开发介绍: WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整个模块的核心.WifiSe ...
- Adreno GPU上Android 游戏开发介绍 (2)
Adreno GPU上Android 游戏开发介绍(2) 高通真HDR 介绍 高动态范围 (HDR) 广色域 (WCG) 色量 显示技术 光显示概述 HDR10 颜色体积映射 高通真HDR 介绍 HD ...
- Android多媒体开发介绍
Android多媒体开发介绍 一. 多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3. ...
- 使用ARouter进行Android模块化开发,详解系列文章
@Override public void process(Postcard postcard, InterceptorCallback callback) { - // No problem! ha ...
- 使用ARouter进行Android模块化开发,2021年Android春招面试经历
初始化SDK if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效 ARouter.openLog(); // 打印日志 ARouter.openDe ...
- Android多模块覆盖率,Android模块化开发中统计aar库的代码覆盖率
现在android 开发都喜欢用模块化的方式,然后以aar文件的方式导入到主项目,但是这对于统计代码覆盖率就有点麻烦了,因为统计时候都忽略这些第三方库,那么我们如何将这些aar文件纳入到代码覆盖率的统 ...
- Android蓝牙开发介绍
蓝牙(BlueTooth)是一种无线技术标准,是当今移动终端最流行的三种数据传输方案之一,其余两种是WiFi和NFC(由于红外传输只能是直线传输,故更多地用于遥控器等设备,不适合数据传输).蓝牙的传输 ...
- Android wifi开发介绍
WIFI 模块 初始化 在 SystemServer 启动的时候,会生成一个 ConnectivityService 的实例, try { Log.i(TAG, "Starting Conn ...
- Android简单的模块化开发
1.为什么要模块开发 1.解耦性强:随着业务的增多,代码变的越来越复杂,每个模块之间的代码耦合变得越来越严重,解耦问题急需解决. 2. 编译时间大大减少:以为业务场景对,代码越来越大,同时编译时间也会 ...
最新文章
- Python 闭包相关之late binding机制
- AdminStudio功能模块与版本信息总结
- 程序员们,今天就让她陪你们放松一下吧。她还有大宝剑哦。【原创】
- c语言,c++求最大公因数与最小公倍数方法集合
- Axure经典实例高保真交互下载(微信元件高保真交互库+微信原型交互+安卓设备模板含登录注册引导欢迎流程+ios苹果设备模板)
- 20172324 2018-2019-1 《程序设计与数据结构》第三周学习总结
- 博途v14电脑要求_博途v15对电脑配置要求
- 【转载】C++ Interesting卡常数
- 瘦了红颜, 多了寂寞
- 选择结构与分支结构 计算器的实现
- 设计模式【2.1】-- 简单工厂模式怎么演变成工厂方法模式?
- 系统学习机器学习之特征工程(一)--维度归约
- linux ora-39002,ORA-39002:invalidoperation
- 如何让表格中的一列按照公式计算机,excel设置一列运用相同类型的公式的两种方法...
- JS中[].slice.call的理解
- 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】
- 数如何避免数据存储安全存在五大灾难?
- 【智能硬件】RV1126 CE 板软件指导
- python实现商品管理系统_python实现超市商品销售管理系统
- win10别人ping不通我的电脑解决方案