(1)一个Android工程中有一个build.gradle是负责Project范围的,而Module中又有各自的build.gradle是专门负责模块的。android
(2)在Gradle中Task是一等公民,经过gradlew + task名 能够直接执行指定Task,例以下面的命令就是执行:task releaseAutoBLForAarapi
gradlew releaseAutoBLForAar
(3)在defaultConfig中能够自定义变量名,编译时能够在Java代码中引用到:app
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 能够配置不一样的任务参数gradle
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 属性值。ui
首先在AndroidManifest.xml 文件中指定要使用Gradle动态配置值${TALKING_DATA_APP_ID}:google
<!--TalkingData 配置--> <meta-data android:name="TD_APP_ID" android:value="${TALKING_DATA_APP_ID}" />
能够在build.gradle中配置一个特别的变量属性:spa
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 来达到不一样的配置效果。 debug
(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部分。