Skip to content

Instantly share code, notes, and snippets.

@paour
Last active October 5, 2016 12:04
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save paour/9189462 to your computer and use it in GitHub Desktop.
Save paour/9189462 to your computer and use it in GitHub Desktop.
A simpler and more fool-proof way to handle search providers in Android Gradle builds
def overrideProviderAuthority(packageName, inFile, outFile) {
def xml = new XmlParser().parse(inFile)
xml.findAll{it.name() == 'string'}.each{item ->
if (!item.value().isEmpty() && item.value()[0] instanceof String && item.value()[0].startsWith(".res-auto")) {
item.value()[0] = item.value()[0].replace(".res-auto", packageName)
}
}
saveXML(outFile, xml)
}
def saveXML(pathToFile, xml) {
file(pathToFile).parentFile.mkdirs()
def writer = new FileWriter(pathToFile)
def printer = new XmlNodePrinter(new PrintWriter(writer))
printer.preserveWhitespace = true
printer.print(xml)
}
android.applicationVariants.all { variant ->
def flavor = variant.productFlavors.get(0).name
def buildType = variant.buildType.name
def packageName = variant.mergedFlavor.packageName + (variant.buildType.packageNameSuffix == null ? "" : variant.buildType.packageNameSuffix)
def outFile = "${buildDir}/res-auto-values/${variant.dirName}/values/strings.xml"
// define the strings that need to be auto-replaced in this file, and do NOT define them elsewhere
// make sure your AndroidManifest.xml and searchable.xml reference these resources
// this file should contain string resources; their values will be updated to replace .res-auto with the package name
def inFile = "variants/res-auto-values.xml"
def taskName = "override${flavor.capitalize()}${buildType.capitalize()}Authority"
task(taskName) << {
overrideProviderAuthority(packageName, inFile, outFile)
}
// instead of chnaging resource files from under Gradle, just add a source folder to the resource set
android.sourceSets[variant.name].res.srcDir file(outFile).parentFile.parent
// add in and out files to allow for incremental builds (not hugely important)
tasks[taskName].inputs.file file(inFile)
tasks[taskName].outputs.file file(outFile)
variant.mergeResources.dependsOn tasks[taskName]
}
@martingg88
Copy link

anyone have any idea this script will be executed if I click at "Rebuild Project", but it won't executed when i choose "Debug" app in Android Studio.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment