https://developer.android.google.cn/studio/build/gradle-tips#configure-instrumentation-manifest-settings
- 禁止部分任务
gradle.taskGraph.whenRead{
tasks.each{task->
if(task.name.contains('test')||task.name.contains('mockable')){
task.enabled=false;
}
}
}
- flavorDimenstions配置
flavorDimensions "api" ,"mode"
productFlavors{
demo{
flavorDimensions("mode")
}
full{
flavorDimensions("mode")
}
minApi24{
flavorDimensions("api")
}
}
- manifest文件
//variant 实际类型 com.android.build.gradle.internal.api.AndroidArtifactVariantImpl
//buildType 实际类型 com.android.build.gradle.internal.api.ReadOnlyBuildType
android.applicationVariants.all{variant->
variant.outputs.each{output->
output.processManifest.doLast{
def dirName=variant.getDirName();// minApi24/release
def flavorName=variant.getFlavorName();// minApi24
def buildType=variant.getBuildType().getName();//release
// manifest文件路径需要看gradle插件具体版本,具体情况可以在
// app/build/intermediates/目录下寻找
// 例如 app/build/intermediates/manifests/full/full/debug/AndroidManifest.xml
//前一个full是都有的,后一个full是product名字
}
}
}
- mainfest占位符
//manifestPlaceholder 可以写在
// 1. defaultConfig中,
// 2. 也可以分别写在buildTypes.release,buildTypes.debug
// 3. productFlavors.demo ...
manifestPlaceholders=[
JPUSH_APPKEY:"aas546asdasdfasdfd"
]
//在manifest中写入
<meta-data
android:name="JPUSH_APPKEY"
android:value="${JPUSH_APPKEY}"/>
- 签名信息配置
Properties props=new Properties();
props.load(new FileInputStream(file('sign.properties')));
android{
signingConfigs{
release{
keyAlias props['KEY_ALIAS']
keyPassword props['KEY_PASSWORD']
storeFile file(props['KEYSTORE_FILE'])
storePassword props['KEYSTORE_PASSWORD']
}
}
buildTypes{
debug{
signingConfig signingConfigs.release
}
release{
signingConfig signingConfigs.release
}
}
}
- 多工程全局变量
//1. 根目录 build.gradle
ext{
compileSdkVersion = 22
buildToolsVersion = "23.0.1"
minSdkVersion = 10
targetSdkVersion = 22
versionCode = 34
versionName = "v2.6.1"
}
//2. 在module的build.gradle中
android{
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.xxx.xxx"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
}
}
- 动态设置一些额外信息
android {
defaultConfig {
resValue "string", "build_time", buildTime()
resValue "string", "build_host", hostName()
resValue "string", "build_revision", revision()
}
buildTypes{
debug{
buildConfigField "boolean","LOG_DEBUG","TRUE"
buildConfigField "String","API_HOST","\"http://api.test.com\""
}
}
}
def buildTime() {
return new Date().format("yyyy-MM-dd HH:mm:ss")
}
def hostName() {
return System.getProperty("user.name") + "@" + InetAddress.localHost.hostName
}
//获取这次编译时当前分支的git hash值
def revision() {
def code = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = code
}
return code.toString()
}
- 开启multiDex打包
android{
defaultConfig{
multiDexEnabled ture
}
}
- 设置默认变体
android{
defaultPublishConfig "demoDebug"
}
- 过滤变体
android{
variantFilter{variant->
def names=variant.flavors*.name
if(names.contains("minApi24")){
setIgnore(true)
}
}
}
- 通过Instant Run 启用代码压缩,dubug时
android{
buildTypes{
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
- 配置DEX选项,缩短构建时间
android{
dexOptions{
maxProcessCount 8
javaMaxHeapSize '2g'
preDexLibraries ture
}
}
// 或者
android{
dexOptions(new Action<DexOptions>() {
@Override
void execute(DexOptions dexOptions) {
dexOptions.setMaxProcessCount(8)
dexOptions.setJavaMaxHeapSize("4g")
dexOptions.setPreDexLibraries(true)
dexOptions.setThreadCount(20)
}
})
}
- 设置项目的编码
tasks.withType(JavaCompile){
options.encoding "UTF_8"
}
- manifest 具体修改方法,gradle plugin 3.1.4
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processManifest.doLast { task ->
def flavorName = variant.getFlavorName()
def buildType = variant.getBuildType().getName()
if ("demo" == flavorName && "release" == buildType) {
def file="${projectDir}/build/intermediates/manifests/full/${flavorName}/${buildType}/AndroidManifest.xml"
editManifest(new File(file))
}
}
}
}
def editManifest(File manifestFile) {
def parser = new XmlParser()
Node manifest = parser.parse(manifestFile)
//
// 得到的是一个数组
NodeList applicationList = manifest.get("application")
// 得到application 节点
Node application = applicationList[0]
//
//删除application节点内第一个meta-data节点
application.remove(application.get("meta-data")[0])
//
//构造meta-data 的属性
HashMap<String,String> map=new HashMap<>()
map.put("android:name","AppKey")
map.put("android:value","123465")
//在application之内追加一个 meta-data
application.appendNode(new javax.xml.namespace.QName("meta-data"), map, "")
//
//
// 重新保存新的manifest
FileWriter writer=new FileWriter(manifestFile,false)
//将manifest节点转化未xml
String newContent=groovy.xml.XmlUtil.serialize(manifest)
writer.write(newContent)
writer.flush()
writer.close()
}