在项目开发中,往往会用到很多个module,每个module都有自己的gradle,而这些gradle很大部分都是重复的,所以我们可以将重复的部分,抽取成一个公共的gradle,然后各个module都引用这个公共中的就可以了
一个项目中,gradle总共有三类,setting.gradle, build.gradle和各个module下的build.gradle ,而执行的顺序也是setting.gradle> 项目build.gradle>module中build.gradle,而我们要抽取一个公共的gradle,让项目的build.gradle依赖于公共的gradle
并且如果一个项目中,有很多个module,如果每次修改点东西,都整个项目编译一遍,很费时间,所以,最好哪个module改了,就直接运行哪个module,这样就可以省下很多时间,在测试的时候,各个module都可以单独运行,而在上线的时候,各个module都直接集成在项目中,不可单独运行,所以最好有个开关,根据这个开关来判断是集成还是分成各个module,下面上代码
先抽取公共的gradle , 取名app_config.gradle
ext{ //闭包
/***
* true 表示是生产环境
* false 表示是测试环境
* 自己手动修改
* 不发布时,改成false ,各个模块可以单独运行
*/
isRelease = false
app_android = [
compileSdkVersion :25,
buildToolsVersion :"25.0.2",
applicationId: "com.example.a15101.plugindemo",
minSdkVersion: 21,
targetSdkVersion :25,
versionCode: 1,
versionName :"1.0",
testInstrumentationRunner :"android.support.test.runner.AndroidJUnitRunner"
]
//抽取公共的依赖部分
app_imp = [
appcompat: 'com.android.support:appcompat-v7:25.+',
constraint_layout : 'com.android.support.constraint:constraint-layout:1.1.3',
junit : 'junit:junit:4.12',
runner: 'com.android.support.test:runner:1.0.2',
espresso: 'com.android.support.test.espresso:espresso-core:3.0.2',
//动态权限
permissionsdispatcher:'com.github.hotchemi:permissionsdispatcher:3.1.0',
pinyin4j:"com.belerweb:pinyin4j:2.5.0"
]
/**
* 各个模块在单独运行的时候,需要的applicationId
*
*/
app_appId = [
"common" : "com.example.common",
"myself" : "com.example.module_myself"
]
}
然后在项目的gradle下,添加引入
然后是module_myself中的gradle
if (isRelease){
apply plugin: 'com.android.library'
}else{
apply plugin: 'com.android.application'
}
android {
compileSdkVersion app_android.compileSdkVersion
buildToolsVersion app_android.buildToolsVersion
defaultConfig {
if (!isRelease){
applicationId app_appId.myself
}
minSdkVersion app_android.minSdkVersion
targetSdkVersion app_android.targetSdkVersion
versionCode app_android.versionCode
versionName app_android.versionName
testInstrumentationRunner app_android.testInstrumentationRunner
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 循环引入第三方库
app_imp.each {
k, v ->
if (k != app_imp.permissionsdispatcher) { //可以判断,过滤掉不需要引入的公共库
implementation v
}
}
// implementation project(':common')
}
我们只需要更改isRelease就可以了,true表示上线,各个module都集成在项目中,不可单独运行,改成false,各个module可以独自运行
如果module间进行跳转,这时候就得用类加载来跳转了
try {
Class> aClass = Class.forName("com.example.module_myself.Myself_MainActivity");
Intent intent = new Intent(MainActivity.this, aClass);
startActivity(intent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}