我所理解的Android模块化(三)——模块可插拔单独编译运行

版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams https://blog.csdn.net/finddreams/article/details/78354209

此文属于finddreams的原创博客,转载请注明出处:http://blog.csdn.net/finddreams/article/details/78354209

  《我所理解的Android模块化(一)——概念和路由》
  《我所理解的Android模块化(二)——模块通信和模块间服务调用》
  《我所理解的Android模块化(三)——模块可插拔单独编译运行》
  《我所理解的Android模块化(四)——常见问题和注意事项》

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

单一模块的独立编译运行

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

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

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

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

  sourceSets {
        main {
            if (!isNeedUserModule.toBoolean()) {
                manifest.srcFile 'src/main/app/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/module/AndroidManifest.xml'
            }
        }

    }

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

isNeedUserModule=true
#isNeedUserModule=false

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

if (!isNeedUserModule.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

  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:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.finddreams.module_user">

    <application>
        <activity
            android:name=".LoginActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

  module目录下的AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.finddreams.module_user" >
    <application>
        <activity android:name=".LoginActivity"></activity>
    </application>

</manifest>

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

  <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>

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

  if (isNeedUserModule.toBoolean()) {
        compile project(':module_user')
    }

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

本文已授权开发者技术前线 独家发布 侵权必究

猜你喜欢

转载自blog.csdn.net/finddreams/article/details/78354209
今日推荐