import groovy.xml.QName
buildscript {
ext.dataBindingRootFolder = project.projectDir
apply from: 'propLoader.gradle'
ext.addRepos(repositories)
if (ext.dataBindingConfig.addRemoteRepos) {
dependencies {
classpath "com.android.databinding:localizemaven:${dataBindingConfig.extraPluginsVersion}"
}
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:5.2.1'
}
}
subprojects {
if (dataBindingConfig.isIndependent) {
apply plugin: 'maven'
if (dataBindingConfig.addRemoteRepos && !dataBindingConfig.forGradlePlugin) {
apply plugin: 'com.android.databinding.localizemaven'
}
} else {
apply from: "${project.projectDir}/../../buildSrc/base/baseJava.gradle"
}
if (it.name != "compilationTests") {
group = dataBindingConfig.group
version = dataBindingConfig.version
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file://${dataBindingConfig.mavenRepoDir}")
}
}
}
}
buildscript {
addRepos(repositories)
}
}
if (dataBindingConfig.addRemoteRepos && !dataBindingConfig.forGradlePlugin) {
rootProject.localizeMaven {
localRepoDir = file(dataBindingConfig.megaRepoDir)
otherRepoDirs = dataBindingConfig.localRepositories
}
}
task deleteRepo(type: Delete) {
delete "${dataBindingConfig.mavenRepoDir}/${dataBindingConfig.group.replace('.', '/')}"
}
task deletePrebuildFolder(type: Delete) {
delete "${dataBindingConfig.prebuildFolder}"
}
task deleteEap(type: Delete) {
delete "${dataBindingConfig.eapOutDir}"
}
def buildExtensionsTask = project.tasks.create "buildExtensionsTask", Exec
buildExtensionsTask.workingDir file('extensions').getAbsolutePath()
buildExtensionsTask.commandLine './gradlew'
buildExtensionsTask.args 'clean', 'uploadArchives', '--info', '--stacktrace',
"-PuseReleaseVersion=${dataBindingConfig.inReleaseBuild ? 'true' : 'false'}",
"-PaddRemoteRepos=${dataBindingConfig.addRemoteRepos ? 'true' : 'false'}",
"-PforGradlePlugin=${dataBindingConfig.forGradlePlugin ? 'true' : 'false'}"
buildExtensionsTask.dependsOn subprojects.uploadArchives
def prepareExtensionPrebuilds = project.tasks.create "prepareExtensionPrebuilds", Exec
prepareExtensionPrebuilds.workingDir file('extensions').getAbsolutePath()
prepareExtensionPrebuilds.commandLine './gradlew'
prepareExtensionPrebuilds.args 'clean', 'preparePrebuilds', '--info', '--stacktrace',
"-PuseReleaseVersion=${dataBindingConfig.inReleaseBuild ? 'true' : 'false'}",
"-PaddRemoteRepos=${dataBindingConfig.addRemoteRepos ? 'true' : 'false'}",
"-PforGradlePlugin=${dataBindingConfig.forGradlePlugin ? 'true' : 'false'}"
prepareExtensionPrebuilds.dependsOn subprojects.uploadArchives
file('integration-tests').listFiles().findAll { it.isDirectory() }.each {
println("Creating run test task for ${it.getAbsolutePath()}.")
def testTask = project.tasks.create "runTestsOf${it.getName().capitalize()}", Exec
testTask.workingDir it.getAbsolutePath()
//on linux
testTask.commandLine './gradlew'
testTask.args 'clean', 'connectedCheck', '--info', '--stacktrace',
"-PuseReleaseVersion=${dataBindingConfig.inReleaseBuild ? 'true' : 'false'}",
"-PaddRemoteRepos=${dataBindingConfig.addRemoteRepos ? 'true' : 'false'}",
"-PforGradlePlugin=${dataBindingConfig.forGradlePlugin ? 'true' : 'false'}"
testTask.dependsOn subprojects.uploadArchives
}
task runIntegrationTests {
dependsOn tasks.findAll { task -> task.name.startsWith('runTestsOf') }
}
task runAllTests {
dependsOn runIntegrationTests
}
task preparePrebuilds() {
dependsOn deletePrebuildFolder
dependsOn prepareExtensionPrebuilds
}
allprojects {
afterEvaluate { project ->
runAllTests.dependsOn project.tasks.findAll {task -> task.name.equals('test')}
runAllTests.dependsOn project.tasks.findAll {task -> task.name.equals('connectedCheck')}
preparePrebuilds.dependsOn project.tasks.findAll {task -> task.name.startsWith('prebuild')}
}
}
subprojects.uploadArchives.each { it.shouldRunAfter deleteRepo }
subprojects.uploadArchives.each { it.shouldRunAfter deletePrebuildFolder }
buildExtensionsTask.shouldRunAfter deleteRepo
tasks['runTestsOfMultiModuleTestApp'].dependsOn tasks['runTestsOfIndependentLibrary']
task rebuildRepo() {
dependsOn deleteRepo
dependsOn subprojects.uploadArchives
}
task copySamplesToEap(type : Copy) {
mustRunAfter deleteEap
from ("$projectDir/samples") {
exclude "**/build"
exclude "**/local.properties"
}
into "${dataBindingConfig.eapOutDir}/samples"
}
task copyMavenRepoToEap(type : Copy) {
mustRunAfter deleteEap
dependsOn rebuildRepo
from(dataBindingConfig.mavenRepoDir)
into "${dataBindingConfig.eapOutDir}/${dataBindingConfig.mavenRepoName}"
}
tasks.create(name : 'createEapdataBindingConfigFile') << {
def propsFile = new File("${dataBindingConfig.eapOutDir}/databinding.properties")
Properties props = new Properties()
props.setProperty('version', dataBindingConfig.version)
props.setProperty('mavenRepoName', dataBindingConfig.mavenRepoName)
props.store(propsFile.newWriter(), null)
}
task batchEAP() {
dependsOn deleteEap
dependsOn copyMavenRepoToEap
dependsOn copySamplesToEap
dependsOn createEapdataBindingConfigFile
}
def findChildByTag(node, tag) {
return node.children().find {
it.name().getLocalPart().equals(tag)
}
}
def fullJar(project) {
def localizeTask = project.parent.tasks.findByName('localizeDependencies')
if (localizeTask != null) {
localizeTask.dependsOn project.tasks.findByName('buildLicenseNotice')
}
if (!dataBindingConfig.runProguard || !dataBindingConfig.inReleaseBuild) {
return
}
def jarName = project.uploadArchives.repositories.mavenDeployer.pom.artifactId
def workingDir = "${project.buildDir}/intermediates/fullJar"
def fatJar = "${workingDir}/${jarName}-fat.jar"
def proguardJar = "${workingDir}/${jarName}-proguard.jar"
def jarJar = project.jar.archivePath
project.configurations {
jarJarArchives
}
project.tasks.create(name: 'fatJar', type: Jar) {
baseName = jarName + '-fat'
doFirst {
file(workingDir).mkdirs()
}
def deps = new HashSet<ResolvedDependency>()
project.configurations.compile.resolvedConfiguration.firstLevelModuleDependencies.each {
if (!it.moduleGroup.startsWith('com.android.tools')) {
deps.addAll(it.allModuleArtifacts)
}
}
from { deps.findAll { !it.name.contains('baseLibrary') && !it.name.contains("juniversalchardet")}.collect {
it.file.isDirectory() ? it.file : project.zipTree(it.file)
} } {
exclude "META-INF/maven/**"
exclude "META-INF/MANIFEST.MF"
exclude "META-INF/LICENSE.txt"
exclude "META-INF/NOTICE.txt"
exclude "META-INF/services/javax.annotation.processing.Processor"
exclude "**/*.stg"
}
archiveName "${baseName}.jar"
destinationDir = new File(workingDir)
with project.jar
}
project.tasks.create(name: 'proguard', type: proguard.gradle.ProGuardTask) {
dependsOn 'fatJar'
injars fatJar
outjars proguardJar
configuration '../proguard.cfg'
}
project.tasks.create(name: 'jarJarFile') {
dependsOn 'proguard'
dependsOn project.jar
def inputLibrary = proguardJar
def outputLibrary = jarJar
inputs.file(inputLibrary)
outputs.file(outputLibrary)
doLast {
def jarJarLibrary = new File(dataBindingConfig.externalPrebuiltsBase,
'tools/common/m2/repository/com/googlecode/jarjar/jarjar/1.3/jarjar-1.3.jar').
getCanonicalPath()
// in Ant
ant.taskdef(name: "jarjarIt",
classname: 'com.tonicsystems.jarjar.JarJarTask',
classpath: jarJarLibrary)
// start jarjar task
ant.jarjarIt(jarfile: outputLibrary) {
// input is our inputLibrary
zipfileset(src: inputLibrary)
// rule to repackage antlr to new package
rule pattern: 'org.antlr.**', result: 'com.google.repacked.antlr.@1'
rule pattern: 'com.tunnelvisionlabs.**', result: 'com.google.repacked.tunnelvision.@1'
rule pattern: 'org.abego.treelayout.**', result: 'com.google.repacked.treelayout.@1'
// rule to repackage commons
rule pattern: 'org.apache.**', result: 'com.google.repacked.apache.@1'
rule pattern: 'kotlin.**', result: 'com.google.repacked.kotlin.@1'
}
}
}
project.uploadArchives {
dependsOn 'jarJarFile'
repositories {
mavenDeployer {
pom.whenConfigured { pom ->
pom.dependencies.removeAll { dep ->
def isBaseLibrary = dep.groupId == 'com.android.databinding' &&
dep.artifactId == 'baseLibrary'
def isGradle = dep.groupId == 'com.android.tools.build' &&
dep.artifactId == 'gradle'
def isChardet = dep.groupId == 'com.googlecode.juniversalchardet' &&
dep.artifactId == 'juniversalchardet'
return !isBaseLibrary && !isGradle && !isChardet
}
}
}
}
outputs.upToDateWhen { false } // force it to re-run all the time.
}
project.bintrayUpload.dependsOn 'jarJarFile'
project.publishing.publications.mavenJava(MavenPublication) {
pom.withXml {
def deps = findChildByTag(asNode(), "dependencies")
if (deps == null) {
throw new IllegalArgumentException("cannot find dependencies in pom file")
}
def unwanted = deps.children().findAll {
def groupId = findChildByTag(it, "groupId").localText()[0]
def artifactId = findChildByTag(it, "artifactId").localText()[0]
def isBaseLibrary = groupId == 'com.android.databinding' &&
artifactId == 'baseLibrary'
def isGradle = groupId == 'com.android.tools.build' && artifactId == 'gradle'
def isChardet = groupId == 'com.googlecode.juniversalchardet' &&
artifactId == 'juniversalchardet'
return !isBaseLibrary && !isGradle && !isChardet
}
unwanted.each {
deps.remove(it)
}
}
}
}