Gradle 通用配置项

2022-02-23  本文已影响0人  何以邀微微

Gradle 是Android studio 标配的构建系统,所以必须对它有基本的认识才行。

1.共享变量的定义

Gradle开发中会遇到很多相同的配置,例如不同的module中都要配置compileSdkVersion、buildToolsVersion等变量的值,这些公共的配置称为共享变量。一般情况下,他们的取值都应该保持一致,那么就需要统一管理这些配置。

一般需要在项目的根目录定义一个common_config.gradle配置文件。

ext {
    
    //Android 编译版本相关
    android = [
            versionName      : "1.0.0",
            versionCode      : 1,
            compileSdkVersion: 30,
            buildToolsVersion: "30.0.3",
            minSdkVersion    : 16,
            targetSdkVersion : 30
    ]


    dependencies = [
            appcompat       : 'androidx.appcompat:appcompat:1.2.0',
            material        : 'com.google.android.material:material:1.2.0',
            constraintlayout: 'androidx.constraintlayout:constraintlayout:2.1.3',


            //kotlin
            stdlib          : "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version",
            ktx             : 'androidx.core:core-ktx:1.6.0'
    ]

    testDependencies = [
            //test
            androidTestJunit: 'androidx.test.ext:junit:1.1.3',
            testJunit       : 'junit:junit:4.+',
            testEspresso    : 'androidx.test.espresso:espresso-core:3.4.0',
            testng          : 'org.testng:testng:6.9.6'
    ]


    //混淆相关
    minifyEnable = true
    shrinkResEnable = minifyEnable

    //java相关
    javaVersion = 8
    javaMaxHeapSize = '4G'

    //JSK版本兼容
    sourceCompatibility = this.getJavaVersion()
    targetCompatibility = this.getJavaVersion()

    jvmTarget = '1.8'

}

def getJavaVersion() {
    switch (project.ext.javaVersion) {
        case 6:
            return JavaVersion.VERSION_1_6
        case 7:
            return JavaVersion.VERSION_1_7
        case 8:
            return JavaVersion.VERSION_1_8
        case 9:
            return JavaVersion.VERSION_1_9
        default:
            return JavaVersion.VERSION_1_8
    }
}

为了项目中所有的module都能引用到,最好是统一在项目根目录的配置文件中进行引用这个配置

apply from:"common_config.gradle"

2.下面是通用配置的应用

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

android {
    compileSdkVersion rootProject.android.compileSdkVersion
    buildToolsVersion rootProject.android.buildToolsVersion

    defaultConfig {
        applicationId "com.***.sdkdemoopt"
        minSdkVersion rootProject.android.minSdkVersion
        targetSdkVersion rootProject.android.targetSdkVersion
        versionCode rootProject.android.versionCode
        versionName rootProject.android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    //构建配置
    buildTypes {
        release {           
            matchingFallbacks = ['debug', 'qa', 'release']
            //包名后缀,动态改变应用包名
            applicationIdSuffix "test"
            //配置参数 在源码BuildConfig通过这个类能引用到这个值  通过这个方式达到动态控制项目的目的
            buildConfigField "String", "HUMAN_AI_TYPE", "\"MS\""
            buildConfigField("int", "FACE_MODEL", "106")
            //混淆开关
            minifyEnabled rootProject.minifyEnable
            //指定混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //是否编译时自动移除没有引用到的资源文件,开启这个有风险,确保没有反射的方式引用资源等
            shrinkResources false
            //指定秘钥信息
            signingConfig signingConfigs.debug
            //动态指定应用的icon和应用名称,跟产品维度配置搭配使用,这个需要配合manifest文件
            manifestPlaceholders=              [app_name:"@string/app_name",app_icon:"@mipmap/ic_meishe"]
            
        }
    }

    compileOptions {
        sourceCompatibility rootProject.sourceCompatibility
        targetCompatibility rootProject.targetCompatibility
    }

    //产品维度的配置
    productFlavors {
        _360 {}
        tencent {}
        baidu {}
        oppo {}
        vivo {}
        huawei {}
        xiaomi {}
        googleplay {}
    }

    //如果使用到了友盟需要使用这个配置,友盟中后台的信息就会有渠道的概念了
    productFlavors.all {
            //批量修改,类似一个循序遍历
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

    //签名相关配置
    signingConfigs{
        release{
            storeFile file("***.keystore")
            storePassword "***"
            keyAlias "***"
            keyPassword "***"
        }

        debug{
            storeFile file("***.keystore")
            storePassword "***"
            keyAlias "***"
            keyPassword "***"
        }
    }

    //自定义工程名称
    variant.outputs.all { output ->
        def buildName = "com.***"
        def type = variant.buildType.name
        if (type == "debug") {
            def apkName = 'app-debug'
            outputFileName = new File("../.././../../../build/outputs/apk/debug", apkName + '_' + type + '.apk')
        } else {
            def releaseApkName = buildName + '_' + variant.productFlavors.get(0).name + '_' + type + "_" + versionName + '_' + releaseTime() + '.apk'
            outputFileName = releaseApkName
        }
    }

    //加载aar包需要的配置,否则会出现找不到aar包的错误
    repositories {
        flatDir {
            dirs 'libs'
        }
        
        //加载一个model中引入的aar,,如果所有的module都需要使用这个module,可以配置在跟目录的build.gradle中
//        flatDir {
//            dirs project(':***Model').file('libs')
//        }
    }

    //如果需要生成aar包
    android.libraryVariants.all { variant ->
        variant.outputs.all {
            def fileName = "baseModel"+'_' + releaseTime()+".aar"
            outputFileName = fileName
        }
    }

    kotlinOptions {
        jvmTarget = rootProject.jvmTarget
    }
}


static def releaseTime() {
    return new Date().format("yyyy-MM-dd--HH-mm-ss", TimeZone.getTimeZone("GMT+8"))
}

dependencies {
    //自动引入libs下面的jar包
    implementation fileTree(includes: ['*.jar'],dir: 'libs')

    implementation rootProject.ext.dependencies.constraintlayout
    implementation rootProject.ext.dependencies.appcompat
    implementation rootProject.ext.dependencies.material

    //依赖一个model
    implementation project(":libBase")

    //引入一个aar
    implementation(name:'libEngine',ext:'aar')

    //kotlin
    implementation rootProject.ext.dependencies.stdlib
    implementation rootProject.ext.dependencies.ktx

    //test
    testImplementation rootProject.testDependencies.testJunit
    androidTestImplementation rootProject.testDependencies.androidTestJunit
    androidTestImplementation rootProject.testDependencies.testEspresso
}
<application
    android:allowBackup="true"
    android:icon="${app_icon}"
    android:label="${app_name}"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.TestBuildGradle">
</application>

在build.gradle 配置manifestPlaceholders=[app_name:"@string/app_name",app_icon:"@mipmap/ic_meishe"]需要在manifest文件中配置

android:icon="{app_icon}" android:label="{app_name}"

来实现不同的打包维度下,动态更改app_name和app_icon的功能。

我把常用的配置全部放在了里边,包含

其他配置会持续更新,亲测可用……

上一篇下一篇

猜你喜欢

热点阅读