import groovy.swing.SwingBuilder buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.0.0' } } apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') } def execThing ( String cmdStr ) { def stdout = new ByteArrayOutputStream() String prefix = System.getenv("GITCMDPREFIX") if (prefix != null) { String cmd = prefix + cmdStr exec { commandLine cmd.tokenize() standardOutput = stdout } } else { exec { commandLine cmdStr.tokenize() standardOutput = stdout } } return stdout } def computeVersionName = { -> String ver = "git-source" try { if (execThing(" git status -z").toString().trim().equals("")) { return "git-" + execThing(' git log -1 --format="%h"').toString().trim() } else { return ver } } catch (all) { println "Cannot run git (not in path?), using default versioning" } return ver } def getProps() { Properties props = new Properties() File f = new File("t9build.properties") if (!f.exists()) { f.createNewFile() } props.load(new FileInputStream(f)) return props } def saveProps(Properties props) { props.store(new FileOutputStream(new File("t9build.properties")), null) } // -PincrementBuildNumber assembleRelease def computeVersionNumber = { -> Properties props = getProps() int verNum = Integer.valueOf(props.getProperty("verNum", "0")) if (project.hasProperty('incrementBuildNumber')) { verNum++ props.setProperty("verNum", String.valueOf(verNum)) saveProps(props) } return verNum } android { compileSdkVersion 8 buildToolsVersion "19.1" sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } // Move the tests to tests/java, tests/res, etc... instrumentTest.setRoot('tests') // Move the build types to build-types/ // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... // This moves them out of them default location under src//... which would // conflict with src/ being used by the main source set. // Adding new build types or product flavors should be accompanied // by a similar customization. debug.setRoot('build-types/debug') release.setRoot('build-types/release') } defaultConfig { versionCode computeVersionNumber() versionName computeVersionName() } // http://stackoverflow.com/a/19130098 signingConfigs { release { storeFile file(System.getenv("KEYSTORE")) storePassword '' keyAlias System.getenv("KEYALIAS") keyPassword '' } } buildTypes { release { signingConfig android.signingConfigs.release // http://stackoverflow.com/a/24650026 applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("-release", "-" + android.defaultConfig.versionName) ) } } } } } task getDictSizes { inputs.dir fileTree(dir:'assets', excludes:['dict.properties']) outputs.file "t9build.properties" doLast { println "Calculating dict size..." inputs.getFiles().each {File file -> println "dict: "+ file.name ant.propertyfile(file:"assets/dict.properties") { entry(key: "size."+ file.name, value: file.length()) } } } } preBuild.dependsOn getDictSizes preBuild.mustRunAfter getDictSizes // https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files/ def getPass(String msg) { def pass = '' if(System.console() == null) { new SwingBuilder().edt { dialog(modal: true, // Otherwise the build will continue running before you closed the dialog title: 'Enter password', // Dialog title alwaysOnTop: true, // pretty much what the name says resizable: false, // Don't allow the user to resize the dialog locationRelativeTo: null, // Place dialog in center of the screen pack: true, // We need to pack the dialog (so it will take the size of it's children) show: true // Let's show it ) { vbox { // Put everything below each other label(text: msg) input = passwordField() button(defaultButton: true, text: 'OK', actionPerformed: { pass = new String(input.password); // Set pass variable to value of input field dispose(); // Close dialog }) } // vbox end } // dialog end } // edt end } else { pass = System.console().readPassword("\nPlease enter key passphrase: ") pass = new String(pass) } if(pass.size() <= 0) { throw new InvalidUserDataException("You must enter a password to proceed.") } return pass } gradle.taskGraph.whenReady { taskGraph -> if(taskGraph.hasTask(':assembleRelease')) { android.signingConfigs.release.storePassword = getPass("Please enter Key Store passphrase:") android.signingConfigs.release.keyPassword = getPass("Please enter Key passphrase:") } // end if has task } // end whenReady