Android模块化(三)——模块可插拔单独编译运行
来源:互联网 发布:调度算法计算题 编辑:程序博客网 时间:2024/05/20 14:20
转自:
此文属于finddreams的原创博客,转载请注明出处:http://blog.csdn.net/finddreams/article/details/78354209
下面主要来讲一下单一模块的独立编译运行和插拔式的集成。
单一模块的独立编译运行
模块化的好处之一就是单一模块可以独立的开发编译运行安装到用户的手机上,这样就方便了对某一模块的单独开发调试,单一模块生成的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 ,参考示例项目加深你对模块化的理解。
- 我所理解的Android模块化(三)——模块可插拔单独编译运行
- Android模块化(三)——模块可插拔单独编译运行
- android单独模块编译
- 单独编译Android模块
- 单独编译android模块
- 单独编译Android app模块
- 单独编译android某模块
- Android系统 编译单独模块
- android 单独编译某个模块
- Android源码编译(三)单独编译webkit
- 如何单独编译Android源代码中的模块
- 如何单独编译Android源代码中的模块
- 如何单独编译Android源代码中的模块
- 如何单独编译Android源代码中的模块
- 如何单独编译Android源代码中的模块
- 如何单独编译Android源代码中的模块
- 如何单独编译Android源代码中的模块
- 如何单独编译Android源代码中的模块
- 谷歌浏览器Chrome安装json格式化插件(可以进行谷歌搜索)
- glog增加日志删除功能,定时删除旧文件
- POI根据docx文件生成word文档(jeesite)
- 自己用的C#基础学习笔记(二)——C#面向对象(2)
- RocketMQ原理解析-namesrv
- Android模块化(三)——模块可插拔单独编译运行
- 数据库索引的创建 和 注意事项
- 单个、双个正态分布区间估计--R code
- 仿微信长按菜单
- Spark RDD的缓存 rdd.cache() 和 rdd.persist()
- Combination Sum (lintcode 135)
- RocketMQ原理解析-Remoting2. 通信层底层传输协议
- MVP解绑
- vue 项目上传到git 提交到测试服