Android模块化专题(三) , 模块可插拔单独编译运行

2,328 阅读4分钟
原文链接: mp.weixin.qq.com

本文是对模块化专题介绍的系列文章,包含了以下四部分:《我所理解的Android模块化(一)—概念和路由》,《我所理解的Android模块化(二)—模块通信和模块间服务调用》,《我所理解的Android模块化(三)—模块可插拔单独编译运行》,《我所理解的Android模块化(四)—常见问题和注意事项》。以连载3篇欢迎读者持续关注。

前面已经写了两篇Android模块的博客,主要讲到了模块化的跳转路由,模块间通信和模块间服务调用。  《我所理解的Android模块化(一)》;  《 我所理解的Android模块化(二)》;下面主要来讲一下单一模块的独立编译运行和插拔式的集成。

单一模块的独立编译运行

模块化的好处之一就是单一模块可以独立的开发编译运行安装到用户的手机上,这样就方便了对某一模块的单独开发调试,单一模块生成的apk体积也小,编译时间也快,开发效率会高很多。

比如前面的示例项目中我们的可以把用户中心这个模块变成可独立运行的APP,在打包发布的时候,也不需要改动即可变成library模块集成到我们要发布的主APP中去,下图是经过独立运行的用户中心模块的APP和主APP,可以同时的安装在用户手机上进行分别开发调试。

 要想实现这样的目标我们得对用户中心模块进行项目简单的改造,下图是改造之后的项目结构:

从上图中我们可以看到有两个AndroidManifest.xml,一个在app目录下,一个在module下,主要是做什么用的呢?下面先看一下在用户中心模块module_user中的build.gradle中android {}中的一段配置:

  1.  sourceSets {

  2.        main {

  3.            if (!isNeedUserModule.toBoolean()) {

  4.                manifest.srcFile 'src/main/app/AndroidManifest.xml'

  5.            } else {

  6.                manifest.srcFile 'src/main/module/AndroidManifest.xml'

  7.            }

  8.        }

  9.    }

上面的 isNeedUserModule 变量是来自项目根目录gradle.properties配置文件中的,

  1. isNeedUserModule=true

  2. #isNeedUserModule=false

isNeedUserModule变量的作用主要用来配置这个用户中心模块是不是需要集成到主的APP中去,如果是true则是集成到主APP,这个模块就会变成library库,如果是false,那么它就可以当成APP安装到用户手机上。这是因为在module_user中的build.gradle文件中加入了这样的代码来控制此库是library还是APP:

  1. if (!isNeedUserModule.toBoolean()) {

  2.    apply plugin: 'com.android.application'

  3. } else {

  4.    apply plugin: 'com.android.library'

  5. }

isNeedUserModule是true我们就把这个模块变成:’com.android.application’,清单文件 manifest使用app目录下的AndroidManifest :manifest.srcFile ‘src/main/app/AndroidManifest.xml’ ;反之则是:’com.android.library’,清单文件 manifest使用module目录下的AndroidManifest :manifest.srcFile ‘src/main/module/AndroidManifest.xml’。app 和module目录下的AndroidManifest有什么不一样呢? app中的AndroidManifest:

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"

  2.    package="com.finddreams.module_user">

  3.    <application>

  4.        <activity

  5.            android:name=".LoginActivity"

  6.            android:label="@string/app_name"

  7.            android:theme="@style/AppTheme">

  8.            <intent-filter>

  9.                <action android:name="android.intent.action.MAIN" />

  10.                <category android:name="android.intent.category.LAUNCHER" />

  11.            </intent-filter>

  12.        </activity>

  13.    </application>

  14. </manifest>

  module目录下的AndroidManifest:

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"

  2.    package="com.finddreams.module_user" >

  3.    <application>

  4.        <activity android:name=".LoginActivity"></activity>

  5.    </application>

  6. </manifest>

做Android的都知道一个APP要安装到用户的手机上,要有一个启动的页面,这个启动页的Activity需要配置intent-filter,所以app项目中的AndroidManifest 要多出这个,而module中则不需要配置:

  1.  <intent-filter>

  2.                <action android:name="android.intent.action.MAIN" />

  3.                <category android:name="android.intent.category.LAUNCHER" />

  4.   </intent-filter>

 另外在主的APP的build文件中需要加入可动态引入用户中心模块的配置:

  1.  if (isNeedUserModule.toBoolean()) {

  2.        compile project(':module_user')

  3.    }

如此我们只需要在根目录gradle.properties配置文件中的改动一下isNeedUserModule变量的参数即可实现用户模块的可插拔形式集成和独立运行。下一篇将介绍在模块化的过程中遇到的问题和注意事项;文中提到的示例项目地址为:https://github.com/finddreams/AndModulePractice ,参考示例项目加深你对模块化的理解。

作者:finddreams 

http://blog.csdn.net/finddreams/article/details/78339809

本文已独家原创发布,转载请联系原作者

相关推荐

Android模块化专题(一)- 模块化概念和路由

Android模块化专题(二)- 模块通信和模块间服务调用

App组件化与业务拆分那些事