Last active
October 5, 2016 12:04
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.