Android简单统一管理Module以及依赖

目录

前言:

build文件介绍:

1. settings.gradle:

2.顶层的build.gradle:

3.Module下的build.gradle文件:

开始:

一:创建我们自己的gradle文件

二:引入自己创建的gradle文件

三:在各个Module下使用gradle文件


前言:


我们为什么要对build.gradle进行统一的管理呢???
      原因: 我们在Android当前工程下每次创建一个Module就会出现一个build.gradle文件,多个gradle文件的存在会造成不太好管理的问题,我们就可以对这些gradle文件进行统一的管理

build文件介绍:


       简单的了解这些基础知识过后,我们来了解一下build.gradle文件,一个项目中有一个settings.gradle文件,包括一个顶层的build,gradle文件,每个Module都有自己的一个build.gradle文件,每一个项目单独的build.gradle针对于每一个Module的配置,如果这里的定义的选项和顶层build.gradle定义的相同的话,后者将会被覆盖
 

1. settings.gradle:

        这个setting文件中定义了依赖的仓库,以及引入那些模块

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "Gradle_Example"
include ':app'
include ':mylibrary'
include ':login'
include ':register'

       注意:这里我们常常会遇到一个问题就是,创建的Module删除不了,就是因为这里通过include语法引入了该Module,如果想要删除则需要将该语句删除然后同步一下项目就可以删除了 

2.顶层的build.gradle:

       这里有我们定义的插件,以及后续我们需要把自己定义的build.gradle文件来引入到顶层的build.gradle文件中,其他Module下的build.gradle文件才能使用,因为其他Module下的build.gradle文件都是继承自顶层的build.gradle文件

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.0.3' apply false
    id 'com.android.library' version '7.0.3' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}

apply from : 'Config.gradle'// 将Config.gradle引入到工程中,也就是与project.gradle同步
task clean(type: Delete) {
    delete rootProject.buildDir
}

3.Module下的build.gradle文件:

       这里涉及的内容就比较多,我们主要也是管理该build文件

plugins {
    id 'com.android.application'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.quick.myapplication"
        minSdk 24
        targetSdk 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
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.9.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

       在AndroidStudio工程中的走向(Make Project后的执行顺序): settings.gradle -> project下的build.gradle  ->  app下的build.gradle(各个工程下的build.gradle文件) 

1.apply plugin:
    有apply plugin: 'xxxxx' 和 plugins两种声明方式,如下:


//com.android.application 表示该Module是一个应用程序模块,打包后是apk
//com.android.library 标识该Module一个库模块,打包后是arr包,如果Application模块和Library模块同时执行println语句,Application模块先执行,因为Library模块依附于Application模块
//区别:前者可以直接运行,后着是依附别的应用程序Module运行


// 注意:plugins只能在顶层,也就是build.gradle的第一行,不然会出问题,如果想执行判断语句,就不能用plugins,得用apply  plugin : '....'
plugins { 
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

if (isRelease) {
    apply plugin: 'com.android.library'
    apply plugin: 'org.jetbrains.kotlin.android'
} else {
    apply plugin: 'com.android.application'
    apply plugin: 'org.jetbrains.kotlin.android'// Kotlin插件,如果内部有Kotlin代码必须携带Kotlin插件
}

2.Android{}:
      这里编译文件中最大的代码块,关于Android的所有特殊配置都在这里

3.buildTypes{}:
      定义了编译类型,针对于该应用的
4.dependencies{}:
       是属于gradle的依赖配置, 它定义了当前项目需要依赖的其他库,dependencies中主要的语法如下:
     1.implementation :是默认的scope,implementation的作用域会让依赖在编译和运行时均包含在内,但是不会暴露在类库使用者的编译时,也就是我们的类库包含了gson,那么其他人使用我们的类库时,编译时不会出现gson的依赖,也就是说其他模块无法使用当前模块implementation导入的依赖
       例子:implementation ('com.alibaba:arouter-api:1.5.2') //'com.alibaba:arouter-api:1.5.2'是一个key,会去对应repositories仓库寻找,没有的话就需要去配置仓库,找到之后就会下载@aar(java字节码,.class,res资源文件和xml配置文件)文件和@jar(java字节码,.class)
其中     com.alibaba: (group组名)         arouter-api:(module模块名称)       1.5.2(具体的版本)
     2.api, 和implementation类似,都是编译和运行时都可见的依赖, 但是api允许我们将自己类库的依赖暴露给我们类库的使用者,也就是说,在该模块下用api导入的依赖,在其他模块引入该模块的情况下,可以正常使用api导入的依赖
     3.compileOnly和runtimeOnly,这两种顾名思义,一种只在编译时可见,一种只在运行时可见。而runtimeOnly和Maven的provided比较接近。
     4.testlmplementation,这种依赖在测试编译时和运行时可见,类似于Maven的test作用域。
     5.testCompileOnly和testRuntimeOnly,这两种类似于compileOnly和runtimeOnly,但是作用于测试编译时和运行时。通过简短精悍的依赖配置和多种多样的作用与选择,Gradle可以为我们提供比Maven更加优秀的依赖管理功能。

开始:

一:创建我们自己的gradle文件

1. 直接在Project工程下创建统一的gradle文件

2.在Project工程下创建一个文件夹后再创建gradle文件

二:引入自己创建的gradle文件

    针对上述两种创建gradle文件的方式有两种引入方式,在Project级别的build.gradle文件下引入

// 将Config.gradle引入到工程中,也就是与project.gradle同步
apply from : 'gradles/Config.gradle'
apply from : 'Config.gradle'

三:在各个Module下使用gradle文件

使用自己创建好的gradle文件,并且定义好对应的语法

// 糖果语法
ext {// 扩展块,想要使用该扩展块内的资源,需要跟project.gradle同步
    username = "testGradle"// 会根据类型推断自动推断出类型
    // 正式环境和测试环境,控制模块化和集成化
    isRelease = true
    // 建立一个map集合.进行存储  key  和  value
    androidID = [
            compileSdk : 32,
            applicationId : "com.quick.gradle_example",
            minSdk : 24,
            targetSdk : 32,
            versionCode : 1,
            versionName : "1.0"
    ]

    appID = [
            applicationId : "com.quick.gradle_example"
    ]

    dependenciesID = [// ktx:1.7.0这种key的写法在高版本中可能存在冲突问题
            core_ktx :  'androidx.core:core-ktx:1.7.0',
            appcompat : 'androidx.appcompat:appcompat:1.3.0',
            material : 'com.google.android.material:material:1.4.0',
            constraintlayout : 'androidx.constraintlayout:constraintlayout:2.0.4',
            junit : 'junit:junit:4.13.2',
            junit_test : 'androidx.test.ext:junit:1.1.3',
            espresso_core : 'androidx.test.espresso:espresso-core:3.4.0'
    ]

    urls = [
            debug : 'https://hao.360.com/?src=lm&ls=n144c1cd899',
            release : 'https://hao.www.baidu.com'
    ]
}

在对应的使用Module下可以用如下使用方法
1.定义变量:
  我们可以使用def 来声明一个变量

def username = rootProject.ext.username // 定义变量,整个项目都是由Gradle进行管理的,我们可以拿到根Gradle,在获取其他内容
println (username)
println username// 加不加括号都可以打印

2.直接使用:

println rootProject.ext.username

3.对应闭包中的使用方式,也就是android{}, defaultConfig{}, buildTypes{},dependencies{}...

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}
def androidId = rootProject.ext.androidID// 定义变量,不定义也可以,定义是为了更加完整
def dependenciesID = rootProject.ext.dependenciesID
def isRelease = rootProject.ext.isRelease
def urls = rootProject.ext.urls
android {
    compileSdk androidId.compileSdk

    defaultConfig {
        if (!isRelease) {
            applicationId androidId.applicationId
        }
        minSdk androidId.minSdk
        targetSdk androidId.targetSdk
        versionCode androidId.versionCode
        versionName androidId.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        // 参数一:参数类型,参数二:参数名称,参数三:参数值
        buildConfigField("Boolean","isRelease",String.valueOf(isRelease))// buildConfigField将代码过度到Java代码中也就是过度到BuildConfig中变成静态属性
    }

    buildTypes {
        debug {
            buildConfigField("String","URL","\"$urls.debug\"")
        }
        release {
            minifyEnabled true
            buildConfigField("String","URL","\"$urls.release\"")
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions { // 因为涉及Kotlin插件问题
        jvmTarget = '1.8'
    }

    // 控制清单文件路径,方便测试环境,打包不集成到正式环境
    sourceSets {
        main {
            if (!isRelease) {
                // 如果是组件化模式,需要单独运行时
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            } else {
                // 集成化模式,整个项目打包apk
                manifest.srcFile 'src/main/AndroidManifest.xml'
//                java {
//                    // Release 时,debug目录下文件不需要合并到主工程
//                    exclude '**/debug/**'
//                }
            }
        }
    }
}

dependencies {
    // 依赖可能多达三百多行,用一行for循环搞定
//    implementation 'androidx.core:core-ktx:1.7.0'
//    implementation 'androidx.appcompat:appcompat:1.3.0'
//    implementation 'com.google.android.material:material:1.4.0'
//    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
//    testImplementation 'junit:junit:4.13.2'
//    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
//    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
      dependenciesID.each {k, v ->
          implementation v
      }// 相当于循环调用implementation这个函数并进行传参
    if (isRelease) {// 依附所有的模块
        // 如果是集成化模式,做发布版本时,各个模块就不能独立运行了
        implementation project(':login')
        implementation project(':register')
    }
}



     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值