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
1922buildscript {
2023 repositories {
2124 jcenter()
@@ -36,9 +39,13 @@ def createPluginConfigFile = false
3639def configStage = " \n :config phase: "
3740def nodeModulesDir = " ../../node_modules/"
3841def libDir = " $projectDir /../../lib/Android/"
39- def pluginNames = new ArrayList<String > ()
42+ def flavorNames = new ArrayList<String > ()
4043def configDir = file(configurationsDir)
4144
45+ def packageJsonContents = [:]
46+ def excludedDevDependencies = [' **/.bin/**' ]
47+
48+ def dontRunSbg = project. hasProperty(" dontRunSbg" );
4249def asbgProject = project(" :asbg" )
4350asbgProject. ext. outDir = new File (" $projectDir " , " src/main/java" )
4451asbgProject. 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 << " \t productFlavors {\n "
210- defaultIncludeFile << ' \t\t "' + fileName + ' " {\n '
211- defaultIncludeFile << ' \t\t\t dimension "' + dimensionName + ' "\n '
212- defaultIncludeFile << " \t\t }\n "
213- defaultIncludeFile << " \t }\n "
214- defaultIncludeFile << " }"
258+ defaultIncludeFile. text = createProductFlavorsContent(flavor, dimensionName);
215259}
216260
217261def 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+
234341task 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 << " \t flavorDimensions " + flavors + " \n "
280- flavorsFile << " }\n "
393+ flavorsFile. text = content
281394 }
282395 }
283396}
0 commit comments