Android Gradle 常用

https://developer.android.google.cn/studio/build/gradle-tips#configure-instrumentation-manifest-settings

  1. 禁止部分任务
gradle.taskGraph.whenRead{
	tasks.each{task->
		if(task.name.contains('test')||task.name.contains('mockable')){
			task.enabled=false;
		}
	}
}
  1. flavorDimenstions配置
flavorDimensions "api" ,"mode"
productFlavors{
	demo{
		flavorDimensions("mode") 
	} 
	full{
		flavorDimensions("mode")
	}
	minApi24{
		flavorDimensions("api")
	}
}
  1. 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名字
		}
	}
}
  1. 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}"/>
  1. 签名信息配置
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. 多工程全局变量
//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 
	}
}
  1. 动态设置一些额外信息
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()
}
  1. 开启multiDex打包
android{
	defaultConfig{
		multiDexEnabled ture
	}
}
  1. 设置默认变体
android{
	defaultPublishConfig "demoDebug"
}
  1. 过滤变体
android{
	variantFilter{variant->
		def names=variant.flavors*.name
		if(names.contains("minApi24")){
			setIgnore(true)
		}
	}
}
  1. 通过Instant Run 启用代码压缩,dubug时
android{
	buildTypes{
		minifyEnabled true
		useProguard false
		proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
	}
}
  1. 配置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)
        }
    })
}
  1. 设置项目的编码
tasks.withType(JavaCompile){
	options.encoding "UTF_8"
}
  1. 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()
}

猜你喜欢

转载自blog.csdn.net/eden_tian/article/details/85924287