[Android] 配置build.gradle 动态传参

(1)一个Android工程中有一个build.gradle是负责Project范围的,而Module中又有各自的build.gradle是专门负责模块的。

(2)在Gradle中Task是一等公民,通过gradlew + task名 可以直接执行指定Task,例如下面的命令就是执行:task releaseAutoBLForAar

gradlew releaseAutoBLForAar

(3)在defaultConfig中可以自定义变量名,编译时可以在Java代码中引用到:

defaultConfig {
        applicationId "com.test"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 5
        versionName 1.1.0
        buildConfigField("String", "API_HOST", "${API_DEV_HOST}")
}

  这里面的API_HOST是String型的(第三个参数是表示传值),可以看到Java代码生成,这样就能建立起代码与配置之间的桥梁:

public final class BuildConfig {
          public static final boolean DEBUG = Boolean.parseBoolean("true");
          public static final String APPLICATION_ID = "com.test";
          public static final String BUILD_TYPE = "debug";
          public static final int VERSION_CODE = 6;
          public static final String VERSION_NAME = "1.1.1";
          // Fields from default config.
          public static final String API_HOST = "http://test.api.cn";
}

(4)通过 buildTypes 可以配置不同的任务参数

buildTypes {
    release {       /* 线上环境 */
        buildConfigField "boolean", "LOG_DEBUG", "false"    // 不显示Log
        buildConfigField "String", "API_HOST", "${API_RELEASE_HOST}"    //API Host
        minifyEnabled true                      //是否混淆
        zipAlignEnabled true                    //是否设置zip对齐优化
        shrinkResources true                    // 移除无用的resource文件
        signingConfig signingConfigs.release    //签名
        proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
    }
    preRelease {    /* 预发环境 */
        buildConfigField "boolean", "LOG_DEBUG", "false"    // 不显示Log
        // 。。。
    }
    debug {         /* 本地开发环境 */
        minifyEnabled false
    }
    beta {          /* 测试环境 */
        buildConfigField "boolean", "LOG_DEBUG", "true"     // 显示Log
        // 。。。
    }
}

 

  可以通过AndroidStudio的Gradle面板看到多个编译任务,原来默认只有assembleDebug,现在就多了assembleBeta、assemblePreRelease、assembleRelease,双击即可执行。

(5)如何通过Gradle动态配置不同的AndroidManifest.xml 变量内容呢?通过自定义manifestPlaceholders 属性值。

  首先在AndroidManifest.xml 文件中指定要使用Gradle动态配置值${TALKING_DATA_APP_ID}:

    <!--TalkingData 配置-->
    <meta-data
        android:name="TD_APP_ID"
        android:value="${TALKING_DATA_APP_ID}" />

   可以在build.gradle中配置一个特别的变量属性:

def TEST_TALKING_DATA_APP_ID = "6E5389EAD0C2C2CFB7B379701F6D2BA8"

defaultConfig {
    applicationId "com.test"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 5
    versionName 1.1.0
    buildConfigField("String", "API_HOST", "${API_DEV_HOST}")
    manifestPlaceholders = [
            /* talkingData 测试环境 */
            TALKING_DATA_APP_ID: "${TEST_TALKING_DATA_APP_ID}"   /* 可以新增多个键值对,表示变量与对应的值 */
    ]
}

   同理,我们可以在buildTypes中分别指定release、debug等配置的manifestPlaceholders 来达到不同的配置效果。 

(6)如何在build.gradle中动态获取参数选项?通过 project.hasProperty(VERSION_CODE‘) 的形式来获取动态传参。

defaultConfig {
    applicationId "com.ixwork"
    minSdkVersion 15
    targetSdkVersion 23
    //关键看这两行
    versionCode project.hasProperty(‘VERSION_CODE‘) ? Integer.parseInt(VERSION_CODE) : DEF_VERSION_CODE
    versionName project.hasProperty(‘VERSION_NAME‘) ? VERSION_NAME : "${DEF_VERSION_NAME}"
    buildConfigField("String", "API_HOST", "${API_DEV_HOST}")
}

 (7)怎么传参呢?通过-PVAR_NAME=VAR_VALUE 的形式,其中-P就是加参数,例如:

gradle clean assembleBeta -PVERSION_CODE=5 -PVERSION_NAME=1.1.1 -POUT_PUT_DIR=/home/user/Desktop -PFILE_NAME=test.apk

 

[Android] 配置build.gradle 动态传参

上一篇:Exchange 2010 数据库磁盘碎片整理


下一篇:Android USB 开发详解