文章目录

  • 一、组件模式下为组件 Module 指定 Java 源码路径
  • 二、主应用的角色
  • 三、BuildConfig 中生成当前 组件 / 集成 模式字段
  • 四、Library Module 中的代码示例
    • 1、build.gradle 完整代码
    • 2、集成模式 下的 清单文件
    • 3、组件模式 下的 清单文件
    • 4、组件模式 下的 Application 类
  • 五、博客资源

一、组件模式下为组件 Module 指定 Java 源码路径


在 111 个 Android 应用中只能存在 111 个 Application 类 , 但是组件化开发时 , 如果 Library 模块动态修改成 Application 模块 , 还想自己定义一个 Application 类 , 这里参考上一篇博客 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 ) 三、使用 sourceSets 配置组件模式下使用的清单文件 章节 , 使用 sourceSets 资源配置 , 配置 Java 代码 ;

在组件模式下 , 如果需要配置一些额外的 Java 类 , 可以在 sourceSets 中进行配置 ;

Java 源文件目录 , 默认是在 " Component\app\src\main\java " 目录下 , 该目录也是可以自定义的 ;

在 sourceSets 的 main 中 , 使用 java.srcDirs 可以配置多个目录 , 路径字符串之间使用逗号隔开 ;

android {defaultConfig {if (!isModuleMode){// 组件模式 : 必须配置 applicationIdapplicationId appId["library1"]}// 资源配置sourceSets{main{if (!isModuleMode){// 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件manifest.srcFile 'src/main/component/AndroidManifest.xml'// 配置额外的 Java 源文件目录java.srcDirs 'src/main/component/java', 'src/main/java'}else{// 集成模式 下使用默认设置}}}}
}

集成模式 下的目录效果 : src/main/component/java 目录是灰色的 , 并不是 Java 源码目录 ; ( 该模式下 依赖工程 是 Library Module )

组件模式 下的目录效果 : src/main/component/java 目录是蓝色的 , 是正式的 Java 源码目录 ; ( 该模式下 依赖工程 是 Application Module )

二、主应用的角色


组件化中的主应用 , 仅作为一个壳存在 , 一般不实现实际功能 , 应用的功能都是由各个组件进行实现的 ;

在主应用的 build.gradle 中配置了如下依赖库 ;

dependencies {if (isModuleMode){// 集成模式下才能引用这两个 Library Moduleimplementation project(':library1')implementation project(':library2')}
}

如果是在 集成模式 中 , 会引入两个 Library 模块 ; 在 组件模式 中 , 两个模块是 Application 模块 , 不能引入到应用中 , 因此就不能依赖这两个 Module ;

这里就需要 主应用 与 222 个 Library 模块 的 耦合性不能太高 ;

三、BuildConfig 中生成当前 组件 / 集成 模式字段


如果想要在代码中 , 根据当前的组件化状态 ( 组件模式 / 集成模式 ) 进行不同的开发 , 就需在代码中获取当前 Module 是 Library Module ( 集成模式 ) 还是 Application Module ( 组件模式 ) ;

这里可以在 build.gradle 进行一些配置 , 在 BuildConfig.java 配置中 , 生成一些选项 , 如下代码就可以在 BuildConfig.java 类中生成 public static final boolean isModuleMode = false; 字段 ;

android {defaultConfig {// 在 BuildConfig 中生成如下字段// public static final boolean isModuleMode = false;buildConfigField("boolean", "isModuleMode", String.valueOf(isModuleMode))}
}

生成的 BuildConfig.java 类 :

/*** Automatically generated file. DO NOT MODIFY*/
package kim.hsl.library1;public final class BuildConfig {public static final boolean DEBUG = Boolean.parseBoolean("true");public static final String APPLICATION_ID = "kim.hsl.library1";public static final String BUILD_TYPE = "debug";public static final int VERSION_CODE = 1;public static final String VERSION_NAME = "1.0";// Field from default config.public static final boolean isModuleMode = false;
}

在 Java 代码中通过调用 BuildConfig.isModuleMode 获取当前 Module 是 Library Module ( 集成模式 ) 还是 Application Module ( 组件模式 ) ;

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)Log.i("MainActivity", "当前的模式状态 ${BuildConfig.isModuleMode}")}
}

四、Library Module 中的代码示例


1、build.gradle 完整代码

// 根据 isModuleMode 动态切换 集成模式 / 组件模式
if (isModuleMode){// 集成模式apply plugin: 'com.android.library'
}else{// 组件模式apply plugin: 'com.android.application'
}
apply plugin: 'kotlin-android'println("Print Variable : rootProject.ext.androidConfig : ${rootProject.ext.androidConfig}")// def 相当于 Java 中的 Object
// 声明 config 和 appId 变量 , 并为其赋值
def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationIdandroid {compileSdkVersion androidConfig.compileSdkVersionbuildToolsVersion "30.0.3"defaultConfig {if (!isModuleMode){// 组件模式 : 必须配置 applicationIdapplicationId appId["library1"]}minSdkVersion androidConfig.minSdkVersiontargetSdkVersion androidConfig.targetSdkVersionversionCode androidConfig.versionCodeversionName androidConfig.versionNametestInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"// 在 BuildConfig 中生成如下字段// public static final boolean isModuleMode = false;buildConfigField("boolean", "isModuleMode", String.valueOf(isModuleMode))// 资源配置sourceSets{main{if (!isModuleMode){// 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件manifest.srcFile 'src/main/component/AndroidManifest.xml'// 配置额外的 Java 源文件目录java.srcDirs 'src/main/component/java', 'src/main/java'}else{// 集成模式 下使用默认设置}}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget = '1.8'}
}dependencies {implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"implementation 'androidx.core:core-ktx:1.3.2'implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

2、集成模式 下的 清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.library1"><application><activity android:name=".MainActivity"/></application></manifest>

3、组件模式 下的 清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.library1"><applicationandroid:name=".Library1Application"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Component"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

4、组件模式 下的 Application 类

package kim.hsl.library1import android.app.Applicationclass Library1Application: Application() {override fun onCreate() {super.onCreate()}
}

五、博客资源


博客源码 :

  • GitHub : https://github.com/han1202012/Component
  • CSDN 下载 : https://download.csdn.net/download/han1202012/18755837

【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )相关推荐

  1. Android MVVM + Retrofit + OkHttp + Coroutine 协程 + Room + 组件化架构的Android应用开发规范化架构

    BaseDemo 介绍 BaseDemo 是Android MVVM + Retrofit + OkHttp + Coroutine 协程 + Room + 组件化架构的Android应用开发规范化架 ...

  2. android给组件加上id,Android组件化入门:一步步搭建组件化架构

    Linux编程点击右侧存眷,免费入门到精晓! 作者丨Android手艺干货分享 https://www.jianshu.com/p/73b4fc288dd8 1.媒介 比来因为买卖需求调换,有考虑采用 ...

  3. 三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放

    一.什么是组件化? 人面对复杂问题的处理方式: 任何一个人处理信息的逻辑能力都是有限的 所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容. 但是,我们人有一种天生的能力,就是将问题 ...

  4. vue学习-v-if v-for优先级、data、key、diff算法、vue组件化、vue设计原则、组件模板只有一个根元素、MVC.MVP,MVVM

    1:v-if和v-for哪个优先级更高?如果两个同时出现,应该怎么优化得到更好的性能? //在vue页面中 同时使用v-for与v-if后,打印渲染函数. console.log(app.$optio ...

  5. vue 富文本编辑器 quill (含代码高亮、自定义字体、汉化、鼠标悬浮提示、组件封装等)

    基本使用 安装依赖 npm i quill .vue文件 <div ref="editor" :style="finalStyle"></di ...

  6. Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)

    (一) 组件化开发思想 1. 现实中的组件化思想体现 组件化即是对某些可以进行复用的功能进行封装的标准化工作 标准:要想组件能够成功组合在一起,每个组件必须要有标准 分治:将不同的功能封装到不同的组件 ...

  7. Vue(组件化编程:非单文件组件、单文件组件)

    一.组件化编程 1. 对比传统编写与组件化编程(下面两个解释图对比可以直观了解) 传统组件编写:不同的HTML引入不同的样式和行为文件 组件方式编写:组件单独,复用率高(前提组件拆分十分细致) 理解为 ...

  8. [Android]用架构师角度看插件化(3)-Replugin 需要占坑跳转?

    一.占坑 什么是占坑?为什么要占坑? Android插件化中,从一个插件Activity跳转到不同插件的Activity的时候,是否可以能正常跳转成功? 声明Activity需要配置什么? 声明Act ...

  9. 【Android 插件化】插件化技术弊端 ( 恶意插件化程序的解决方向 | 常用的插件化虚拟引擎 )

    文章目录 一.插件化技术弊端 二.恶意插件化程序的解决方向 三.常用的插件化虚拟引擎 一.插件化技术弊端 在之前的 Android 应用中 , 部分黑客将应用破解 , 植入自己的恶意代码 , 然后进行 ...

最新文章

  1. clion 查看内容窗口_了解Photoshop文档窗口(3)
  2. CSS定位布局display/float/position属性之间的关系/区别和如何使用取值行为机制
  3. Linux网络参数设置
  4. oracle删除排序数据库,数据库的数据操作:增删改查和排序
  5. 众说纷“云”,看生态驱动工业物联网落地
  6. Mysql数据库分库和分表方式(常用)
  7. PXE网络装机和kickstart无人值守
  8. 阿里2018校招编程题
  9. 在线批量将gps经纬度坐标转换为百度经纬度坐标
  10. 电商商城小程序项目完整源码(微信小程序)
  11. iOS修改手游服务器数据,IOS免越狱游戏存档修改教程】成长王国Grow Kingdom为例
  12. 从程序员到CTO的Java技术路线图
  13. 云计算与虚拟化是什么关系
  14. 2分钟入侵网站全程实录
  15. 67.Python修炼之路【72-前端-HTML列表】2018.06.28
  16. 《辩证行为疗法》精华部分 + 我的理解
  17. Vue 模板语法、事件和表单使用
  18. 综述:视频和图像去雾算法以及相关的图像恢复和增强研究
  19. Python 计算思维训练——输入和错误处理练习(一)
  20. 深入学习OpenCV中图像相似度的算法

热门文章

  1. 两道相似题——water-easyJavabeans
  2. Opencv中cvCopy() 和cvCloneImage()的区别
  3. python爬虫(五)_urllib2:urlerror和httperror
  4. Java代码-CPU占用过高排查思路
  5. Mac怎么刷新DNS缓存
  6. layui进度条bug
  7. 我总结的js性能优化的小知识
  8. 赴美工作常识(Part 4 - 面试)
  9. 浅析jQuery的链式调用 之 each函数
  10. luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra