赞
踩
模块化开发思路就是:单独开发每个模块,用集成的方式把他们组合起来,就能拼出一个app。app可以理解成很多功能模块的组合,而且有些功能模块是通用的,必备的,像自动更新,反馈,推送,都可以提炼成模块,和搭积木很像,由一个壳包含很多个模块。
模块升级会单独升级,升级的时候往往不只是增加资源,有时候会去删资源,这样做和其它的模块的资源不掺乎,我用umeng的自动更新sdk时就需要我连着资源一块进来,加进来容易以后不想用umeng的了再挑出去就很费事了。再假如push开始用的百度的后来换成极光的,对app的组合者其实是不关心的,对他影响很小。解耦很好。如果是主力带实习生这种开发的话,核心代码就不用和他们分享,让他们去做独立的功能,做好直接调用就行。以后整理代码,重构什么的都只重构这个模块的代码,他们不会不小心改了核心代码。
1407686-2a3990b4b781784e.png
1407686-0635652ee1b4040b.png
命名建议:
底层:Library
中间层:Module + 业务或功能名字
上层:App + 项目名字
建议分层进行
fresco
,数据库相关等,还包含所有模块需要的依赖库;进行Android 模块化开发前先复习一个基础知识,介绍一下 Studio 项目结构。
QQ截图20161114100811.png
将所需的模块在对应项目的Project
目录下拷贝出来,粘贴到要开发的项目的Project
根目录下即可。也可以直接在project
下新建一个Module
。
File --> New --> New Module --> Android Library (建议选择这个) --> Finish
一个模块这样就创建完成了。默认的名字是app
,根据项目的需要将模块的名字进行修改,直接Refactor > Rename...即可
1479092110399.png
设置setting.gradle 中
include ':projectName'
设置后发现项目目录下增加了一个模块
QQ截图20161114111017.png
对weather
模块下的build.gradle
进行sync操作后,
QQ截图20161114111211.png
蓝色小茶杯变成了小手机的图标
在主模块的build.gradle中设置
- dependencies {
- ...
- compile project(':projectName')
- ...
- }
<font color=red>组件化不是插件化,插件化是在[运行时],而组件化是在[编译时]。插件化是基于多APK,而组件化本质上还是只有一个APK。</font>
设置一个开关控制application
和library
状态切换
我们在开发的时候,Module
如果是一个库,会使用com.android.library
插件,如果是一个应用,则使用com.android.application
插件,接下来根据这个变量来进行判断并且实现状态切换。Project
根目录下gradle.properties
中设置变量来控制。
- asApp=false
- ...
asApp=false:表示这个模块是一个Module;
asApp=true:表示这个模块是一个app;
依赖项目中build.gradle
配置
在模块的build.gradle
的开头处设置。
- // 开头处设置
- if (IsBuildModule.toBoolean()) {
- apply plugin: 'com.android.application'
- } else {
- apply plugin: 'com.android.library'
- }
- android {
- ...
- defaultConfig {
- // library 下删除 applicationId
- if (IsBuildMudle.toBoolean()) {
- applicationId "com.qsp.weather"
- }
- ....
- }
- }
提供两套 AndroidManifest.xml
并进行动态切换
mainfest文件也需要提供两套
- android {
- ...
- sourceSets {
- main {
- if (IsBuildModule.toBoolean()) {
- manifest.srcFile 'src/main/buildModule/AndroidManifest.xml'
- } else {
- manifest.srcFile 'src/main/buildApp/AndroidManifest.xml'
- }
- }
- }
- }
-
buildModule 的 AndroidManifest.xml, activity 等在这里可以正常注册。这里注册后主程序就可以不用写了写在哪里都可以。
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.qsp.weather">
- <application
- android:allowBackup="true"
- android:supportsRtl="true">
- </application>
- </manifest>
模块化方式分两种,第一种是以aar的方式引入项目中,因为有些模块在开发中可能功能不稳定或是不成熟,以arr形式引入不方便进行修改,所以这时候就可以以模块源码的方式引入。
Android Library项目的gradle脚本在开头声明apply plugin: 'com.android.library'
执行./gradlew assembleRelease
然后在build/outputs/aar
文件夹里生成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')
- }
作者:路Promenade
链接:https://www.jianshu.com/p/0ea37b2c7ce7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。