Skip to content

Commit 207d70b

Browse files
committed
merge latest build.gradle of the project template
1 parent 47a2f79 commit 207d70b

1 file changed

Lines changed: 148 additions & 35 deletions

File tree

build-artifacts/project-template-gradle/build.gradle

Lines changed: 148 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
* -PbuildToolsVersion=[build_tools_version] (default is 22.0.1)
1515
* -PsupportVersion=[support_version] (default (22.2.0)
1616
* -PcompileSdk=[compile_sdk_version] (default 22)
17+
18+
* -PdontRunSbg=[true/false] (default false)
1719
*/
1820

21+
import groovy.json.JsonSlurper //used to parse package.json
1922
buildscript {
2023
repositories {
2124
jcenter()
@@ -36,9 +39,13 @@ def createPluginConfigFile = false
3639
def configStage = "\n:config phase: "
3740
def nodeModulesDir = "../../node_modules/"
3841
def libDir = "$projectDir/../../lib/Android/"
39-
def pluginNames = new ArrayList<String>()
42+
def flavorNames = new ArrayList<String>()
4043
def configDir = file(configurationsDir)
4144

45+
def packageJsonContents = [:]
46+
def excludedDevDependencies = ['**/.bin/**']
47+
48+
def dontRunSbg = project.hasProperty("dontRunSbg");
4249
def asbgProject = project(":asbg")
4350
asbgProject.ext.outDir = new File("$projectDir", "src/main/java")
4451
asbgProject.ext.jsCodeDir = new File("$projectDir", "src/main/assets/app")
@@ -88,6 +95,20 @@ def renameResultApks (variant) {
8895
}
8996
}
9097

98+
// gets the devDependencies declared in the package.json and excludes them from the build
99+
task getDevDependencies << {
100+
println "$configStage getDevDependencies"
101+
102+
String content = new File("$projectDir/../../package.json").getText("UTF-8")
103+
def jsonSlurper = new JsonSlurper()
104+
def packageJsonMap = jsonSlurper.parseText(content)
105+
106+
packageJsonContents = packageJsonMap.devDependencies;
107+
108+
packageJsonContents.each { entry ->
109+
excludedDevDependencies.add(entry.key + '/platforms/android/**/*.jar')
110+
}
111+
}
91112
////////////////////////////////////////////////////////////////////////////////////
92113
///////////////////////////// CONFIGURATIONS ///////////////////////////////////////
93114
////////////////////////////////////////////////////////////////////////////////////
@@ -139,7 +160,9 @@ android {
139160

140161
def generateBuildConfigTask = variant.generateBuildConfig;
141162
generateBuildConfigTask.finalizedBy(collectAllJars)
142-
collectAllJars.finalizedBy(setProperties)
163+
if(!dontRunSbg) {
164+
collectAllJars.finalizedBy(setProperties)
165+
}
143166

144167
compileSourcesTask.finalizedBy(buildMetadata)
145168
}
@@ -166,10 +189,8 @@ dependencies {
166189
compile fileTree(dir: "$projectDir/libs", include: ["**/*.jar"])
167190

168191
// take all jars within the node_modules dir
169-
compile fileTree(dir: nodeModulesDir, include: ["**/platforms/android/**/*.jar"], exclude: '**/.bin/**')
192+
compile fileTree(dir: nodeModulesDir, include: ["**/platforms/android/**/*.jar"], exclude: excludedDevDependencies)
170193

171-
// take all jars within the lib/Android dir
172-
compile fileTree(dir: libDir, include: ["**/*.jar"])
173194

174195
//when gradle has aar support this will be preferred instead of addAarDependencies
175196
// compile files("$rootDir/libs/aar") {
@@ -201,36 +222,122 @@ task pluginStructureCheck {
201222
}
202223
}
203224

204-
def createIncludeFile (filePath, fileName, dimensionName) {
205-
println "\t+creating include.gradle file for: " + filePath
225+
def createProductFlavorsContent(flavor, dimensionName, includeAndroidContent = true)
226+
{
227+
if (includeAndroidContent)
228+
{
229+
def content = """
230+
android {
231+
productFlavors {
232+
"${flavor}" {
233+
dimension "${dimensionName}"
234+
}
235+
}
236+
}
237+
"""
238+
return content;
239+
}
240+
else
241+
{
242+
def content = """
243+
productFlavors {
244+
"${flavor}" {
245+
dimension "${dimensionName}"
246+
}
247+
}
248+
"""
249+
return content;
250+
}
251+
}
252+
253+
254+
def createIncludeFile (filePath, flavor, dimensionName) {
255+
println "\t + creating include.gradle file for ${filePath}"
256+
206257
def defaultIncludeFile = new File(filePath, "include.gradle")
207-
defaultIncludeFile.write ""
208-
defaultIncludeFile << "android { \n"
209-
defaultIncludeFile << "\tproductFlavors {\n"
210-
defaultIncludeFile << '\t\t"' + fileName + '" {\n'
211-
defaultIncludeFile << '\t\t\tdimension "' + dimensionName + '"\n'
212-
defaultIncludeFile << "\t\t}\n"
213-
defaultIncludeFile << "\t}\n"
214-
defaultIncludeFile << "}"
258+
defaultIncludeFile.text = createProductFlavorsContent(flavor, dimensionName);
215259
}
216260

217261
def sanatizeDimensionName(str) {
218262
return str.replaceAll(/\W/, "")
219263
}
220264

265+
def replaceProductFlavorInContent(content, dimension, flavor)
266+
{
267+
def indexStart = content.indexOf("productFlavors");
268+
def index = indexStart + "productFlavors".length();
269+
def indexEnd = -1;
270+
def nestedOpenBraketsCount = 0;
271+
272+
while (index < content.length())
273+
{
274+
print content[index]
275+
if (content[index] == "}")
276+
{
277+
if (nestedOpenBraketsCount == 0)
278+
{
279+
indexEnd = index;
280+
break;
281+
}
282+
else
283+
{
284+
nestedOpenBraketsCount--;
285+
}
286+
}
287+
else if (content[index] == "{")
288+
{
289+
nestedOpenBraketsCount++;
290+
}
291+
292+
index++;
293+
}
294+
295+
if (indexEnd != -1)
296+
{
297+
def oldProductFlavorsText = content.substring(indexStart, indexEnd - 1);
298+
299+
def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, false);
300+
301+
return content.replace(oldProductFlavorsText, newProductFlavorsContent);
302+
}
303+
else
304+
{
305+
def androidContentExists = content.indexOf("android {") != -1;
306+
def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, !androidContentExists);
307+
308+
if (androidContentExists)
309+
{
310+
return content.replace("android {", "android { ${newProductFlavorsContent}");
311+
}
312+
else
313+
{
314+
return "${newProductFlavorsContent} \t ${content}"
315+
}
316+
}
317+
}
221318
//make sure the include.gradle file, produced by the user, has only allowed characters in dimension attribute and remove any invalid characters if necessary
222-
def updateIncludeGradleFile(subFile, dimensionName) {
223-
def igFile = new File(subFile.getAbsolutePath())
224-
def newContent = igFile.text.replaceAll(/dimension\s+["'](.+?)["']/) { fullMatch, fDimension ->
225-
def newFg = sanatizeDimensionName(fDimension)
226-
dimensionName = newFg
227-
return "dimension \"$newFg\""
228-
}
229-
igFile.text = newContent
230-
231-
return dimensionName
319+
def updateIncludeGradleFile(targetFile, dimensionName, flavor)
320+
{
321+
def fileEntry = new File(targetFile.getAbsolutePath());
322+
def content = fileEntry.text;
323+
def replacedContent = replaceProductFlavorInContent(content, dimensionName, flavor);
324+
fileEntry.text = replacedContent;
232325
}
233326

327+
def renamePluginDirToFlavorName(directory, flavor)
328+
{
329+
def parentName = directory.getName();
330+
def parentFile = new File("src", parentName);
331+
if (parentFile.exists())
332+
{
333+
def targetDirName = new File("src", flavor);
334+
println "Renaming plugin directory to flavor name: ${parentFile.getAbsolutePath()} -> ${targetDirName.getAbsolutePath()}";
335+
parentFile.renameTo(targetDirName);
336+
}
337+
}
338+
339+
def flavorNumber = 0
340+
234341
task createDefaultIncludeFiles {
235342
description "creates default include.gradle files for added plugins IF NECESSARY"
236343
println "$configStage createDefaultIncludeFiles"
@@ -244,19 +351,22 @@ task createDefaultIncludeFiles {
244351
createPluginConfigFile = true
245352
def foundIncludeFile = false
246353

354+
def flavor = "F" + flavorNumber++
247355
println "\t+found plugins: " + fileName
248356
fl.listFiles().each { subFile ->
249357

250358
if(subFile.name == "include.gradle") {
251359
foundIncludeFile = true
252-
dimensionName = updateIncludeGradleFile(subFile, dimensionName)
360+
updateIncludeGradleFile(subFile, dimensionName, flavor)
361+
renamePluginDirToFlavorName(subFile.getParentFile(), flavor);
253362
}
254363
}
255364

256-
pluginNames.add('"' + dimensionName + '"')
365+
flavorNames.add('"' + dimensionName + '"')
257366

258367
if(!foundIncludeFile) {
259-
createIncludeFile(fl.getAbsolutePath() ,fileName, dimensionName)
368+
createIncludeFile(fl.getAbsolutePath() , flavor, dimensionName)
369+
renamePluginDirToFlavorName(fl, flavor);
260370
}
261371
}
262372
}
@@ -269,15 +379,18 @@ task createPluginsConfigFile {
269379
println "$configStage createPluginsConfigFile"
270380

271381
def flavorsFile = new File("$configurationsDir/include.gradle")
272-
flavorsFile.write "" //clear config file
273-
382+
274383
if(createPluginConfigFile) {
275-
println "\t+creating product flavors include.gradle file in $configurationsDir folder..."
276-
def flavors = pluginNames.join(",")
384+
println "\t Creating product flavors include.gradle file in $configurationsDir folder..."
385+
def flavors = flavorNames.join(", ")
386+
387+
def content = """
388+
android {
389+
flavorDimensions ${flavors}
390+
}
391+
"""
277392

278-
flavorsFile << "android { \n"
279-
flavorsFile << "\tflavorDimensions " + flavors + "\n"
280-
flavorsFile << "}\n"
393+
flavorsFile.text = content
281394
}
282395
}
283396
}

0 commit comments

Comments
 (0)