-
-
Save paour/9189462 to your computer and use it in GitHub Desktop.
| 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] | |
| } |
http://stackoverflow.com/a/21991625/304876 for details
you are my hero!
Great solution. I only have the default build flavor and was getting index out of bounds exceptions. To prevent this I removed the definition of the flavor variable at line 22, which was calling .get(0) on a size 0 list. Similarly in defining the task name I removed the flavor variable: def taskName = "override${buildType.capitalize()}Authority". This when worked like a charm. Only from the command line, incidentally, due to some issues with my Android Studio looking the wrong place for res-auto-values.xml.
EDIT: The issue from inside Android Studio was that the relative paths appeared to be resolved using System.getProperty("user.dir"), which was returning a different directory than that which is returned when calling through the command line. The solution was to give an absolute path to the XMLParser. I replaced the first lines of overrideProviderAuthority with the following:
inFileAbsolute = gradle.startParameter.getProjectDir().getAbsolutePath() + "/" + inFile
def xml = new XmlParser().parse(inFileAbsolute)
@srsudar Come here to say thank you very much! =D
I have none flavors! =D
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.
I'd been using https://gist.github.com/cmelchior/6988275, but recent versions of the Android gradle plugin and/or IntelliJ have prevented this from working correctly (see the discussion of the referenced gist), and the chosen system caused the build to remerge all resources on each build.