简单的总结一下gradle:

1.Gradle是一种构建工具,它可以帮你管理项目中的差异,依赖,编译,打包,部署......你可以定义满足自己需要的构建逻辑,写入到build.gradle中供日后复用.

2.Gradle不是一种编程语言,它不能帮你实现软件中的任何实际功能

Gradle 基本

如果你用Android Studio新建一个项目的时候,默认生成一大堆关于gradle的东西,其中最重要的是一个build.gradle的文件,内容如下:

apply plugin: 'com.android.application'android {compileSdkVersion 26buildToolsVersion "26.0.0"defaultConfig {minSdkVersion 19targetSdkVersion 26versionCode 1versionName "1.0"}buildTypes {release {runProguard falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'}}
}dependencies {compile 'com.android.support:support-v4:26.0.+'
}
复制代码

解读:

apply plugin::指定用的是哪个插件,开发中常见的值有:'com.android.application':Android APP插件(打包得到的是.apk文件)'com.android.library':Android库插件(打包得到的是.aar文件)'java':普通的java插件(打包得到的是.jar文件)
我目前用到的还有:kotlin-android : kotlinbugly.gradle : 腾讯buglywalle.gradle : 美团walle打包
复制代码
android{}用来指定Android打包插件的相关属性,包含如下节点:
compileSdkVersion(apiLevel):设置编译时用的Android版本
buildToolsVersion(buildToolsVersionName):设置编译时使用的构建工具的版本
defaultConfig:设置一些默认属性,其可用属性是buildTypes(debug,release,其他+)和productFlavors(谷歌商店,豌豆荚,小米应用商店)之和。最终可以打出的APK的数量就是buildTypes乘以productFlavors。构建的变量名称是productFlavors+buildTypes。
复制代码
dependencies 配置依赖:
各种外部依赖直接一行代码搞定,不用手动下依赖包了。
其中compile fileTree(dir: 'libs', include: ['*.jar'])的意思是依赖libs目录下全部的jar文件。
复制代码
buildscript {repositories {google()jcenter()mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:3.2.1'}
}
复制代码

buildscript节点,大概意思就是支持maven,google,声明Gradle的版本.如果用到一些其他插件也需要在此申明.

signingConfigs {myConfig {storeFile file("xxx.keystore")storePassword "123123"keyAlias "xxx"keyPassword "123123"v2SigningEnabled true}
}buildTypes{release {//应用myConfigsigningConfig  signingConfigs.myConfigminifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'}
}
复制代码
签名配置:
storeFile : keystore文件
storePassword : 密码
keyAlias : 别名
keyPassword : 别名密码
v2SigningEnabled : 启用V2签名方案
minifyEnabled : 是否开启混淆
shrinkResources : 是否移除无用资源文件,shrinkResources依赖于minifyEnabled,必须和minifyEnabled一起用
复制代码

以上只是最简单的gradle配置,实际项目中我们的app会很复杂,比如不仅引用到一些jar文件,也可能会引用一些Android Library项目以及一些.so文件,而且实际发布的时候我们可能不仅需要发布到一个平台上,目前Android大大小小可能得十几个平台,Gradle通过一些其他的配置都可以解决。顺便说下Gradle是Google大力支持的。

进阶配置

配置manifest变量

很多第三方SDK需要在AndroidManifest.xml中配置你的一些key信息,以融云为例,测试包和正式包的key是不同的,那么就可以这么写::

<meta-dataandroid:name="RONG_CLOUD_APP_KEY"android:value="${rongKey}" />
复制代码

然后在productFlavors中的各个版本中加上不同的信息,这样你打出的不同包采用的appkey也会不一样。

manifestPlaceholders = [rongKey: "8luwapkv8jrrl"]
复制代码

代码中读取变量

有时候我们想根据不同的版本,设置相同变量不同的值,最常见的使用场景就是 Log 工具类,通过设置 isDubug 不同值判断是否打印日志.其他还包括获取包名,获取渠道名

buildConfigField "String", "PlatformSource", "\"Google\""
buildConfigField "String", "showProjName", "\"TestProj\""
复制代码

最后调用 : BuildConfig.PlatformSource

public final class BuildConfig {public static final boolean DEBUG = Boolean.parseBoolean("true");public static final String APPLICATION_ID = "com.xxx.xxxx";public static final String BUILD_TYPE = "debug";public static final String PlatformSource = "Google";public static final String showProjName = "TestProj";
复制代码

上面的是加在defaultConfig 中的,而加在buildTypes或productFlavors中就会在不同构建版本出现不同的值。如果再配置上不同的applicationId,那么就可以在同一个手机上同时安装不同构建版本的应用。

productFlavors {//国内版本china{applicationId "com.shy.china"versionCode "2.0.0"versionName "30"}//韩国版本korea{applicationId "com.shy.korea"versionCode "1.0.0"versionName "1"}
}
复制代码

到这里你会发现buildTypes和productFlavors定义很相似,不过他们的差别在:

  • buildType 不会改变应用程序的代码,它们只是处理的东西不同,你可以通过 buildType 来获取更多的技术细节(例如:build optimization,log level minifyEnabled等等),但是app的内容不会改变.

  • productFlavor 配置可以改变app的内容(可以设想成 package 理解,buildType 没法改 applicationId).

BuildVariants变体

buildTypes+productFlavors相结合,组成构建变体,buildTypes构建类型,主要就是debug(测试),pre(预发布) ,release(线上)的分别。productFlavors产品口味,主要就是各种渠道版本。两个合体就会构建出不同的版本apk (总apk个数=构建类型个数*渠道个数).看图:

  • buildTypes构建类型
    buildTypes {release {multiDexKeepProguard file('multidex-config.pro')minifyEnabled true//是否开启混淆(上线)shrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}debug {multiDexKeepProguard file('multidex-config.pro')minifyEnabled false//是否开启混淆(上线)proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
复制代码
  • productFlavors多维度

    当需要从多个维度区分app版本,比如是否付费和渠道时,就需要使用flavorDimensions来区分

    flavorDimensions "channel", "env"productFlavors {china {dimension "channel"applicationId "com.shy.china"versionCode project.CHINA_VERSION_CODE as intversionName project.CHINA_VERSION_NAMEsigningConfig signingConfigs.chinabuildConfigField "String", "PlatformSource", "\"china\""buildConfigField "String", "showProjName", "\"projName_china\""manifestPlaceholders = [package_name : applicationId,JPUSH_PKGNAME: applicationId,JPUSH_APPKEY : "xxxxxxxxxxxx", //JPush上注册的包名对应的appkey.JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.]}korea {dimension "channel"applicationId "com.shy.korea"versionCode project.KOREA_VERSION_CODE as intversionName project.KOREA_VERSION_NAMEsigningConfig signingConfigs.koreamanifestPlaceholders = [package_name : applicationId,JPUSH_PKGNAME: applicationId,JPUSH_APPKEY : "xxxxxxx", //JPush上注册的包名对应的appkey.JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.]buildConfigField "String", "PlatformSource", "\"korea\""buildConfigField "String", "showProjName", "\"projName_korea\""}dev {dimension "env"}pre {dimension "env"}produce {dimension "env"}}复制代码

此时在build一下 , BuildVariants中会生成12种变体(总apk个数=构建类型个数渠道个数维度个数) :

chinaDevDebug(常用)
chinaDevRelease
chinaPreDebug
chinaPreRelease(常用)
chinaProduceDebug
chinaProduceRelease(常用)
koreaDevDebug(常用)
koreaDevRelease
koreaPreDebug
koreaPreRelease(常用)
koreaProduceDebug
koreaProduceRelease(常用)

注意!warning:

1.当添加了flavorDimensions,必须为每个productFlavors添加dimension,否则会提示错误

2.在gradle:3.0.0以上,在build.gradle里必须要有flavorDimensions字段,哪怕只有一个维度也要声明,否则报错

打包

一次生成所有渠道包 打开命令行窗口,进入到工程的根目录下,输入

gradle assembleChinaProduceRelease


其他技巧

1.Gradle task

Gradle task适合用来完成一些既繁琐又容易出错的重复性手工作,比如批量修改,复制,重命名文件。 比如applicationVariants.all这个task可以针对每个构建版本设置各种属性,比如修改每个构建版本生成的apk名字:

applicationVariants.all { variant ->variant.outputs.each { output ->output.outputFile = new File(new File("${project.rootDir.absolutePath}/apk/",//最后在项目下的apk文件夹下打出来的包名:chinaDev-GooglePlay-1.0.0-20181126-193438.apk("${flavorName}-${channel}-${buildType}-v${versionName}-${buildTime}.apk)}}
复制代码

2.Moudle动态依赖

在组件化app里面,我们可能在测试包和正式包需要依赖不同组件。比如测试环境需要调试模块,但正式环境不需要。假如productFlavors如下,调试模块名字为module-test

productFlavors {test{}publish{}
}
复制代码

那么在dependencies里面就可以这么依赖test模块:

ceshiCompile project(':module-test')

同样buildTypes也是适用的,两者可以一起或单独使用:

debugCompile project(':module-test')
ceshidebugCompile project(':module-test')
复制代码

3.定义全局变量

先在 project 根目录下创建ext_settings.gradle文件:

ext {CHINA_VERSION_NAME = '2.0.0'KOREA_VERSION_NAME = '1.0.0'CHINA_VERSION_CODE = 20KOREA_VERSION_CODE = 1androidToolsVersion = '28.0.3'supportLibraryVersion = '27.1.1'fireBaseVersion = '12.0.1'minSdkVersion = 19androidSdkVersion = 27kotlin_version = '1.3.0'gradlePlugin = '3.2.1'sourceCompatibilityVersion = JavaVersion.VERSION_1_8targetCompatibilityVersion = JavaVersion.VERSION_1_8
}
复制代码

然后在各 module 的 build.gradle 中可以通过rootProject.ext来引用:

defaultConfig {minSdkVersion rootProject.ext.minSdkVersiontargetSdkVersion rootProject.ext.androidSdkVersion
}
复制代码

依赖也可以挪过来:

ext.deps = [
junit                : 'junit:junit:4.12',
truth                : 'com.google.truth:truth:0.28',
recyclerview         : "com.android.support:recyclerview-v7:$supportLibraryVersion",
]
复制代码

调用:

dependencies {implementation deps.recyclerview
}
复制代码

4.配置独立的签名信息 & 将密码等文件统一配置

密码和签名这类的敏感信息可以统一进行存放,不进行硬编码。在gradle.properies中,我们可以随意的定义key-value。

STORE_FILE_PATH=../china.keystore
STORE_PASSWORD=123456
KEY_ALIAS=china
KEY_PASSWORD=test123
复制代码
    signingConfigs {china {//使用gradle.properies的配置file(STORE_FILE_PATH)storePassword STORE_PASSWORDkeyAlias KEY_ALIASkeyPassword KEY_PASSWORDv2SigningEnabled true}korea {//日常storeFile file('korea.keystore')storePassword "123456"keyAlias "kkk"keyPassword "123456"v2SigningEnabled true}}
复制代码

5.减少编译错误和忽略 lint 检查

    packagingOptions {//Espresso excludesexclude 'META-INF/DEPENDENCIES.txt'exclude 'META-INF/LICENSE.txt'exclude 'META-INF/NOTICE.txt'exclude 'META-INF/NOTICE'exclude 'META-INF/LICENSE'exclude 'META-INF/DEPENDENCIES'exclude 'META-INF/notice.txt'exclude 'META-INF/license.txt'exclude 'META-INF/dependencies.txt'exclude 'META-INF/LGPL2.1'exclude 'LICENSE.txt'}
复制代码
lintOptions {checkReleaseBuilds trueabortOnError false}
复制代码

6.引用本地aar

1.把aar文件放在某目录内,比如就放在某个module的libs目录内
2.在这个module的build.gradle文件中添加:

api fileTree(include: ['*.aar'], dir: 'libs')
复制代码

最后附上:
gradle谷歌官方:developer.android.com/studio/buil…
翻译版:avatarqing.github.io/Gradle-Plug…

和一首好音乐: 夜班车.(summer night in nanning)
intro:封面日本动漫神作混沌武士 仁,在救了一个青楼女子之后伫立河边目送她乘舟远去。 曲取自头文字D电影插曲,藤原文太这辈子做梦都不会想到他老婆会离开他,所以车手到底需不需要爱情,同样来自日本神作动漫《头文字D》

如有错误请指出我及时改正!

Android Gradle进阶配置指南相关推荐

  1. Android Gradle进阶配置指南 1

    简单的总结一下gradle: 1.Gradle是一种构建工具,它可以帮你管理项目中的差异,依赖,编译,打包,部署......你可以定义满足自己需要的构建逻辑,写入到build.gradle中供日后复用 ...

  2. Android Gradle 的配置从 Groovy 迁移到 KTS

    目录 #1. 引用 #2.常用术语 #3.脚本文件命名 #4.Gradle迁移示例 1.准备工作:对 Groovy 做简单转换 2. plugins 代码块迁移 3. 显式和隐式 buildTypes ...

  3. Android Gradle依赖配置与依赖冲突解决

    #.Gradle依赖配置 ##.Gradle依赖管理与两个重要的classpath相关,每个Module都有: 1.编译时路径:compileClasspath 编译时能使用的代码,当一个类参与编译时 ...

  4. android gradle 设置,android gradle配置指南

    Gradle简介 Gradle 是一个基于Ant和Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,这比我们的ANT使用XML构建配置要灵活的多.在 ...

  5. 这一次彻底弄明白Gradle相关配置

    这一次彻底弄明白Gradle相关配置 鸿洋 鸿洋 微信号 hongyangAndroid 功能介绍 你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识.点击历史消息,查看所有已推送 ...

  6. 【Android Gradle 插件】自定义 Gradle 插件优化图片 ① ( Android 中的 WebP 图片格式使用 | WebP 格式转换 | WebP 参考文档 )

    文章目录 一.Android 中的 WebP 图片格式使用 二.WebP 格式转换 三.WebP 参考文档 Android Plugin DSL Reference 参考文档 : Android St ...

  7. 【转】Android Studio安装配置学习教程指南 Gradle基础--不错

    原文网址:http://www.linuxidc.com/Linux/2015-02/113890p4.htm 其实很早之前也写了一篇Gradle的基础博客,但是时间很久了,现在Gradle已经更新了 ...

  8. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  9. Android Gradle(三)Groovy快速入门指南

    本文首发于微信公众号「刘望舒」 原文链接:Groovy快速入门看这篇就够了 前言 在前面我们学习了为什么现在要用Gradle?和Gradle入门前奏两篇文章,对Gradle也有了大概的了解,这篇文章我 ...

最新文章

  1. pytorch报错Unable to get repr for
  2. 105. Leetcode 121. 买卖股票的最佳时机 (动态规划-股票交易)
  3. 删除Add-On表字段后不能激活
  4. c# 判断是否为数组_c# – 如何检查反射类型是否为数组
  5. linux运维生产场景常用软件工具一览
  6. JAVA 电子书下载地址
  7. Python实现Kmeans文本聚类
  8. 灵活运用用第3方软件把“SWF”变回“FLA”
  9. MySQL基础知识思维导图大纲
  10. 第一行输入一个正整数N,随后的N行各输入一个人的姓名和年龄,中间用空格分隔(形如 “Tom 18“),将字符串转为形如 {“name“:“Tom“,“age“:18} 的字典,按顺序加入到列表中,得到
  11. 老台式电脑怎么连热点_台式电脑怎样连接wifi热点,教你一招快速连接
  12. 计算机 360云盘删除,如何删除电脑右键菜单中的保存到360云盘选项
  13. 国内最常用的坐标系大全
  14. 南京大学交叉培养计算机与金融招生人数,教务处组织召开计算机与金融工程实验班师生见面会...
  15. 基于UDP的企业级大文件传输体系
  16. 树莓派机器视觉环境搭建
  17. 艾宾浩斯遗忘曲线PHP,艾宾浩斯遗忘曲线计划表打印版
  18. RGB TO ARGB
  19. RTTI (Runtime Type Identification)
  20. #第五章“拷问”既往的股市理论5.1有人情味的“拷问”

热门文章

  1. 版本向量 使用css时正确区分IE版本[转]
  2. 网易编程题------操作序列
  3. 手把手教你写一个java的orm(二)
  4. python循环语句笔记
  5. 2017.8.15 数据库
  6. 旅行 jzoj 1281
  7. [转]GeoHash核心原理解析
  8. Codeforces 583 DIV2 Robot's Task 贪心
  9. 【ROS学习笔记】(十一)launch启动文件的使用方法
  10. php可以用lucene吗,php – Lucene外国字符问题