gradle 在 Android 代码管理中的点滴一

一、在Android Studio的gradle同步过程中准备工程代码
1.1 工程背景
在Android工程中,存在这样的场景,Android工程可以被划分为:功能A,功能B,功能C和功能F,Android工程需要的代码由这些功能进行组合,但是这些功能*的代码太少不足够对它们进行模块划分和依赖。
1.2 解决方案
示例工程名:DemoTotal
在Android的工程目录的app/src/main目录下,用java_a,java_b,java_c和java_d分别包括功能A,功能B,功能C和功能D。

在DemoTotal目录下的build.gradle 中填充如下代码
ext {
A_FUNCTION = 1 << 0 //1
B_FUNCTION = 1 << 1 //2
C_FUNCTION = 1 << 2 //4
D_FUNCTION = 1 << 3 //8
}
project( ':app' ) {
ext.mFunction = A_FUNCTION | B_FUNCTION | C_FUNCTION | D_FUNCTION
}
在app目录下的build.gradle中进行如下定义
sourceSets {
main {
java.srcDirs = getJavaSrcDirs()
jniLibs.srcDir 'libs'
res.srcDirs = [ 'src/main/res' ]
}
}

def getJavaSrcDirs () {
FileCollection fileCollection = files( 'src/main/java' )
if ((mFunction & A_FUNCTION) != 0 ) {
fileCollection = fileCollection + files( 'src/main/java_a' )
}
if ((mFunction & B_FUNCTION) != 0 ) {
fileCollection = fileCollection + files( 'src/main/java_b' )
}
if ((mFunction & C_FUNCTION) != 0 ) {
fileCollection = fileCollection + files( 'src/main/java_c' )
}
if ((mFunction & D_FUNCTION) != 0 ) {
fileCollection = fileCollection + files( 'src/main/java_d' )
}
return fileCollection
}
1.3 方案说明
从上面的代码大致可以看出,工程的源码目录可以通过在DemoTotal目录下的build.gradle中通过变量配置进行管理。 对ext.mFunction赋予不同的值进行组合,就可以得到不同的工程代码。从示例中的代码可得,工程的代码如下:

如果将ext.mFunction赋值为 A_FUNCTION | C_FUNCTION | D_FUNCTION,同步一下工程的gradle之后,工程的代码如下,可以看到java_b目录不在起作用。

二、在Android Studio的gradle同步前运行自己的task
2.1 工程背景
在Android工程中,需要在Android工程同步前,先运行gradle task任务,比如通过脚本配置等生成代码文件来丰富上面的Android工程(生成java代码,可以通过codemodle编写的jar包实现)。
2.2 解决方案
在Android工程app目录下的build.gradle中如下定义
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.eebbk.bbksafe"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile( 'proguard-android.txt' ), 'proguard-rules.pro'
}
}
sourceSets {
main {
java.srcDirs = getJavaSrcDirs()
jniLibs.srcDir 'libs'
res.srcDirs = [ 'src/main/res' ]
}
}
//Android studio gradle 同步前运行
task createJava(type: Delete, dependsOn: 'copyJava') {
println ">>>>>${comDir}<<<<<"
delete comDir
delete androidDir
doLast {
println ">>>>>deleteJava successful<<<<<"
}
}
preBuild.dependsOn createJava //保证createJava在Android studio gradle 同步前运行
}
2.3 方案说明
“preBuild.dependsOn createJava”保证了createJava Task任务在Android Studio同步前运行。

猜你喜欢

转载自blog.csdn.net/polo2044/article/details/79471291