美文网首页
Gradle 通用配置项

Gradle 通用配置项

作者: 何以邀微微 | 来源:发表于2022-02-23 14:00 被阅读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的功能。

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

    • 签名密钥

    • 混淆开关

    • 自定义apk安装包名称

    • 自定义生成aar包名称

    • 产品维度,以及包含友盟的配置

    • 依赖一个aar包

    • 依赖一个子model

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

    相关文章

      网友评论

          本文标题:Gradle 通用配置项

          本文链接:https://www.haomeiwen.com/subject/zpuolrtx.html