问题引出
因为公司项目日渐增大,所以想尝试下组件化,为以后业务扩展做准备。但是拆分之后的模块和之前引入的lib中,都含有相同的导包,以后升级也变得很麻烦,就希望可以在项目中个定义一个统一的资源模块加以引用,做到统一管理。
解决方案
定义配置文件
在项目的根目录中有一个gradle.properties ,其中定义的常量是可以在gradle 中直接引用的。我们先定义一些常用的值:
# Android configurationCOMPILE_SDK_VERSION=27BUILD_TOOLS_VERSION=27.0.3TARGET_SDK_VERSION=27MIN_SDK_VERSION=16VERSION_CODE=1VERSION_NAME=1.0# Plugin versionsKOTLIN_VERSION=1.2.71SUPPORT_LIBRARY_VERSION=27.1.1CONSTRAINT_LAYOUT_VERSION=1.1.3RUNNER_VERSION=1.0.2ESPRESSO_CORE_VERSION=3.0.2JUNIT_VERSION=4.12BUTTERKNIFE_VERSION=8.4.0GLIDE_VERSION=3.7.0复制代码
现在我们在gradle文件中引用一下就可以了:
android { compileSdkVersion Integer.parseInt(COMPILE_SDK_VERSION) buildToolsVersion BUILD_TOOLS_VERSION defaultConfig { applicationId "com.be.www.multimodelproject" minSdkVersion MIN_SDK_VERSION targetSdkVersion TARGET_SDK_VERSION versionCode Integer.parseInt(VERSION_CODE) versionName VERSION_NAME testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION" implementation "com.android.support.constraint:constraint-layout:$CONSTRAINT_LAYOUT_VERSION" testImplementation "junit:junit:$JUNIT_VERSION" androidTestImplementation "com.android.support.test:runner:$RUNNER_VERSION" androidTestImplementation "com.android.support.test.espresso:espresso-core:$ESPRESSO_CORE_VERSION"}复制代码
- 需要注意的是:compileSdkVersion 和 versionCode 必须为Integer类型,而Gradle支持类型类型解析(Gradle的支持语言是Groovy,而Groovy的底层是java,好多类型和语法都和java相近),我们只需要Integer.parseInt() 一下就好了。对于implementation,我们要注意使用的是“双引号”(""),因为“单引号”是不支持动态赋值的,之后用美元符($)引入即可。
到此来说,已经实现了依赖版本同步的问题。但是如果我每个module中都需要一个*"com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"* ,也就是我的每个代码块都会存在,显得臃肿和麻烦。我们可以在根目录的gradle中定义一些常用的引用:
buildscript { ext.kotlin_version = '1.2.41' ext.deps = [ 'junit' : "junit:junit:$JUNIT_VERSION", 'kotlin': [ 'kgp' : "org.jetbrains.kotlin:kotlin-gradle-plugin:${KOTLIN_VERSION}", 'kotlin_jdk7': "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${KOTLIN_VERSION}" ] ] repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}复制代码
语法就是ext.deps 样式。引用方式:
implementation deps.kotlin.kotlin_jdk7 testImplementation deps.junit复制代码
是不是代码清爽很多。
我们还可以注意到上边的ext.kotlin_version = '1.2.41' ,也就是说常量也可以在gradle中定义。但是个人比较喜欢清单的形式。
-
参考链接:
一笑相逢蓬海路,人间风月如尘土。