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

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

  1. gradlew releaseAutoBLForAar

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

  1. defaultConfig {
  2. applicationId "com.test"
  3. minSdkVersion 15
  4. targetSdkVersion 23
  5. versionCode 5
  6. versionName 1.1.0
  7. buildConfigField("String", "API_HOST", "${API_DEV_HOST}")
  8. }

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

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

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

  1. buildTypes {
  2. release { /* 线上环境 */
  3. buildConfigField "boolean", "LOG_DEBUG", "false" // 不显示Log
  4. buildConfigField "String", "API_HOST", "${API_RELEASE_HOST}" //API Host
  5. minifyEnabled true //是否混淆
  6. zipAlignEnabled true //是否设置zip对齐优化
  7. shrinkResources true // 移除无用的resource文件
  8. signingConfig signingConfigs.release //签名
  9. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  10. }
  11. preRelease { /* 预发环境 */
  12. buildConfigField "boolean", "LOG_DEBUG", "false" // 不显示Log
  13. // 。。。
  14. }
  15. debug { /* 本地开发环境 */
  16. minifyEnabled false
  17. }
  18. beta { /* 测试环境 */
  19. buildConfigField "boolean", "LOG_DEBUG", "true" // 显示Log
  20. // 。。。
  21. }
  22. }

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

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

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

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

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

  1. def TEST_TALKING_DATA_APP_ID = "6E5389EAD0C2C2CFB7B379701F6D2BA8"
  2.  
  3. defaultConfig {
  4. applicationId "com.test"
  5. minSdkVersion 15
  6. targetSdkVersion 23
  7. versionCode 5
  8. versionName 1.1.0
  9. buildConfigField("String", "API_HOST", "${API_DEV_HOST}")
  10. manifestPlaceholders = [
  11. /* talkingData 测试环境 */
  12. TALKING_DATA_APP_ID: "${TEST_TALKING_DATA_APP_ID}" /* 可以新增多个键值对,表示变量与对应的值 */
  13. ]
  14. }

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

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

  1. defaultConfig {
  2. applicationId "com.ixwork"
  3. minSdkVersion 15
  4. targetSdkVersion 23
  5. //关键看这两行
  6. versionCode project.hasProperty('VERSION_CODE') ? Integer.parseInt(VERSION_CODE) : DEF_VERSION_CODE
  7. versionName project.hasProperty('VERSION_NAME') ? VERSION_NAME : "${DEF_VERSION_NAME}"
  8. buildConfigField("String", "API_HOST", "${API_DEV_HOST}")
  9. }

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

  1. 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)设置依赖文件名称和扩展名。

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

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

  1. allprojects {
  2. repositories {
  3. google()
  4. jcenter()
  5.  
  6. flatDir {dirs '../app/libs'} // 在整个工程的build.gradle 中仓库配置此字段
  7. }
  8. }

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

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

(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. Python之路,第一篇:Python入门与基础

    第一篇:Python入门与基础 1,什么是python? Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 2,python的特征: (1)易于学习,易于利用: (2)开 ...

  2. 设置 SSH 通过密钥登录

    我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器.但是,一般的密码方式登录,容易有密码被暴力破解的问题.所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者 ...

  3. [LeetCode&Python] Problem 892. Surface Area of 3D Shapes

    On a N * N grid, we place some 1 * 1 * 1 cubes. Each value v = grid[i][j] represents a tower of v cu ...

  4. C#线程、前后台线程

    C#线程.前后台线程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新 ...

  5. java关键字详解----static

    Java Static关键字详解   提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... ...

  6. MAC使用mysql报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    遇到这种错误,需要重置密码. Step1:停止mysql,命令如下: $ sudo service mysql stop 或者是 $ sudo /usr/local/mysql/support-fil ...

  7. PAT-7-14 电话聊天狂人

    ps: 真不明白为什么水题不能一次ac 7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条 ...

  8. HDU 1087:Super Jumping! Jumping! Jumping!(LIS)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  9. i = i ++;的分解

    步骤分解: package wrong; public class ShortTest { public static void main(String args[]) { /* * i = i ++ ...

  10. UE4 IOS 开发之传感器输入

    Iphone的传感器包括陀螺仪.加速计等. UE4提供了4个按键来收集这些传感器的3维数据.具体位置:ProjectSettings->Input. 其中Tilt数据可以反映Iphone目前的物 ...