[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
// 这里面一个小细节很重要,执行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 动态传参的更多相关文章
- Android使用Gradle命令动态传参完成打包,不需要修改代码
不得不说,Gradle很强大,有人会问Gradle是什么?这里也不细讲,在我认为他就是一个构建神器.Gradle 提供了: 一个像 Ant 一样的非常灵活的通用构建工具 一种可切换的, 像 Maven ...
- 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 ...
- 在Java中动态传参调用Python脚本
最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...
- android 的build.gradle 的API手册
问题:对于用gradle的来配置java的开发者都能在GRADLE_HOME/docs/dsl找到如何对其build.gradle文件的具体属性. 但是对于开发android的开发者就不能对于官方的& ...
- com.android.tools.build:gradle:X.XX.XX:gradle.jar 插件无法下载问题
在使用Android Studio 这个IDE时,出现com.android.tools.build:gradle:X.XX.XX:gradle.jar 插件无法下载问题 可能的原因就是网速不好或者依 ...
- vue 路由动态传参 (多个)
动态传参 传值页面 客户列表clientList.vue 路由 router.js 配置路由 接收参数的页面 客户详情CustomerDetails.vue 通过this.$router.para ...
- 解决AS加载gradle时出现的Could not find com.android.tools.build:gradle:3.5.0.的错误
时间:2019/12/7 最近在做安卓大作业时总是遇到从GitHub上下载下来的demo不能在本地Android studio中运行的问题,感觉真的被安卓中的各种版本给恶心到了,下面记录其中比较典型的 ...
- 解决 Could not find com.android.tools.build:gradle 问题
今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...
- Could not find com.android.tools.build:gradle:1.3.0.
* What went wrong: A problem occurred configuring project ':TZYJ_Android'.> Could not re ...
随机推荐
- 20165228 学习基础和C语言基础调查
========== 做中学读后感 我依然认为兴趣与自觉性是推动一个人进步的两大因素,他们之间的区别是"兴趣"带来的影响更多是主动性的学习,而"自觉"则是略显被 ...
- lesson3 overfitting -fastai
VGG:3*3Imagenet:7*7,9*9论文中证明3*3更胜一筹,但是用多少并没有定论微调:删掉模型的中间只对最后一层微调:model.pop,就删掉了最后一层 如何决定训练多少层?:·看论文上 ...
- 20155208实验二 Java面向对象程序设计
20155208实验二 Java面向对象程序设计 一.实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5 ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(二进制枚举)
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughter of a missing adv ...
- 组合数据类型,英文词频统计 python
练习: 总结列表,元组,字典,集合的联系与区别.列表,元组,字典,集合的遍历. 区别: 一.列表:列表给大家的印象是索引,有了索引就是有序,想要存储有序的项目,用列表是再好不过的选择了.在python ...
- LG3978 【[TJOI2015]概率论】
前置:卡特兰数 记\(C_n\)为\(n\)个节点的二叉树的个数,\(C_0=1\),对于\(n \geq 1\),取一个根节点,枚举其左子树大小,有 \[C_n=\sum_{i=0}^{n-1}C_ ...
- linux内核入门(1)——基本简介和编译
获取linux内核源码,自己选择版本(我下载的是linux-3.1.10.tar.gz ,我是直接下载到/usr/src文件夹的) 下载地址传送门 https://www.kernel.org/pub ...
- Android资源收集
1 android studio最新版本下载地址:https://developer.android.google.cn/studio/preview/?utm_source=android-stud ...
- 几个方便进行micro frontend 开发的工具&&类库
nodejs 类库 从当前来说nodejs 的npm 偏多,因为毕竟面向的是web 编程 tailor 一个layout 服务(基于fragment 的开发方式)https://github.com/ ...
- 01Hadoop简介
Hadoop思想之源:Google 面对的数据和计算难题 ——大量的网页怎么存储 ——搜索算法 带给我们的关键技术和思想(Google三篇论文) ——GFS(hdfs) ——Map-Reduce —— ...