【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ② ( 组件化基本实现 | Project 相关目录 | 定义组件切换标志位 | 切换插件导入 | 切换设置应用 ID )
文章目录
在上一篇博客 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ① ( 组件化简介 | 创建组件化应用 | 依赖库模块 / 应用模块 切换设置 ) 最后提到了 在 Gradle 构建脚本中 , 需要实现 依赖库模块 / 应用模块 切换设置 , 主要涉及如下两个方面 :
- build.gradle 构建脚本 切换设置 , 切换 应用 / 依赖库 ;
- AndroidManifest.xml 清单文件 切换设置 , 设置 启动 Activity 项 ;
本篇博客开始 编写上述 Gradle 脚本 ;
GitHub 地址 : https://github.com/han1202012/Componentization
一、Project 中可获取的目录
在进行构建脚本实现之前 , 先介绍 下 Project 的相关目录 , 调用 Project 实例对象中的相关函数 , 可以获取
- 工程的根目录 ,
- 构建脚本入口所在目录 ,
- 编译目录 ,
等文件目录 , 之后需要使用到这些目录 ;
构建脚本中获取 Project 实例对象 : 在 build.gradle 构建脚本 中 , 通过调用 Project#getRootProject 函数 , 可获取 Project 实例对象 ;
/**
* <p>返回此项目所属层次结构的根项目。对于单个项目生成,此方法返回此项目。</p>
*
* @return 根项目。从不返回null。
*/
Project getRootProject();
在 Project 实例对象中 , 可获取如下三个目录 : buildDir 编译目录 , projectDir 工程目录 , rootDir 根目录 ;
- buildDir : 工程根目录 下的 build 目录 ; 只有工程编译成功 , 才会生成该 build 目录 ;
/**
* <p>返回此项目的生成目录。构建目录是生成所有工件的目录。
* 生成目录的默认值为 <code><i>projectDir</i>/build</code></p>
*
* @return 生成目录。从不返回null。
*/
File getBuildDir();
- projectDir : 通过调用 Project#getProjectDir 函数 获得 ; 下图中 工程根目录 build.gradle 顶层构建脚本 放在了该 工程的根目录 中 , 因此 projectDir 就是工程的根目录 ;
/**
* <p>包含工程构建脚本的目录, 一般是根目录。</p>
*
* @return 工程目录。从不返回null。
*/
File getProjectDir();
- rootDir : 调用 Project#getRootDir 方法 , 返回工程的根目录 ; 一般与 Project#getProjectDir 函数获取的工程目录 是同一个目录 ;
/**
* <p>返回此项目的根目录。根目录是根项目的项目目录。</p>
*
* @return 根目录。从不返回null。
*/
File getRootDir();
二、定义模块化与组件化切换标志位
在 工程根目录 中 , 创建 common.gradle 构建脚本 , 用于存放一些 扩展变量 ;
定义 isModuleDebug 变量 用于控制当前的运行模式 :
- 组件化模式 : 在 Debug 开发阶段, 每个模块都可以独立运行, 因此相关的模块都是 Application 应用模块, 此时, isModuleDebug 设置为 true. ( 单独运行 ) ;
- 模块化模式 : 在 Release 发布阶段, 只有一个壳应用是可以独立运行的, 其它所有的模块都作为依赖库存在, 此时, isModuleDebug 设置为 false. ( 非单独运行 ) ;
/**
* 定义 Project 对象的 ext 属性扩展
*/
project.ext {
/**
* 该变量控制当前的运行模式
* 在 Debug 开发阶段, 每个模块都可以独立运行, 因此相关的模块都是 Application 应用模块,
* 此时, isModuleDebug 设置为 true. ( 单独运行 )
* 在 Release 发布阶段, 只有一个壳应用是可以独立运行的, 其它所有的模块都作为依赖库存在,
* 此时, isModuleDebug 设置为 false. ( 非单独运行 )
*/
isModuleDebug = false
}
如果需要使用上述 isModuleDebug 变量 , 只需要使用 apply from: common.gradle
代码 , 在当前脚本中 引入上述 common.gradle 构建脚本即可 ;
三、切换插件导入
在模块下的 build.gradle 构建脚本 中 , 默认的 " Phone & Tablet " 类型的 Module 模块 的插件导入配置为 :
plugins {
id 'com.android.application'
id 'kotlin-android'
}
引入组件化后 ,
- 在 模块化模式 中 , 需要导入
com.android.library
插件 , 模块作为 依赖库 使用 , 是 " Android Library " 类型的 Module 模块 ; - 在 组件化模式 中 , 需要导入
com.android.application
插件 , 模块作为 可执行应用 使用 , 是 " Phone & Tablet " 类型的 Module 模块 ;
通过在 common.gradle 构建脚本 中 对 Project 类的 isModuleDebug 扩展属性配置 , 使用该属性控制当前应用是处于 模块化 还是 组件化 状态 ;
首先 , apply from 引入构建脚本的操作, 等同于将该构建脚本原封不动拷贝到此处 ; ${rootProject.rootDir}
的作用是获取工程根目录 , common.gradle 构建脚本就是定义在根目录中 ;
然后 , 根据 isModuleDebug 扩展属性 , 导入不同的 Android Gradle Plugin 插件 ,
- 如果是 组件化 导入 com.android.application 插件 ;
- 如果是 模块化 导入 com.android.library 插件 ;
构建脚本实现如下 :
/**
* rootProject.projectDir 是工程的根目录
* apply from 引入构建脚本的操作, 等同于将该构建脚本原封不动拷贝到此处
*/
apply from: "${rootProject.rootDir}/common.gradle"
if (project.isModuleDebug) {
/**
* 组件化 : 在 Debug 开发阶段, 每个模块都可以独立运行, 因此相关的模块都是 Application 应用模块,
* 此时, isModuleDebug 设置为 true. ( 单独运行 )
* 组件化导入 com.android.application 插件
*/
apply plugin: 'com.android.application'
} else {
/**
* 模块化 : 在 Release 发布阶段, 只有一个壳应用是可以独立运行的, 其它所有的模块都作为依赖库存在,
* 此时, isModuleDebug 设置为 false. ( 非单独运行 )
* 模块化导入 com.android.library 插件
*/
apply plugin: 'com.android.library'
}
四、切换设置应用 ID
通过在 common.gradle 构建脚本 中 对 Project 类的 isModuleDebug 扩展属性配置 , 使用该属性控制当前应用是处于 模块化 还是 组件化 状态 ;
- 如果是 组件化状态 , 该模块可以独立运行 , 必须定义 applicationId , 否则会报错 ;
- 如果是 模块化状态 , 该模块作为依赖库存在 , 不能定义 applicationId ;
android#defaultConfig#applicationId 配置示例 :
android {
defaultConfig {
if (project.isModuleDebug) {
/**
* 模块化时才能设置 applicationId
* 依赖库设置 applicationId 编译时会报错
*/
applicationId "kim.hsl.business"
}
}
}
模块下的 build.gradle 构建脚本 完整代码示例 :
/*plugins {
id 'com.android.application'
id 'kotlin-android'
}*/
/**
* rootProject.projectDir 是工程的根目录
* apply from 引入构建脚本的操作, 等同于将该构建脚本原封不动拷贝到此处
*/
apply from: "${rootProject.rootDir}/common.gradle"
if (project.isModuleDebug) {
/**
* 组件化 : 在 Debug 开发阶段, 每个模块都可以独立运行, 因此相关的模块都是 Application 应用模块,
* 此时, isModuleDebug 设置为 true. ( 单独运行 )
* 组件化导入 com.android.application 插件
*/
apply plugin: 'com.android.application'
} else {
/**
* 模块化 : 在 Release 发布阶段, 只有一个壳应用是可以独立运行的, 其它所有的模块都作为依赖库存在,
* 此时, isModuleDebug 设置为 false. ( 非单独运行 )
* 模块化导入 com.android.library 插件
*/
apply plugin: 'com.android.library'
}
/**
* 导入 Kotlin 插件
*/
apply plugin: 'kotlin-android'
android {
compileSdkVersion 32
buildToolsVersion "32.0.0"
defaultConfig {
if (project.isModuleDebug) {
/**
* 模块化时才能设置 applicationId
* 依赖库设置 applicationId 编译时会报错
*/
applicationId "kim.hsl.business"
}
minSdkVersion 18
targetSdkVersion 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
相关文章
- android scaleanimation动画,【Android动画九章】-RotateAnimation(旋转动画)和ScaleAnimation(尺寸动画)…[通俗易懂]
- 加密狗android,Android系统加密狗的设计与实现
- android bindservice方法,Android bindservice方法返回false
- Android 代码混淆 混淆方案
- mac 电脑android环境变量设置,mac上Android环境变量配置[通俗易懂]
- Android进程间通信与逆向分析
- 【Android 应用开发】BluetoothSocket详解
- 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )
- 【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )
- 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )
- 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
- 【Android Gradle 插件】settings.gradle 配置文件 ( 配置基本作用 | include 函数用法 | 目录层级配置 | 修改 Module 模块构建脚本名称 )
- 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( plugins 闭包代码块中引入插件 | PluginAware#apply 方法引入插件 )
- 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( android 闭包块配置 | AppExtension 扩展类型参考文档 )
- 【错误记录】Android Studio 编译时 lint 检查报错 ( WARNING: DSL element ‘android.dataBinding.enabled‘ is obsolet )
- 【Android Gradle 插件】Gradle 基础配置 ⑤ ( gradle-wrapper.properties 配置分析 | GRADLE_USER_HOME 目录 )
- 【错误记录】Android Studio 编译报错 ( Could not resolve com.android.tools.build:gradle:7.4.2. )
- Android Studio 导入项目 出现安装Error:Cause: failed to find target with hash string ‘android-23’ 等错误详解手机开发
- Android系统自带样式(android:theme)
- Android笔记之:在ScrollView中嵌套ListView的方法
- Android学习笔记——Menu介绍(三)