模块化开发适合于大型项目中多人协同开发,每个人独立开发某个模块,单独测试,单独维护,最终以library或者aar或者module的形式被应用层module依赖
image.png这是一张模块化开发的分层图片
module.png命名建议:
1.底层:Library
2.中间层:Module + 业务或功能名字
3.上层:App + 项目名字
建议分层进行
-
底层:包含基础库和底层库
- 基础库:
包含所有模块需要的依赖库,以及一些工具类,比如封装了的常用网络请求,封装图片处理fresco,数据库相关等,还包含所有模块需要的依赖库; - 底层库:
主要是使用C/C++开发的跨平台的引擎或者库,以so的形式存在。例如:游戏引擎cocos2d
- 基础库:
-
中间层
- 首先、分模块肯定要按照功能分,独立的一个功能,不能杂。比如、更新、登录、分享、播放,都可以。
- 其次、我采取aar的形式作为模块的最小单位,为什么是aar不是jar,更不是library,因为jar不能带资源只能带java代码,library的话太容易被修改了,aar的好处是能带资源并且是编译好的,不能被修改。保证了模块的版本不会在被别人调用的时候随意修改,如果想修改就要联系做aar的人,让他去升级aar的版本。
用android studio,打aar用maven;aar其实就是依赖,只不过之前的依赖都是存到了maven远程库里,自己用的话可以自己建和私有的maven库,太蛮烦的话可以直接用本地的aar文件做依赖。
-
上层
将所有的业务模块聚合在一起,加上配置,形成主应用,一个模块化做的好的应用,主应用应该很简单,并且非常的稳定。
模块化开发最容易出现的就是依赖冲突,以下是解决依赖冲突的一些建议
1.例如上面的项目,moduleA和moduleB都被app层依赖,而moduleA和moduleB都有如下资源
<resources>
...
<string name="confim">点击确认</string>
...
</resources>
app层中引用
// app模块
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="@string/confim"
/>
此时如果编译app,则app就会报资源名称冲突
解决办法比较容易,每个子模块给资源名添加前缀,具体做法是在每个子模块的build.gradle文件的android块内添加一行代码:resourcePrefix “资源名前缀”:
// moduleA模块的build.gradle文件
...
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
resourcePrefix "module_A"
...
}
...
// moduleB模块的build.gradle文件
...
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
resourcePrefix "module_B"
...
}
...
此时还不行,还需要我们手动去改一下资源名称,给前面加上前缀
// moduleA模块
<resources>
...
<string name="moduleA">confim</string>
...
</resources>
// moduleB模块
<resources>
...
<string name="moduleB">confim</string>
...
</resources>
2.重复依赖
Error:Module 'qsp_release:libLive:unspecified' depends on one or more Android Libraries but is a jar
1.方法一:
通过gradle配置
dependencies { provided fileTree(dir: 'libs', include: ['*.jar'])}
2.方式二:
右键module选择open module setting,选择要修改的module名,切换到dependencies页面,将要修改的jar的scope修改provided模式。
网友评论