(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  
// 这里面一个小细节很重要,执行gradle任务时之前加一个clean清除一下结果,可以有效防止编译过程中误报错误。比如关闭了某个宏导致某些class文件不再被编译,但是可能由于旧的信息残留导致报错提示找不到class

 (8)怎么设置APP工程使用一个aar库呢?两步走:(1)设置本地仓库地址;(2)设置依赖文件名称和扩展名。

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
// implementation project(':testjni') // 这一句是用来设置工程依赖的,如果设置了直接依赖那么就好比就是同一个工程内了,直接import类使用即可 compile (name:'testjni-debug', ext:'aar') // 这一句是用来设置工程依赖某个具体aar包的,name字段填写包名,ext字段填写扩展名
}

  如果是初始工程这么设置一下的话,编译会报错说找不到这个testjni-debug.arr,原因是存放这个文件的“仓库”路径并没有被加入到工程内,需要我们设置一下仓库地址(假设存在aar文件的路径是app/libs目录):

allprojects {
repositories {
google()
jcenter() flatDir {dirs '../app/libs'} // 在整个工程的build.gradle 中仓库配置此字段
}
}

 (9)怎么理解一个task的内容?举几个很实用的小例子来看看:

task clearOutput(type:Delete){    // 删除任务,内容就是删除两个目录
delete 'build_output'
delete '../app/libs'
} task taskJar(type:Jar, dependsOn:"assembleRelease" ) {    // 这个Jar包的任务依赖于assembleRelease(系统的Release配置任务)意思就是相当于执行这个任务了,并且还附加了下面的逻辑步骤
from 'build/intermediates/classes/release/'        // 源路径
destinationDir = file('build_output/libs')         // 目标路径
} task releaseOutput(type:Copy, dependsOn: [clearOutput, taskJar]) { // 依赖于两个任务,相当于要依次执行完这两个任务,之后再拷贝文件(文件列表如下描述)
from('libs') {
include '*.jar','armeabi-v7a/lib*.so'
}
into ('build_output/libs')
} task releaseOutputAar(type:Copy, dependsOn:[clearOutput, "assembleRelease"]){ // 依赖于两个任务,之后拷贝,拷贝的目标可以是多个,连续执行
from('build/outputs/aar') {
include 'testjni-release.aar'
}
into ('build_output')
into ('../app/libs')
}

(10)【坑】有一点要理解深入点:一旦配置了externalNativeBuild,那么执行以及依赖assembRelease/Debug的任务可就都会编译打包so了!不配置就只会编译打包Java部分。

[Android] 配置build.gradle 动态传参的更多相关文章

  1. Android使用Gradle命令动态传参完成打包,不需要修改代码

    不得不说,Gradle很强大,有人会问Gradle是什么?这里也不细讲,在我认为他就是一个构建神器.Gradle 提供了: 一个像 Ant 一样的非常灵活的通用构建工具 一种可切换的, 像 Maven ...

  2. Failed to apply plugin [id 'com.android.application'] 和 Could not find com.android.tools.build:gradle:2.XX的最正确的解决方法

    发现android studio是真的可爱啊,上一秒还没问题可以build运行,下一秒就出错...好,你任性,你牛逼.. 说下今天又遇到的两个问题:Failed to apply plugin [id ...

  3. 在Java中动态传参调用Python脚本

    最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...

  4. android 的build.gradle 的API手册

    问题:对于用gradle的来配置java的开发者都能在GRADLE_HOME/docs/dsl找到如何对其build.gradle文件的具体属性. 但是对于开发android的开发者就不能对于官方的& ...

  5. com.android.tools.build:gradle:X.XX.XX:gradle.jar 插件无法下载问题

    在使用Android Studio 这个IDE时,出现com.android.tools.build:gradle:X.XX.XX:gradle.jar 插件无法下载问题 可能的原因就是网速不好或者依 ...

  6. vue 路由动态传参 (多个)

    动态传参 传值页面  客户列表clientList.vue 路由 router.js 配置路由 接收参数的页面  客户详情CustomerDetails.vue 通过this.$router.para ...

  7. 解决AS加载gradle时出现的Could not find com.android.tools.build:gradle:3.5.0.的错误

    时间:2019/12/7 最近在做安卓大作业时总是遇到从GitHub上下载下来的demo不能在本地Android studio中运行的问题,感觉真的被安卓中的各种版本给恶心到了,下面记录其中比较典型的 ...

  8. 解决 Could not find com.android.tools.build:gradle 问题

    今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...

  9. Could not find com.android.tools.build:gradle:1.3.0.

    * What went wrong:          A problem occurred configuring project ':TZYJ_Android'.> Could not re ...

随机推荐

  1. python3.6升级

    Ubuntu 14.04 and 16.04 If you are using Ubuntu 14.04 or 16.04, you can use Felix Krull's deadsnakes ...

  2. Sublime 官方安装方法

    1. Crtl + ` : 进入控制台模式 2. 复制下面相应版本的代码,按Enter键运行 Sublime Text 3 import urllib.request,os,hashlib; h = ...

  3. BZOJ 2002:Bounce 弹飞绵羊(分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 14944  Solved: 7598 [Su ...

  4. hdu3338 Kakuro Extension 最大流

    If you solved problem like this, forget it.Because you need to use a completely different algorithm ...

  5. Math.floor(-8.5)=多少?

    Math.floor()   表示向下取整,返回double类型   (floor---地板)  Math.ceil()   表示向上取整,返回double类型    (ceil---天花板)  Ma ...

  6. 【BZOJ3992】【SDOI2015】序列统计

    数论劲啊 原题: 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列.但是小 ...

  7. 打印流-PrintStream和PrintWriter

    概念: 打印流是输出信息最方便的类,注意包含PrintStream(字节打印流)和 PrintWriter(字符打印流).打印流提供了非常方便的打印功能,可以打印任何类型的数据信息,例如:小数,整数, ...

  8. gravitee-gateway 又一个开源 apigateway

    gravitee-gateway 是Gravitee.io基于 java 开发的api gateway 功能很丰富,包含ui 界面 报警管理,访问控制管理,同时也包含一个比较完整的api 声明周期管理 ...

  9. debezium sql server 集成

    debezium 是一个方便的cdc connector 可以帮助我们解决好多数据实时变更处理.数据分析.微服务的数据通信 从上次跑简单demo到现在,这个工具是有好多的变更,添加了好多方便的功能,支 ...

  10. A* 寻路学习

    启发式搜索:启发式搜索就是在状态空间中的搜索.对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无谓的搜索路径,提高了效率.在启发式搜索中,对位置的估价是十分重 ...