一、在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同步前运行。