Gradle常用使用技巧

Table of Contents

1. BuildConfig 字段

buildConfigField "boolean", "LOG_ENABLE", "true"

2. Manifest 占位符

manifestPlaceholders = [hostName:"www.example.com"]

3. 代码压缩与混淆

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

注意:debuggable 为 true 时开混淆没用(好像又有用,这两种情况都碰到过)

4. 资源压缩

shrinkResources true

5. 多 Dex 处理

multiDexEnabled true
multiDexKeepFile file('multidex-config.txt')
multiDexKeepProguard file('multidex-config.pro')

// Application中
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(context);
    MultiDex.install(this);
}

6. 变体特定依赖

dependencies {
    compile 'com.android.support:support-v4:22.2.0'
    flavorOneCompile 'com.android.support:appcompat-v7:22.2.0' // 仅为flavorOne添加
}

7. 多维 Product Flavor

flavorDimensions "type", "environment"

8. 变体过滤

flavorDimensions "api", "mode"
productFlavors {
    demo {...}
    full {...}
    minApi24 {...}
    minApi23 {...}
    minApi21 {...}
}

variantFilter { variant ->
    def names = variant.flavors*.name
    if (names.contains("minApi21") && names.contains("demo")) {
        setIgnore(true)
    }
}

9. 动态配置文字

productFlavors {
    demo {
        resValue("string","dynamic_text","demo的动态文字")
    }
}

注意:string.xml 里面不能有 dynamic_text 字段

10. 源集配置

sourceSets {
    demo {
        setRoot "src/demo"
        res.srcDirs = ['src/demo/res', 'src/demo/res/']
    }
}

11. 依赖缓存控制

configurations.all {
    resolutionStrategy.cacheDynamicVersionsFor 10, 'minutes' // release版本
    resolutionStrategy.cacheChangingModulesFor 10, 'minutes' // snapshot版本
}

12. Properties 类型

参考文章

Gradle 支持三种 Properties,这三种 Properties 的作用域和初始化阶段都不一样,下面分别列出了其部分特点:

System Properties

  1. 可通过 gradle.properties 文件,环境变量或命令行-D 参数设置
  2. 可在 setting.gradle 或 build.gradle 中动态修改,在 setting.gradle 中的修改对 buildscript block 可见
  3. 所有工程可见,不建议在 build.gradle 中修改
  4. 多子工程项目中,子工程的 gradle.properties 会被忽略掉,只有 root 工程的 gradle.properties 有效

Project Properties

  1. 可通过 gradle.properties 文件,环境变量或命令行-P 参数设置,优先级是:
  2. 可在 build.gradle 中动态修改,但引用不存在的 project properties 会立即抛错
  3. 动态修改过的 project properties 在 buildscript block 中不可见

Project ext properties

  1. 可在项目的 build.gradle 中声明和使用,本工程和子工程可见
  2. 不能在 setting.gradle 中访问

加载顺序

如果有多处设置,加载次序如下(注意:gradle 2.0 是这样的, 1.10~1.12 有 bug),后面的覆盖前面的设置:

  1. from gradle.properties located in project build dir.
  2. from gradle.properties located in gradle user home.
  3. from system properties, e.g. when -Dsome.property is used in the command line.
  4. setting.gradle
  5. build.gradle

注意:

  • gradle build -D 设置 System Properties
  • gradle build -P 设置 Project Properties

13. 任务排除

./grdlew clean assembleRelease -x verifyReleaseResources

14. 查看依赖树

./gradlew build --scan