nativescript 9.0.0-alpha.9 → 9.0.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/config/config.json +1 -1
  2. package/config/test-deps-versions-generated.json +3 -3
  3. package/docs/build-jekyll-md.sh +1 -1
  4. package/docs/man_pages/config/config-get.md +36 -0
  5. package/docs/man_pages/config/config-set.md +40 -0
  6. package/docs/man_pages/config/config.md +39 -0
  7. package/docs/man_pages/project/hooks/hooks.md +35 -0
  8. package/docs/man_pages/start.md +1 -0
  9. package/lib/.d.ts +4 -0
  10. package/lib/bootstrap.js +2 -0
  11. package/lib/commands/build.js +22 -3
  12. package/lib/commands/clean.js +3 -2
  13. package/lib/commands/config.js +9 -3
  14. package/lib/commands/hooks/common.js +79 -0
  15. package/lib/commands/hooks/hooks-lock.js +100 -0
  16. package/lib/commands/hooks/hooks.js +71 -0
  17. package/lib/commands/plugin/build-plugin.js +6 -2
  18. package/lib/commands/typings.js +1 -1
  19. package/lib/common/declarations.d.ts +5 -0
  20. package/lib/common/definitions/extensibility.d.ts +2 -2
  21. package/lib/common/definitions/mobile.d.ts +78 -72
  22. package/lib/common/file-system.js +1 -1
  23. package/lib/common/logger/logger.js +1 -1
  24. package/lib/common/mobile/android/android-device.js +8 -2
  25. package/lib/common/mobile/mobile-core/devices-service.js +1 -1
  26. package/lib/common/plist-parser.js +3 -3
  27. package/lib/common/project-helper.js +15 -2
  28. package/lib/common/services/hooks-service.js +1 -1
  29. package/lib/config.js +2 -38
  30. package/lib/constants.js +3 -2
  31. package/lib/controllers/build-controller.js +1 -1
  32. package/lib/controllers/deploy-controller.js +5 -2
  33. package/lib/controllers/migrate-controller.js +6 -5
  34. package/lib/controllers/platform-controller.js +3 -1
  35. package/lib/controllers/prepare-controller.js +54 -13
  36. package/lib/controllers/run-controller.js +12 -13
  37. package/lib/controllers/update-controller.js +2 -2
  38. package/lib/data/build-data.js +2 -0
  39. package/lib/declarations.d.ts +3 -1
  40. package/lib/definitions/android-plugin-migrator.d.ts +3 -2
  41. package/lib/definitions/build.d.ts +4 -2
  42. package/lib/definitions/hooks.d.ts +1 -0
  43. package/lib/definitions/ios-debugger-port-service.d.ts +1 -1
  44. package/lib/definitions/livesync.d.ts +1 -1
  45. package/lib/definitions/project.d.ts +14 -0
  46. package/lib/definitions/run.d.ts +2 -4
  47. package/lib/helpers/deploy-command-helper.js +1 -0
  48. package/lib/nativescript-cli.js +28 -0
  49. package/lib/options.js +9 -2
  50. package/lib/project-data.js +8 -2
  51. package/lib/services/analytics/analytics-broker-process.js +1 -1
  52. package/lib/services/analytics/analytics-service.js +1 -1
  53. package/lib/services/android/gradle-build-args-service.js +21 -7
  54. package/lib/services/android/gradle-build-service.js +15 -1
  55. package/lib/services/android-plugin-build-service.js +58 -44
  56. package/lib/services/android-project-service.js +63 -4
  57. package/lib/services/build-artifacts-service.js +24 -9
  58. package/lib/services/bundler/bundler-compiler-service.js +77 -104
  59. package/lib/services/cocoapods-service.js +10 -4
  60. package/lib/services/device/device-install-app-service.js +27 -5
  61. package/lib/services/extensibility-service.js +1 -1
  62. package/lib/services/ios/xcodebuild-args-service.js +7 -5
  63. package/lib/services/ios-project-service.js +5 -2
  64. package/lib/services/plugins-service.js +3 -2
  65. package/lib/services/project-data-service.js +16 -18
  66. package/lib/services/timeline-profiler-service.js +21 -13
  67. package/lib/services/versions-service.js +2 -1
  68. package/package.json +16 -13
  69. package/vendor/aab-tool/README.txt +1 -1
  70. package/vendor/aab-tool/bundletool.jar +0 -0
  71. package/vendor/gradle-app/app/build.gradle +1292 -0
  72. package/vendor/gradle-app/app/gradle-helpers/AnalyticsCollector.gradle +48 -0
  73. package/vendor/gradle-app/app/gradle-helpers/BuildToolTask.gradle +50 -0
  74. package/vendor/gradle-app/app/gradle-helpers/CustomExecutionLogger.gradle +52 -0
  75. package/vendor/gradle-app/app/gradle.properties +45 -0
  76. package/vendor/gradle-app/build.gradle +170 -0
  77. package/vendor/gradle-app/settings.gradle +78 -0
  78. package/vendor/gradle-plugin/build.gradle +214 -91
  79. package/vendor/gradle-plugin/gradle.properties +2 -18
  80. package/vendor/gradle-plugin/settings.gradle +23 -11
  81. package/lib/common/resources/platform-tools/android/darwin/NOTICE.txt +0 -3407
  82. package/lib/common/resources/platform-tools/android/darwin/adb +0 -0
  83. package/lib/common/resources/platform-tools/android/linux/NOTICE.txt +0 -4451
  84. package/lib/common/resources/platform-tools/android/linux/adb +0 -0
  85. package/lib/common/resources/platform-tools/android/win32/AdbWinApi.dll +0 -0
  86. package/lib/common/resources/platform-tools/android/win32/AdbWinUsbApi.dll +0 -0
  87. package/lib/common/resources/platform-tools/android/win32/NOTICE.txt +0 -4451
  88. package/lib/common/resources/platform-tools/android/win32/adb.exe +0 -0
  89. package/lib/common/resources/platform-tools/android/win32/fastboot.exe +0 -0
@@ -0,0 +1,1292 @@
1
+ /*
2
+ * Script builds apk in release or debug mode
3
+ * To run:
4
+ * gradle assembleRelease -Prelease (release mode)
5
+ * gradle assembleDebug (debug mode -> default)
6
+ * Options:
7
+ * -Prelease //this flag will run build in release mode
8
+ * -PksPath=[path_to_keystore_file]
9
+ * -PksPassword=[password_for_keystore_file]
10
+ * -Palias=[alias_to_use_from_keystore_file]
11
+ * -Ppassword=[password_for_alias]
12
+ *
13
+ * -PtargetSdk=[target_sdk]
14
+ * -PbuildToolsVersion=[build_tools_version]
15
+ * -PcompileSdk=[compile_sdk_version]
16
+ * -PandroidXLegacy=[androidx_legacy_version]
17
+ * -PandroidXAppCompat=[androidx_appcompat_version]
18
+ * -PandroidXMaterial=[androidx_material_version]
19
+ * -PappPath=[app_path]
20
+ * -PappResourcesPath=[app_resources_path]
21
+ */
22
+
23
+ import groovy.io.FileType
24
+ import groovy.json.JsonSlurper
25
+ import groovy.xml.XmlSlurper
26
+ import org.apache.commons.io.FileUtils
27
+
28
+ import javax.inject.Inject
29
+ import java.nio.file.Files
30
+ import java.nio.file.Paths
31
+ import java.nio.file.StandardCopyOption
32
+ import java.security.MessageDigest
33
+ import java.util.jar.JarEntry
34
+ import java.util.jar.JarFile
35
+
36
+ import static org.gradle.internal.logging.text.StyledTextOutput.Style
37
+ import java.util.stream.Collectors;
38
+ import java.util.stream.Stream;
39
+
40
+
41
+ apply plugin: "com.android.application"
42
+ apply from: "gradle-helpers/BuildToolTask.gradle"
43
+ apply from: "gradle-helpers/CustomExecutionLogger.gradle"
44
+ apply from: "gradle-helpers/AnalyticsCollector.gradle"
45
+ apply plugin: 'kotlin-android'
46
+ apply plugin: 'kotlin-parcelize'
47
+
48
+ def onlyX86 = project.hasProperty("onlyX86")
49
+ if (onlyX86) {
50
+ outLogger.withStyle(Style.Info).println "OnlyX86 build triggered."
51
+ }
52
+
53
+ //common
54
+ def BUILD_TOOLS_PATH = "$rootDir/build-tools"
55
+ def PASSED_TYPINGS_PATH = System.getenv("TNS_TYPESCRIPT_DECLARATIONS_PATH")
56
+ def TYPINGS_PATH = "$BUILD_TOOLS_PATH/typings"
57
+ if (PASSED_TYPINGS_PATH != null) {
58
+ TYPINGS_PATH = PASSED_TYPINGS_PATH
59
+ }
60
+
61
+ def PACKAGE_JSON = "package.json"
62
+
63
+ //static binding generator
64
+ def SBG_JAVA_DEPENDENCIES = "sbg-java-dependencies.txt"
65
+ def SBG_INPUT_FILE = "sbg-input-file.txt"
66
+ def SBG_OUTPUT_FILE = "sbg-output-file.txt"
67
+ def SBG_JS_PARSED_FILES = "sbg-js-parsed-files.txt"
68
+ def SBG_BINDINGS_NAME = "sbg-bindings.txt"
69
+ def SBG_INTERFACE_NAMES = "sbg-interface-names.txt"
70
+ def INPUT_JS_DIR = "$projectDir/src/main/assets/app"
71
+ def OUTPUT_JAVA_DIR = "$projectDir/src/main/java"
72
+
73
+ //metadata generator
74
+ def MDG_OUTPUT_DIR = "mdg-output-dir.txt"
75
+ def MDG_JAVA_DEPENDENCIES = "mdg-java-dependencies.txt"
76
+ def METADATA_OUT_PATH = "$projectDir/src/main/assets/metadata"
77
+ def METADATA_JAVA_OUT = "mdg-java-out.txt"
78
+
79
+ // paths to jar libraries
80
+ def pluginsJarLibraries = new LinkedList<String>()
81
+ def allJarLibraries = new LinkedList<String>()
82
+
83
+ def computeKotlinVersion = { -> project.hasProperty("kotlinVersion") ? kotlinVersion : "${ns_default_kotlin_version}" }
84
+ def computeCompileSdkVersion = { -> project.hasProperty("compileSdk") ? compileSdk as int : NS_DEFAULT_COMPILE_SDK_VERSION as int }
85
+ def computeTargetSdkVersion = { -> project.hasProperty("targetSdk") ? targetSdk as int : NS_DEFAULT_COMPILE_SDK_VERSION as int }
86
+ def computeMinSdkVersion = { -> project.hasProperty("minSdk") ? minSdk : NS_DEFAULT_MIN_SDK_VERSION as int }
87
+ def computeBuildToolsVersion = { ->
88
+ project.hasProperty("buildToolsVersion") ? buildToolsVersion : NS_DEFAULT_BUILD_TOOLS_VERSION as String
89
+ }
90
+
91
+ def enableVerboseMDG = project.gradle.startParameter.logLevel.name() == 'DEBUG'
92
+
93
+ project.ext.selectedBuildType = project.hasProperty("release") ? "release" : "debug"
94
+
95
+ buildscript {
96
+ def applyBuildScriptConfigurations = { ->
97
+ def absolutePathToAppResources = getAppResourcesPath()
98
+ def pathToBuildScriptGradle = "$absolutePathToAppResources/Android/buildscript.gradle"
99
+ def buildScriptGradle = file(pathToBuildScriptGradle)
100
+ if (buildScriptGradle.exists()) {
101
+ outLogger.withStyle(Style.SuccessHeader).println "\t + applying user-defined buildscript from ${buildScriptGradle}"
102
+ apply from: pathToBuildScriptGradle, to: buildscript
103
+ }
104
+
105
+ nativescriptDependencies.each { dep ->
106
+ def pathToPluginBuildScriptGradle = "$rootDir/${dep.directory}/$PLATFORMS_ANDROID/buildscript.gradle"
107
+ def pluginBuildScriptGradle = file(pathToPluginBuildScriptGradle)
108
+ if (pluginBuildScriptGradle.exists()) {
109
+ outLogger.withStyle(Style.SuccessHeader).println "\t + applying user-defined buildscript from dependency ${pluginBuildScriptGradle}"
110
+ apply from: pathToPluginBuildScriptGradle, to: buildscript
111
+ }
112
+ }
113
+ }
114
+ applyBuildScriptConfigurations()
115
+ }
116
+ ////////////////////////////////////////////////////////////////////////////////////
117
+ ///////////////////////////// CONFIGURATIONS ///////////////////////////////////////
118
+ ////////////////////////////////////////////////////////////////////////////////////
119
+
120
+ def applyBeforePluginGradleConfiguration = { ->
121
+ def appResourcesPath = getAppResourcesPath()
122
+ def pathToBeforePluginGradle = "$appResourcesPath/Android/before-plugins.gradle"
123
+ def beforePluginGradle = file(pathToBeforePluginGradle)
124
+ if (beforePluginGradle.exists()) {
125
+ outLogger.withStyle(Style.SuccessHeader).println "\t + applying user-defined configuration from ${beforePluginGradle}"
126
+ apply from: pathToBeforePluginGradle
127
+ }
128
+ }
129
+
130
+ def applyAppGradleConfiguration = { ->
131
+ def appResourcesPath = getAppResourcesPath()
132
+ def pathToAppGradle = "$appResourcesPath/Android/app.gradle"
133
+ def appGradle = file(pathToAppGradle)
134
+ if (appGradle.exists()) {
135
+ outLogger.withStyle(Style.SuccessHeader).println "\t + applying user-defined configuration from ${appGradle}"
136
+ apply from: pathToAppGradle
137
+ } else {
138
+ outLogger.withStyle(Style.Info).println "\t + couldn't load user-defined configuration from ${appGradle}. File doesn't exist."
139
+ }
140
+ }
141
+
142
+ def applyPluginGradleConfigurations = { ->
143
+ nativescriptDependencies.each { dep ->
144
+ def includeGradlePath = "$rootDir/${dep.directory}/$PLATFORMS_ANDROID/include.gradle"
145
+ if (file(includeGradlePath).exists()) {
146
+ apply from: includeGradlePath
147
+ }
148
+ }
149
+ }
150
+
151
+ def getAppIdentifier = { packageJsonMap ->
152
+ def appIdentifier = ""
153
+ if (packageJsonMap && packageJsonMap.nativescript) {
154
+ appIdentifier = packageJsonMap.nativescript.id
155
+ if (!(appIdentifier instanceof String)) {
156
+ appIdentifier = appIdentifier.android
157
+ }
158
+ }
159
+
160
+ return appIdentifier
161
+ }
162
+
163
+ def setAppIdentifier = { ->
164
+ outLogger.withStyle(Style.SuccessHeader).println "\t + setting applicationId"
165
+ File packageJsonFile = new File("$USER_PROJECT_ROOT/$PACKAGE_JSON")
166
+
167
+ if (packageJsonFile.exists()) {
168
+ def content = packageJsonFile.getText("UTF-8")
169
+ def jsonSlurper = new JsonSlurper()
170
+ def packageJsonMap = jsonSlurper.parseText(content)
171
+ def appIdentifier = getAppIdentifier(packageJsonMap)
172
+
173
+ if (appIdentifier) {
174
+ project.ext.nsApplicationIdentifier = appIdentifier
175
+ android.defaultConfig.applicationId = appIdentifier
176
+ android.namespace = appIdentifier
177
+ }
178
+ }
179
+ }
180
+
181
+ android {
182
+ namespace "__PACKAGE__"
183
+
184
+ applyBeforePluginGradleConfiguration()
185
+
186
+ kotlin {
187
+ jvmToolchain(17)
188
+ }
189
+
190
+ compileSdk computeCompileSdkVersion()
191
+ buildToolsVersion = computeBuildToolsVersion()
192
+
193
+ defaultConfig {
194
+ def manifest = new XmlSlurper().parse(file(android.sourceSets.main.manifest.srcFile))
195
+ def minSdkVer = manifest."uses-sdk"."@android:minSdkVersion".text() ?: computeMinSdkVersion()
196
+ minSdkVersion minSdkVer
197
+ targetSdkVersion computeTargetSdkVersion()
198
+ ndk {
199
+ if (onlyX86) {
200
+ abiFilters 'x86'
201
+ } else {
202
+ abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
203
+ }
204
+ }
205
+ }
206
+
207
+ if (project.hasProperty("ndkVersion")) {
208
+ ndkVersion project.ndkVersion
209
+ }
210
+
211
+ compileOptions {
212
+ sourceCompatibility JavaVersion.VERSION_17
213
+ targetCompatibility JavaVersion.VERSION_17
214
+ }
215
+
216
+ sourceSets.main {
217
+ jniLibs.srcDirs = ["$projectDir/libs/jni", "$projectDir/snapshot-build/build/ndk-build/libs"]
218
+ }
219
+
220
+ signingConfigs {
221
+ release {
222
+ if (project.hasProperty("release")) {
223
+ if (project.hasProperty("ksPath") &&
224
+ project.hasProperty("ksPassword") &&
225
+ project.hasProperty("alias") &&
226
+ project.hasProperty("password")) {
227
+
228
+ storeFile file(ksPath)
229
+ storePassword ksPassword
230
+ keyAlias alias
231
+ keyPassword password
232
+ }
233
+ }
234
+ }
235
+ }
236
+ buildTypes {
237
+ release {
238
+ signingConfig signingConfigs.release
239
+ }
240
+ }
241
+
242
+ setAppIdentifier()
243
+ applyPluginGradleConfigurations()
244
+ applyAppGradleConfiguration()
245
+
246
+ def initializeMergedAssetsOutputPath = { ->
247
+ android.applicationVariants.configureEach { variant ->
248
+ if (variant.buildType.name == project.selectedBuildType) {
249
+ def task
250
+ if (variant.metaClass.respondsTo(variant, "getMergeAssetsProvider")) {
251
+ def provider = variant.getMergeAssetsProvider()
252
+ task = provider.get()
253
+ } else {
254
+ // fallback for older android gradle plugin versions
255
+ task = variant.getMergeAssets()
256
+ }
257
+ for (File file : task.getOutputs().getFiles()) {
258
+ if (!file.getPath().contains("${File.separator}incremental${File.separator}")) {
259
+ project.ext.mergedAssetsOutputPath = file.getPath()
260
+ break
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+
267
+ initializeMergedAssetsOutputPath()
268
+ }
269
+
270
+ def externalRuntimeExists = !findProject(':runtime').is(null)
271
+ def pluginDependencies
272
+
273
+ repositories {
274
+ // used for local *.AAR files
275
+ pluginDependencies = nativescriptDependencies.collect {
276
+ "$rootDir/${it.directory}/$PLATFORMS_ANDROID"
277
+ }
278
+
279
+ // some plugins may have their android dependencies in a /libs subdirectory
280
+ pluginDependencies.addAll(nativescriptDependencies.collect {
281
+ "$rootDir/${it.directory}/$PLATFORMS_ANDROID/libs"
282
+ })
283
+
284
+ if (!externalRuntimeExists) {
285
+ pluginDependencies.add("libs/runtime-libs")
286
+ }
287
+
288
+ def appResourcesPath = getAppResourcesPath()
289
+ def localAppResourcesLibraries = "$appResourcesPath/Android/libs"
290
+
291
+ pluginDependencies.add(localAppResourcesLibraries)
292
+
293
+ if (pluginDependencies.size() > 0) {
294
+ flatDir {
295
+ dirs pluginDependencies
296
+ }
297
+ }
298
+
299
+ mavenCentral()
300
+ }
301
+
302
+ dependencies {
303
+ // println "\t ~ [DEBUG][app] build.gradle - ns_default_androidx_appcompat_version = ${ns_default_androidx_appcompat_version}..."
304
+
305
+ def androidXAppCompatVersion = "${ns_default_androidx_appcompat_version}"
306
+ if (project.hasProperty("androidXAppCompat")) {
307
+ androidXAppCompatVersion = androidXAppCompat
308
+ outLogger.withStyle(Style.SuccessHeader).println "\t + using android X library androidx.appcompat:appcompat:$androidXAppCompatVersion"
309
+ }
310
+
311
+ def androidXMaterialVersion = "${ns_default_androidx_material_version}"
312
+ if (project.hasProperty("androidXMaterial")) {
313
+ androidXMaterialVersion = androidXMaterial
314
+ outLogger.withStyle(Style.SuccessHeader).println "\t + using android X library com.google.android.material:material:$androidXMaterialVersion"
315
+ }
316
+
317
+ def androidXExifInterfaceVersion = "${ns_default_androidx_exifinterface_version}"
318
+ if (project.hasProperty("androidXExifInterface")) {
319
+ androidXExifInterfaceVersion = androidXExifInterface
320
+ outLogger.withStyle(Style.SuccessHeader).println "\t + using android X library androidx.exifinterface:exifinterface:$androidXExifInterfaceVersion"
321
+ }
322
+
323
+ def androidXViewPagerVersion = "${ns_default_androidx_viewpager_version}"
324
+ if (project.hasProperty("androidXViewPager")) {
325
+ androidXViewPagerVersion = androidXViewPager
326
+ outLogger.withStyle(Style.SuccessHeader).println "\t + using android X library androidx.viewpager2:viewpager2:$androidXViewPagerVersion"
327
+ }
328
+
329
+ def androidXFragmentVersion = "${ns_default_androidx_fragment_version}"
330
+ if (project.hasProperty("androidXFragment")) {
331
+ androidXFragmentVersion = androidXFragment
332
+ outLogger.withStyle(Style.SuccessHeader).println "\t + using android X library androidx.fragment:fragment:$androidXFragmentVersion"
333
+ }
334
+
335
+ def androidXTransitionVersion = "${ns_default_androidx_transition_version}"
336
+ if (project.hasProperty("androidXTransition")) {
337
+ androidXTransitionVersion = androidXTransition
338
+ outLogger.withStyle(Style.SuccessHeader).println "\t + using android X library androidx.transition:transition:$androidXTransitionVersion"
339
+ }
340
+
341
+ def androidXMultidexVersion = "${ns_default_androidx_multidex_version}"
342
+ if (project.hasProperty("androidXMultidex")) {
343
+ androidXMultidexVersion = androidXMultidex
344
+ outLogger.withStyle(Style.SuccessHeader).println "\t + using android X library androidx.multidex:multidex:$androidXMultidexVersion"
345
+ }
346
+
347
+ implementation "androidx.multidex:multidex:$androidXMultidexVersion"
348
+ implementation "androidx.appcompat:appcompat:$androidXAppCompatVersion"
349
+ debugImplementation "com.google.android.material:material:$androidXMaterialVersion"
350
+ implementation "androidx.exifinterface:exifinterface:$androidXExifInterfaceVersion"
351
+ implementation "androidx.viewpager2:viewpager2:$androidXViewPagerVersion"
352
+ //noinspection KtxExtensionAvailable
353
+ implementation "androidx.fragment:fragment:$androidXFragmentVersion"
354
+ implementation "androidx.transition:transition:$androidXTransitionVersion"
355
+
356
+ def useV8Symbols = false
357
+
358
+ def appPackageJsonFile = file("${getAppPath()}/$PACKAGE_JSON")
359
+ if (appPackageJsonFile.exists()) {
360
+ def appPackageJson = new JsonSlurper().parseText(appPackageJsonFile.text)
361
+ useV8Symbols = appPackageJson.android && appPackageJson.android.useV8Symbols
362
+ }
363
+
364
+ if (!useV8Symbols) {
365
+ // check whether any of the dependencies require v8 symbols
366
+ useV8Symbols = nativescriptDependencies.any {
367
+ def packageJsonFile = file("$rootDir/${it.directory}/$PACKAGE_JSON")
368
+ def packageJson = new JsonSlurper().parseText(packageJsonFile.text)
369
+ return packageJson.nativescript && packageJson.nativescript.useV8Symbols
370
+ }
371
+ }
372
+
373
+ if (!externalRuntimeExists) {
374
+ def runtime = "nativescript-optimized-with-inspector"
375
+
376
+ if (project.gradle.startParameter.taskNames.any { it.toLowerCase().contains('release') }) {
377
+ runtime = "nativescript-optimized"
378
+ }
379
+
380
+ if (useV8Symbols) {
381
+ runtime = "nativescript-regular"
382
+ }
383
+
384
+ outLogger.withStyle(Style.SuccessHeader).println "\t + adding nativescript runtime package dependency: $runtime"
385
+ project.dependencies.add("implementation", [name: runtime, ext: "aar"])
386
+ } else {
387
+ implementation project(':runtime')
388
+ }
389
+
390
+ }
391
+
392
+ ////////////////////////////////////////////////////////////////////////////////////
393
+ ///////////////////////////// CONFIGURATION PHASE //////////////////////////////////
394
+ ////////////////////////////////////////////////////////////////////////////////////
395
+
396
+ task 'addDependenciesFromNativeScriptPlugins' {
397
+ nativescriptDependencies.each { dep ->
398
+ def aarFiles = fileTree(dir: file("$rootDir/${dep.directory}/$PLATFORMS_ANDROID")).matching {
399
+ include "**/*.aar"
400
+ exclude "cpp/**"
401
+ exclude project.hasProperty("aarIgnoreFilter") ? project.findProperty('aarIgnoreFilter').split(',').collect{it as String} : []
402
+ }
403
+ aarFiles.each { aarFile ->
404
+ def length = aarFile.name.length() - 4
405
+ def fileName = aarFile.name[0..<length]
406
+ outLogger.withStyle(Style.SuccessHeader).println "\t + adding aar plugin dependency: " + aarFile.getAbsolutePath()
407
+ project.dependencies.add("implementation", [name: fileName, ext: "aar"])
408
+ }
409
+
410
+ def jarFiles = fileTree(dir: file("$rootDir/${dep.directory}/$PLATFORMS_ANDROID")).matching {
411
+ include "**/*.jar"
412
+ exclude "cpp/**"
413
+ exclude project.hasProperty("jarIgnoreFilter") ? project.findProperty('jarIgnoreFilter').split(',').collect{it as String} : []
414
+ }
415
+ jarFiles.each { jarFile ->
416
+ def jarFileAbsolutePath = jarFile.getAbsolutePath()
417
+ outLogger.withStyle(Style.SuccessHeader).println "\t + adding jar plugin dependency: $jarFileAbsolutePath"
418
+ pluginsJarLibraries.add(jarFile.getAbsolutePath())
419
+ }
420
+
421
+ project.dependencies.add("implementation", jarFiles)
422
+ }
423
+ }
424
+
425
+ task 'addDependenciesFromAppResourcesLibraries' {
426
+ def appResourcesPath = getAppResourcesPath()
427
+ def appResourcesLibraries = file("$appResourcesPath/Android/libs")
428
+ if (appResourcesLibraries.exists()) {
429
+ def aarFiles = fileTree(dir: appResourcesLibraries, include: ["**/*.aar"])
430
+ aarFiles.each { aarFile ->
431
+ def length = aarFile.name.length() - 4
432
+ def fileName = aarFile.name[0..<length]
433
+ outLogger.withStyle(Style.SuccessHeader).println "\t + adding aar library dependency: " + aarFile.getAbsolutePath()
434
+ project.dependencies.add("implementation", [name: fileName, ext: "aar"])
435
+ }
436
+
437
+ def jarFiles = fileTree(dir: appResourcesLibraries, include: ["**/*.jar"])
438
+ jarFiles.each { jarFile ->
439
+ def jarFileAbsolutePath = jarFile.getAbsolutePath()
440
+ outLogger.withStyle(Style.SuccessHeader).println "\t + adding jar plugin dependency: $jarFileAbsolutePath"
441
+ pluginsJarLibraries.add(jarFile.getAbsolutePath())
442
+ }
443
+
444
+ project.dependencies.add("implementation", jarFiles)
445
+ }
446
+ }
447
+
448
+ if (failOnCompilationWarningsEnabled()) {
449
+ tasks.withType(JavaCompile).configureEach {
450
+ options.compilerArgs << '-Xlint:all' << "-Werror"
451
+ options.deprecation = true
452
+ }
453
+ }
454
+
455
+
456
+ ////////////////////////////////////////////////////////////////////////////////////
457
+ ///////////////////////////// EXECUTION PHASE /////////////////////////////////////
458
+ ////////////////////////////////////////////////////////////////////////////////////
459
+
460
+ task runSbg(type: BuildToolTask) {
461
+ dependsOn "collectAllJars"
462
+ def rootPath = ""
463
+ if (!findProject(':static-binding-generator').is(null)) {
464
+ rootPath = Paths.get(project(':static-binding-generator').projectDir.path, "build/libs").toString()
465
+ dependsOn ':static-binding-generator:jar'
466
+ }
467
+
468
+ outputs.dir("$OUTPUT_JAVA_DIR/com/tns/gen")
469
+ inputs.dir(INPUT_JS_DIR)
470
+ inputs.dir(extractedDependenciesDir)
471
+
472
+ workingDir "$BUILD_TOOLS_PATH"
473
+ mainClass = "-jar"
474
+
475
+ def paramz = new ArrayList<String>()
476
+ paramz.add(Paths.get(rootPath, "static-binding-generator.jar"))
477
+
478
+ if (failOnCompilationWarningsEnabled()) {
479
+ paramz.add("-show-deprecation-warnings")
480
+ }
481
+
482
+ setOutputs outLogger
483
+
484
+ args paramz
485
+
486
+ doFirst {
487
+ new File("$OUTPUT_JAVA_DIR/com/tns/gen").deleteDir()
488
+ }
489
+ }
490
+
491
+ def failOnCompilationWarningsEnabled() {
492
+ return project.hasProperty("failOnCompilationWarnings") && (failOnCompilationWarnings || failOnCompilationWarnings.toBoolean())
493
+ }
494
+
495
+ def explodeAar(File compileDependency, File outputDir) {
496
+ logger.info("explodeAar: Extracting ${compileDependency.path} -> ${outputDir.path}")
497
+
498
+ if (compileDependency.name.endsWith(".aar")) {
499
+ JarFile jar = new JarFile(compileDependency)
500
+ Enumeration enumEntries = jar.entries()
501
+ while (enumEntries.hasMoreElements()) {
502
+ JarEntry file = (JarEntry) enumEntries.nextElement()
503
+ if (file.isDirectory()) {
504
+ continue
505
+ }
506
+ if (file.name.endsWith(".jar")) {
507
+ def targetFile = new File(outputDir, file.name)
508
+ InputStream inputStream = jar.getInputStream(file)
509
+ new File(targetFile.parent).mkdirs()
510
+ Files.copy(inputStream, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING)
511
+ }
512
+ }
513
+ jar.close()
514
+ } else if (compileDependency.name.endsWith(".jar")) {
515
+ copy {
516
+ from compileDependency.absolutePath
517
+ into outputDir
518
+ }
519
+ }
520
+ }
521
+
522
+ static def md5(String string) {
523
+ MessageDigest digest = MessageDigest.getInstance("MD5")
524
+ digest.update(string.bytes)
525
+ return new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
526
+ }
527
+
528
+ class WorkerTask extends DefaultTask {
529
+ @Inject
530
+ WorkerExecutor getWorkerExecutor() {
531
+ throw new UnsupportedOperationException()
532
+ }
533
+ }
534
+
535
+ class EmptyRunnable implements Runnable {
536
+ void run() {
537
+ }
538
+ }
539
+
540
+ def getMergedAssetsOutputPath() {
541
+ if (!project.hasProperty("mergedAssetsOutputPath")) {
542
+ // mergedAssetsOutputPath not found fallback to the default value for android gradle plugin 3.5.1
543
+ project.ext.mergedAssetsOutputPath = "$projectDir/build/intermediates/merged_assets/" + project.selectedBuildType + "/out"
544
+ }
545
+ return project.ext.mergedAssetsOutputPath
546
+ }
547
+
548
+ // Discover all jars and dynamically create tasks for the extraction of each of them
549
+ project.ext.allJars = []
550
+ allprojects {
551
+ afterEvaluate { project ->
552
+ def buildType = project.selectedBuildType
553
+ def jars = []
554
+ def artifactType = Attribute.of('artifactType', String)
555
+ android.applicationVariants.configureEach { variant ->
556
+ if (variant.buildType.name == buildType) {
557
+ variant.getCompileClasspath(null).each { fileDependency ->
558
+ processJar(fileDependency, jars)
559
+ }
560
+ }
561
+ }
562
+ }
563
+ }
564
+
565
+ def processJar(File jar, jars) {
566
+ if (!jars.contains(jar)) {
567
+ jars.add(jar)
568
+ def destDir = md5(jar.path)
569
+ def outputDir = new File(Paths.get(extractedDependenciesDir, destDir).normalize().toString())
570
+
571
+ def taskName = "extract_${jar.name}_to_${destDir}"
572
+ logger.debug("Creating dynamic task ${taskName}")
573
+
574
+ // Add discovered jars as dependencies of cleanupAllJars.
575
+ // This is crucial for cloud builds because they are different
576
+ // on each incremental build (as each time the gradle user home
577
+ // directory is a randomly generated string)
578
+ cleanupAllJars.inputs.files jar
579
+
580
+ task "${taskName}"(type: WorkerTask) {
581
+ dependsOn cleanupAllJars
582
+ extractAllJars.dependsOn it
583
+
584
+ // This dependency seems redundant but probably due to some Gradle issue with workers,
585
+ // without it `runSbg` sporadically starts before all extraction tasks have finished and
586
+ // fails due to missing JARs
587
+ runSbg.dependsOn it
588
+
589
+ inputs.files jar
590
+ outputs.dir outputDir
591
+
592
+ doLast {
593
+ // Runing in parallel no longer seems to bring any benefit.
594
+ // It mattered only when we were extracting JARs from AARs.
595
+ // To try it simply remove the following comments.
596
+ // workerExecutor.submit(EmptyRunnable.class) {
597
+ explodeAar(jar, outputDir)
598
+ // }
599
+ }
600
+ }
601
+ project.ext.allJars.add([file: jar, outputDir: outputDir])
602
+ }
603
+ }
604
+
605
+ task 'cleanupAllJars' {
606
+ // We depend on the list of libs directories that might contain aar or jar files
607
+ // and on the list of all discovered jars
608
+ inputs.files(pluginDependencies)
609
+
610
+ outputs.files cleanupAllJarsTimestamp
611
+
612
+ doLast {
613
+ def allDests = project.ext.allJars*.outputDir*.name
614
+ def dir = new File(extractedDependenciesDir)
615
+ if (dir.exists()) {
616
+ dir.eachDir {
617
+ // An old directory which is no longer a dependency (e.g. orphaned by a deleted plugin)
618
+ if (!allDests.contains(it.name)) {
619
+ logger.info("Task cleanupAllJars: Deleting orphaned ${it.path}")
620
+ FileUtils.deleteDirectory(it)
621
+ }
622
+ }
623
+ }
624
+ new File(cleanupAllJarsTimestamp).write ""
625
+ }
626
+ }
627
+
628
+
629
+ // Placeholder task which depends on all dynamically generated extraction tasks
630
+ task 'extractAllJars' {
631
+ dependsOn cleanupAllJars
632
+ outputs.files extractAllJarsTimestamp
633
+
634
+ doLast {
635
+ new File(cleanupAllJarsTimestamp).write ""
636
+ }
637
+ }
638
+
639
+ task 'collectAllJars' {
640
+ dependsOn extractAllJars
641
+ description "gathers all paths to jar dependencies before building metadata with them"
642
+
643
+ def sdkPath = android.sdkDirectory.getAbsolutePath()
644
+ def androidJar = sdkPath + "/platforms/" + android.compileSdkVersion + "/android.jar"
645
+
646
+ doFirst {
647
+ def allJarPaths = new LinkedList<String>()
648
+ allJarPaths.add(androidJar)
649
+ allJarPaths.addAll(pluginsJarLibraries)
650
+ def ft = fileTree(dir: extractedDependenciesDir, include: "**/*.jar")
651
+ ft.each { currentJarFile ->
652
+ allJarPaths.add(currentJarFile.getAbsolutePath())
653
+ }
654
+
655
+ new File("$BUILD_TOOLS_PATH/$SBG_JAVA_DEPENDENCIES").withWriter { out ->
656
+ allJarPaths.each { out.println it }
657
+ }
658
+ new File("$BUILD_TOOLS_PATH/$MDG_JAVA_DEPENDENCIES").withWriter { out ->
659
+ allJarPaths.each {
660
+ if (it.endsWith(".jar")) {
661
+ out.println it
662
+ }
663
+ }
664
+ }
665
+
666
+ new File("$BUILD_TOOLS_PATH/$SBG_INPUT_FILE").withWriter { out ->
667
+ out.println INPUT_JS_DIR
668
+ }
669
+ new File("$BUILD_TOOLS_PATH/$SBG_OUTPUT_FILE").withWriter { out ->
670
+ out.println OUTPUT_JAVA_DIR
671
+ }
672
+
673
+ allJarLibraries.addAll(allJarPaths)
674
+ }
675
+ }
676
+
677
+ task copyMetadataFilters {
678
+ outputs.files("$BUILD_TOOLS_PATH/whitelist.mdg", "$BUILD_TOOLS_PATH/blacklist.mdg")
679
+ // use an explicit copy task here because the copy task itselfs marks the whole built-tools as an output!
680
+ copy {
681
+ from file("$rootDir/whitelist.mdg"), file("$rootDir/blacklist.mdg")
682
+ into "$BUILD_TOOLS_PATH"
683
+ }
684
+ }
685
+
686
+ task 'copyMetadata' {
687
+ doLast {
688
+ copy {
689
+ from "$projectDir/src/main/assets/metadata"
690
+ into getMergedAssetsOutputPath() + "/metadata"
691
+ }
692
+ }
693
+ }
694
+
695
+ def listf(String directoryName, ArrayList<File> store) {
696
+ def directory = new File(directoryName)
697
+
698
+ def resultList = new ArrayList<File>()
699
+
700
+ def fList = directory.listFiles()
701
+ resultList.addAll(Arrays.asList(fList))
702
+ for (File file : fList) {
703
+ if (file.isFile()) {
704
+ store.add(file)
705
+ } else if (file.isDirectory()) {
706
+ resultList.addAll(listf(file.getAbsolutePath(), store))
707
+ }
708
+ }
709
+ return resultList
710
+ }
711
+
712
+ task buildMetadata(type: BuildToolTask) {
713
+ def rootPath = ""
714
+ if (!findProject(':android-metadata-generator').is(null)) {
715
+ rootPath = Paths.get(project(':android-metadata-generator').projectDir.path, "build/libs").toString()
716
+ dependsOn ':android-metadata-generator:jar'
717
+ }
718
+
719
+
720
+
721
+ android.applicationVariants.all { variant ->
722
+ def buildTypeName = variant.buildType.name.capitalize()
723
+ def mergeShadersTaskName = "merge${buildTypeName}Shaders"
724
+ def mergeShadersTask = tasks.findByName(mergeShadersTaskName)
725
+
726
+ if (mergeShadersTask) {
727
+ dependsOn mergeShadersTask
728
+ }
729
+
730
+ def compileJavaWithJavacTaskName = "compile${buildTypeName}JavaWithJavac"
731
+ def compileJavaWithJavacTask = tasks.findByName(compileJavaWithJavacTaskName)
732
+
733
+
734
+ if (compileJavaWithJavacTask) {
735
+ dependsOn compileJavaWithJavacTask
736
+ }
737
+
738
+ def compileKotlinTaskName = "compile${buildTypeName}Kotlin"
739
+ def compileKotlinTask = tasks.findByName(compileKotlinTaskName)
740
+
741
+
742
+ if (compileKotlinTask) {
743
+ dependsOn compileKotlinTask
744
+ }
745
+
746
+
747
+ def mergeDexTaskName = "mergeDex${buildTypeName}"
748
+ def mergeDexTask = tasks.findByName(mergeDexTaskName)
749
+
750
+ if (mergeDexTask) {
751
+ dependsOn mergeDexTask
752
+ }
753
+
754
+ def checkDuplicateClassesTaskName = "check${buildTypeName}DuplicateClasses"
755
+ def checkDuplicateClassesTask = tasks.findByName(checkDuplicateClassesTaskName)
756
+
757
+ if (checkDuplicateClassesTask) {
758
+ dependsOn checkDuplicateClassesTask
759
+ }
760
+
761
+ def generateBuildConfigTaskName = "generate${buildTypeName}BuildConfig"
762
+ def generateBuildConfigTask = tasks.findByName(generateBuildConfigTaskName)
763
+
764
+ if (generateBuildConfigTask) {
765
+ dependsOn generateBuildConfigTask
766
+ }
767
+
768
+ def dexBuilderTaskName = "dexBuilder${buildTypeName}"
769
+ def dexBuilderTask = tasks.findByName(dexBuilderTaskName)
770
+
771
+ if (dexBuilderTask) {
772
+ dependsOn dexBuilderTask
773
+ }
774
+
775
+
776
+ def mergeExtDexTaskName = "mergeExtDex${buildTypeName}"
777
+ def mergeExtDexTask = tasks.findByName(mergeExtDexTaskName)
778
+
779
+ if (mergeExtDexTask) {
780
+ dependsOn mergeExtDexTask
781
+ }
782
+
783
+ def mergeLibDexTaskName = "mergeLibDex${buildTypeName}"
784
+ def mergeLibDexTask = tasks.findByName(mergeLibDexTaskName)
785
+
786
+ if (mergeLibDexTask) {
787
+ dependsOn mergeLibDexTask
788
+ }
789
+
790
+ def mergeProjectDexTaskName = "mergeProjectDex${buildTypeName}"
791
+ def mergeProjectDexTask = tasks.findByName(mergeProjectDexTaskName)
792
+
793
+ if (mergeProjectDexTask) {
794
+ dependsOn mergeProjectDexTask
795
+ }
796
+
797
+ def syncLibJarsTaskName = "sync${buildTypeName}LibJars"
798
+ def syncLibJarsTask = tasks.findByName(syncLibJarsTaskName)
799
+
800
+ if (syncLibJarsTask) {
801
+ dependsOn syncLibJarsTask
802
+ }
803
+
804
+ def mergeJavaResourceTaskName = "merge${buildTypeName}JavaResource"
805
+ def mergeJavaResourceTask = tasks.findByName(mergeJavaResourceTaskName)
806
+
807
+ if (mergeJavaResourceTask) {
808
+ dependsOn mergeJavaResourceTask
809
+ }
810
+
811
+ def mergeJniLibFoldersTaskName = "merge${buildTypeName}JniLibFolders"
812
+ def mergeJniLibFoldersTask = tasks.findByName(mergeJniLibFoldersTaskName)
813
+
814
+ if (mergeJniLibFoldersTask) {
815
+ dependsOn mergeJniLibFoldersTask
816
+ }
817
+
818
+ def mergeNativeLibsTaskName = "merge${buildTypeName}NativeLibs"
819
+ def mergeNativeLibsTask = tasks.findByName(mergeNativeLibsTaskName)
820
+
821
+ if (mergeNativeLibsTask) {
822
+ dependsOn mergeNativeLibsTask
823
+ }
824
+
825
+ def stripDebugSymbolsTaskName = "strip${buildTypeName}DebugSymbols"
826
+ def stripDebugSymbolsTask = tasks.findByName(stripDebugSymbolsTaskName)
827
+
828
+ if (stripDebugSymbolsTask) {
829
+ dependsOn stripDebugSymbolsTask
830
+ }
831
+
832
+ def validateSigningTaskName = "validateSigning${buildTypeName}"
833
+ def validateSigningTask = tasks.findByName(validateSigningTaskName)
834
+
835
+ if (validateSigningTask) {
836
+ dependsOn validateSigningTask
837
+ }
838
+
839
+
840
+ def extractProguardFilesTaskName = "extractProguardFiles"
841
+ def extractProguardFilesTask = tasks.findByName(extractProguardFilesTaskName)
842
+
843
+ if (extractProguardFilesTask) {
844
+ dependsOn extractProguardFilesTask
845
+ }
846
+
847
+
848
+ // def compileArtProfileTaskName = "compile${buildTypeName}ArtProfile"
849
+ // def compileArtProfileTask = tasks.findByName(compileArtProfileTaskName)
850
+
851
+ // if (compileArtProfileTask) {
852
+ // dependsOn compileArtProfileTask
853
+ // }
854
+
855
+
856
+ def extractNativeSymbolTablesTaskName = "extract${buildTypeName}NativeSymbolTables"
857
+ def extractNativeSymbolTablesTask = tasks.findByName(extractNativeSymbolTablesTaskName)
858
+
859
+ if (extractNativeSymbolTablesTask) {
860
+ dependsOn extractNativeSymbolTablesTask
861
+ }
862
+
863
+
864
+ // def optimizeResourcesTaskName = "optimize${buildTypeName}Resources"
865
+ // def optimizeResourcesTask = tasks.findByName(optimizeResourcesTaskName)
866
+
867
+ // if (optimizeResourcesTask) {
868
+ // dependsOn optimizeResourcesTask
869
+ // }
870
+
871
+ def bundleResourcesTaskName = "bundle${buildTypeName}Resources"
872
+ def bundleResourcesTask = tasks.findByName(bundleResourcesTaskName)
873
+
874
+ if (bundleResourcesTask) {
875
+ dependsOn bundleResourcesTask
876
+ }
877
+
878
+ }
879
+
880
+ dependsOn copyMetadataFilters
881
+
882
+ // As some external gradle plugins can reorder the execution order of the tasks it may happen that buildMetadata is executed after merge{Debug/Release}Assets
883
+ // in that case the metadata won't be included in the result apk and it will crash, so to avoid this we are adding the copyMetadata task which will manually copy
884
+ // the metadata files in the merge assets folder and they will be added to the result apk
885
+
886
+ // The next line is added to avoid adding another copyData implementation from the firebase plugin - https://github.com/EddyVerbruggen/nativescript-plugin-firebase/blob/3943bb9147f43c41599e801d026378eba93d3f3a/publish/scripts/installer.js#L1105
887
+ //buildMetadata.finalizedBy(copyMetadata)
888
+ finalizedBy copyMetadata
889
+
890
+ description "builds metadata with provided jar dependencies"
891
+
892
+ inputs.files("$MDG_JAVA_DEPENDENCIES")
893
+
894
+ // make MDG aware of whitelist.mdg and blacklist.mdg files
895
+ // inputs.files(project.fileTree(dir: "$rootDir", include: "**/*.mdg"))
896
+ // use explicit inputs as the above makes the whole build-tools directory an input!
897
+ inputs.files("$BUILD_TOOLS_PATH/whitelist.mdg", "$BUILD_TOOLS_PATH/blacklist.mdg")
898
+
899
+ def classesDir = layout.buildDirectory.dir("intermediates/javac").get().asFile
900
+ if (classesDir.exists()) {
901
+ inputs.dir(classesDir)
902
+ }
903
+
904
+ def kotlinClassesDir = layout.buildDirectory.dir("tmp/kotlin-classes").get().asFile
905
+ if (kotlinClassesDir.exists()) {
906
+ inputs.dir(kotlinClassesDir)
907
+ }
908
+
909
+ outputs.files("$METADATA_OUT_PATH/treeNodeStream.dat", "$METADATA_OUT_PATH/treeStringsStream.dat", "$METADATA_OUT_PATH/treeValueStream.dat")
910
+
911
+ workingDir "$BUILD_TOOLS_PATH"
912
+ mainClass = "-jar"
913
+
914
+ doFirst {
915
+ // get compiled classes to pass to metadata generator
916
+ // these need to be called after the classes have compiled
917
+ new File(getMergedAssetsOutputPath() + "/metadata").deleteDir()
918
+
919
+ def classesSubDirs = []
920
+ def kotlinClassesSubDirs = []
921
+ def selectedBuildType = project.ext.selectedBuildType
922
+
923
+ rootProject.subprojects {
924
+
925
+ def projectClassesDir = it.layout.buildDirectory.dir("intermediates/javac").get().asFile
926
+ def projectKotlinClassesDir = it.layout.buildDirectory.dir("tmp/kotlin-classes").get().asFile
927
+
928
+ if (projectClassesDir.exists()) {
929
+ def projectClassesSubDirs = projectClassesDir.listFiles()
930
+ for (File subDir : projectClassesSubDirs) {
931
+ if (!classesSubDirs.contains(subDir)) {
932
+ classesSubDirs.add(subDir)
933
+ }
934
+ }
935
+ }
936
+
937
+ if (projectKotlinClassesDir.exists()) {
938
+ def projectKotlinClassesSubDirs = projectKotlinClassesDir.listFiles()
939
+ for (File subDir : projectKotlinClassesSubDirs) {
940
+ if (!kotlinClassesSubDirs.contains(subDir)) {
941
+ kotlinClassesSubDirs.add(subDir)
942
+ }
943
+ }
944
+ }
945
+ }
946
+
947
+ def generatedClasses = new LinkedList<String>()
948
+ for (File subDir : classesSubDirs) {
949
+ if (subDir.getName() == selectedBuildType) {
950
+ generatedClasses.add(subDir.getAbsolutePath())
951
+ }
952
+ }
953
+
954
+ for (File subDir : kotlinClassesSubDirs) {
955
+ if (subDir.getName() == selectedBuildType) {
956
+ generatedClasses.add(subDir.getAbsolutePath())
957
+ }
958
+ }
959
+
960
+ def store = new ArrayList<File>()
961
+ for (String dir : generatedClasses) {
962
+ listf(dir, store)
963
+ }
964
+
965
+
966
+ new File("$BUILD_TOOLS_PATH/$METADATA_JAVA_OUT").withWriter { out ->
967
+ store.each {
968
+ out.println it.absolutePath
969
+ }
970
+ }
971
+
972
+
973
+ new File("$BUILD_TOOLS_PATH/$MDG_OUTPUT_DIR").withWriter { out ->
974
+ out.println "$METADATA_OUT_PATH"
975
+ }
976
+
977
+ new File("$BUILD_TOOLS_PATH/$MDG_JAVA_DEPENDENCIES").withWriterAppend { out ->
978
+ generatedClasses.each { out.println it }
979
+ }
980
+
981
+ setOutputs outLogger
982
+
983
+ def paramz = new ArrayList<String>()
984
+ paramz.add(Paths.get(rootPath, "android-metadata-generator.jar"))
985
+
986
+ // if (enableAnalytics) {
987
+ // paramz.add("analyticsFilePath=$analyticsFilePath")
988
+ // }
989
+
990
+ if (enableVerboseMDG) {
991
+ paramz.add("verbose")
992
+ }
993
+
994
+ args paramz.toArray()
995
+ }
996
+ }
997
+
998
+ task generateTypescriptDefinitions(type: BuildToolTask) {
999
+ if (!findProject(':dts-generator').is(null)) {
1000
+ dependsOn ':dts-generator:jar'
1001
+ }
1002
+
1003
+ def paramz = new ArrayList<String>()
1004
+ def includeDirs = ["com.android.support", "/platforms/" + android.compileSdkVersion]
1005
+
1006
+ workingDir "$BUILD_TOOLS_PATH"
1007
+ mainClass = "-jar"
1008
+
1009
+ doFirst {
1010
+ delete "$TYPINGS_PATH"
1011
+
1012
+ paramz.add("dts-generator.jar")
1013
+ paramz.add("-input")
1014
+
1015
+ for (String jarPath : allJarLibraries) {
1016
+ // don't generate typings for runtime jars and classes
1017
+ if (shouldIncludeDirForTypings(jarPath, includeDirs)) {
1018
+ paramz.add(jarPath)
1019
+ }
1020
+ }
1021
+
1022
+ paramz.add("-output")
1023
+ paramz.add("$TYPINGS_PATH")
1024
+
1025
+ new File("$TYPINGS_PATH").mkdirs()
1026
+
1027
+ logger.info("Task generateTypescriptDefinitions: Call dts-generator.jar with arguments: " + paramz.toString().replaceAll(',', ''))
1028
+ outLogger.withStyle(Style.SuccessHeader).println "Task generateTypescriptDefinitions: Call dts-generator.jar with arguments: " + paramz.toString().replaceAll(',', '')
1029
+
1030
+ setOutputs outLogger
1031
+
1032
+ args paramz.toArray()
1033
+ }
1034
+ }
1035
+
1036
+ generateTypescriptDefinitions.onlyIf {
1037
+ (project.hasProperty("generateTypings") && Boolean.parseBoolean(project.generateTypings)) || PASSED_TYPINGS_PATH != null
1038
+ }
1039
+
1040
+ collectAllJars.finalizedBy(generateTypescriptDefinitions)
1041
+
1042
+ static def shouldIncludeDirForTypings(path, includeDirs) {
1043
+ for (String p : includeDirs) {
1044
+ if (path.indexOf(p) > -1) {
1045
+ return true
1046
+ }
1047
+ }
1048
+
1049
+ return false
1050
+ }
1051
+
1052
+ task 'copyTypings' {
1053
+ doLast {
1054
+ outLogger.withStyle(Style.Info).println "Copied generated typings to application root level. Make sure to import android.d.ts in reference.d.ts"
1055
+
1056
+ copy {
1057
+ from "$TYPINGS_PATH"
1058
+ into "$USER_PROJECT_ROOT"
1059
+ }
1060
+ }
1061
+ }
1062
+
1063
+ copyTypings.onlyIf { generateTypescriptDefinitions.didWork }
1064
+ generateTypescriptDefinitions.finalizedBy(copyTypings)
1065
+
1066
+ task 'validateAppIdMatch' {
1067
+ doLast {
1068
+ def lineSeparator = System.getProperty("line.separator")
1069
+
1070
+ if (project.hasProperty("nsApplicationIdentifier") && !project.hasProperty("release")) {
1071
+ if (project.nsApplicationIdentifier != android.defaultConfig.applicationId && android.namespace != appIdentifier) {
1072
+ def errorMessage = "${lineSeparator}WARNING: The Application identifier is different from the one inside \"package.json\" file.$lineSeparator" +
1073
+ "NativeScript CLI might not work properly.$lineSeparator" +
1074
+ "Remove applicationId from app.gradle and update the \"nativescript.id\" in package.json.$lineSeparator" +
1075
+ "Actual: ${android.defaultConfig.applicationId}$lineSeparator" +
1076
+ "Expected(from \"package.json\"): ${project.nsApplicationIdentifier}$lineSeparator"
1077
+
1078
+ logger.error(errorMessage)
1079
+ }
1080
+ }
1081
+ }
1082
+ }
1083
+
1084
+ ////////////////////////////////////////////////////////////////////////////////////
1085
+ ////////////////////////////// OPTIONAL TASKS //////////////////////////////////////
1086
+ ////////////////////////////////////////////////////////////////////////////////////
1087
+
1088
+ //////// custom clean ///////////
1089
+ task cleanSbg(type: Delete) {
1090
+ delete "$BUILD_TOOLS_PATH/$SBG_JS_PARSED_FILES",
1091
+ "$BUILD_TOOLS_PATH/$SBG_JAVA_DEPENDENCIES",
1092
+ "$BUILD_TOOLS_PATH/$SBG_INTERFACE_NAMES",
1093
+ "$BUILD_TOOLS_PATH/$SBG_BINDINGS_NAME",
1094
+ "$BUILD_TOOLS_PATH/$SBG_INPUT_FILE",
1095
+ "$BUILD_TOOLS_PATH/$SBG_OUTPUT_FILE",
1096
+ "$BUILD_TOOLS_PATH/$METADATA_JAVA_OUT",
1097
+ "$OUTPUT_JAVA_DIR/com/tns/gen"
1098
+ }
1099
+
1100
+ task cleanMdg(type: Delete) {
1101
+ delete "$BUILD_TOOLS_PATH/$MDG_OUTPUT_DIR",
1102
+ "$BUILD_TOOLS_PATH/whitelist.mdg",
1103
+ "$BUILD_TOOLS_PATH/blacklist.mdg",
1104
+ "$BUILD_TOOLS_PATH/$MDG_JAVA_DEPENDENCIES",
1105
+ "$METADATA_OUT_PATH"
1106
+ }
1107
+
1108
+ cleanSbg.dependsOn(cleanMdg)
1109
+ clean.dependsOn(cleanSbg)
1110
+
1111
+
1112
+ //dependsOn {
1113
+ // pattern {
1114
+ // include "merge*.Shaders" // Matches tasks starting with "merge" and ending with "Shaders"
1115
+ // }
1116
+ //}
1117
+
1118
+ tasks.configureEach({ DefaultTask currentTask ->
1119
+ // println "\t ~ [DEBUG][app] build.gradle - currentTask = ${currentTask.name} ..."
1120
+
1121
+ if (currentTask =~ /compile.+JavaWithJavac/) {
1122
+ currentTask.dependsOn(runSbg)
1123
+ }
1124
+
1125
+ if (currentTask =~ /mergeDex.+/) {
1126
+ currentTask.dependsOn(runSbg)
1127
+ }
1128
+
1129
+ if (currentTask =~ /compile.+Kotlin.+/) {
1130
+ currentTask.dependsOn(runSbg)
1131
+ }
1132
+
1133
+ if (currentTask =~ /merge.*Assets/) {
1134
+ currentTask.dependsOn(buildMetadata)
1135
+ }
1136
+
1137
+ // ensure buildMetadata is done before R8 to allow custom proguard from metadata
1138
+ if (currentTask =~ /minify(Debug|Release)WithR8/) {
1139
+ buildMetadata.finalizedBy(currentTask)
1140
+ }
1141
+
1142
+ if (currentTask =~ /assemble.*Debug/ || currentTask =~ /assemble.*Release/) {
1143
+ currentTask.finalizedBy("validateAppIdMatch")
1144
+ }
1145
+
1146
+ if (currentTask =~ /process.+Resources/) {
1147
+ cleanupAllJars.dependsOn(currentTask)
1148
+ }
1149
+
1150
+ // if (currentTask.name == "extractProguardFiles") {
1151
+ // currentTask.finalizedBy(buildMetadata)
1152
+ // }
1153
+ //
1154
+ if (currentTask =~ /generate.+LintVitalReportModel/) {
1155
+ currentTask.dependsOn(buildMetadata)
1156
+ }
1157
+
1158
+ if (currentTask =~ /lintVitalAnalyze.+/) {
1159
+ currentTask.dependsOn(buildMetadata)
1160
+ }
1161
+ //
1162
+ // if (currentTask =~ /merge.+GlobalSynthetics/) {
1163
+ // currentTask.finalizedBy(buildMetadata)
1164
+ // }
1165
+ //
1166
+ // if (currentTask =~ /optimize.+Resources/) {
1167
+ // currentTask.finalizedBy(buildMetadata)
1168
+ // }
1169
+ //
1170
+ // if (currentTask =~ /buildCMake.*/) {
1171
+ // currentTask.finalizedBy(buildMetadata)
1172
+ // }
1173
+ //
1174
+ // if (currentTask =~ /configureCMake.*/) {
1175
+ // currentTask.finalizedBy(buildMetadata)
1176
+ // }
1177
+ //
1178
+ // if (currentTask =~ /validateSigning.*/) {
1179
+ // currentTask.finalizedBy(buildMetadata)
1180
+ // }
1181
+ //
1182
+ // if (currentTask =~ /generate.*LintReportModel/) {
1183
+ // currentTask.finalizedBy(buildMetadata)
1184
+ // }
1185
+ //
1186
+ // if (currentTask =~ /generate.*AndroidTestResValues/) {
1187
+ // // buildMetadata.dependsOn(currentTask)
1188
+ // currentTask.finalizedBy(buildMetadata)
1189
+ // }
1190
+ //
1191
+ // if (currentTask =~ /generate.*AndroidTestLintModel/) {
1192
+ // currentTask.finalizedBy(buildMetadata)
1193
+ // }
1194
+ //
1195
+ // if (currentTask =~ /generate.*UnitTestLintModel/) {
1196
+ // buildMetadata.mustRunAfter(currentTask)
1197
+ // }
1198
+ //
1199
+ // if (currentTask =~ /generate.*UnitTestLintModel/) {
1200
+ // currentTask.finalizedBy(buildMetadata)
1201
+ // }
1202
+ //
1203
+ //
1204
+ // if (currentTask =~ /lintAnalyze.*UnitTest/) {
1205
+ // currentTask.finalizedBy(buildMetadata)
1206
+ // }
1207
+ //
1208
+ // if (currentTask =~ /process.*JavaRes/) {
1209
+ // currentTask.finalizedBy(buildMetadata)
1210
+ // }
1211
+ //
1212
+ // if (currentTask =~ /strip.*DebugSymbols/) {
1213
+ // currentTask.finalizedBy(buildMetadata)
1214
+ // }
1215
+ //
1216
+ // if (currentTask =~ /merge.*JavaResource/) {
1217
+ // currentTask.finalizedBy(buildMetadata)
1218
+ // }
1219
+ //
1220
+ // if (currentTask =~ /lintAnalyze.*/) {
1221
+ // currentTask.finalizedBy(buildMetadata)
1222
+ // }
1223
+ //
1224
+ // if (currentTask =~ /lintAnalyze.*AndroidTest/) {
1225
+ // currentTask.finalizedBy(buildMetadata)
1226
+ // }
1227
+ //
1228
+ // if (currentTask =~ /bundle.*Resources/) {
1229
+ // currentTask.finalizedBy(buildMetadata)
1230
+ // }
1231
+ //
1232
+ // if (currentTask =~ /compile.*ArtProfile/) {
1233
+ // currentTask.mustRunAfter(buildMetadata)
1234
+ // }
1235
+ //
1236
+ // if (currentTask =~ /check.*DuplicateClasses/) {
1237
+ // currentTask.finalizedBy(buildMetadata)
1238
+ // }
1239
+ //
1240
+ // if (currentTask =~ /check.*AarMetadata/) {
1241
+ // currentTask.finalizedBy(buildMetadata)
1242
+ // }
1243
+ //
1244
+ // if (currentTask =~ /create.*CompatibleScreenManifests/) {
1245
+ // currentTask.finalizedBy(buildMetadata)
1246
+ // }
1247
+ //
1248
+ // if (currentTask =~ /process.*Manifest/) {
1249
+ // currentTask.finalizedBy(buildMetadata)
1250
+ // }
1251
+ //
1252
+ // if (currentTask =~ /generate.*ResValues/) {
1253
+ // currentTask.finalizedBy(buildMetadata)
1254
+ // }
1255
+ //
1256
+ // if (currentTask =~ /merge.*Resources/) {
1257
+ // currentTask.finalizedBy(buildMetadata)
1258
+ // }
1259
+ //
1260
+ // if (currentTask =~ /package.*Resources/) {
1261
+ // currentTask.finalizedBy(buildMetadata)
1262
+ // }
1263
+ //
1264
+ // if (currentTask =~ /process.*Resources/) {
1265
+ // currentTask.finalizedBy(buildMetadata)
1266
+ // }
1267
+ //
1268
+ // if (currentTask =~ /desugar.*Dependencies/) {
1269
+ // currentTask.finalizedBy(buildMetadata)
1270
+ // }
1271
+ //
1272
+ // if (currentTask =~ /merge.*JniLibFolders/) {
1273
+ // currentTask.finalizedBy(buildMetadata)
1274
+ // }
1275
+
1276
+ })
1277
+
1278
+ rootProject.subprojects.forEach {
1279
+ it.tasks.configureEach({ DefaultTask currentTask ->
1280
+ if (currentTask =~ /.+bundleLibCompileToJar.*/) {
1281
+ currentTask.finalizedBy(cleanupAllJars)
1282
+ }
1283
+
1284
+ if (currentTask =~ /bundleLibRuntimeToDir.*/) {
1285
+ currentTask.finalizedBy(buildMetadata)
1286
+ }
1287
+
1288
+ if (currentTask =~ /compile.*LibraryResources/) {
1289
+ currentTask.finalizedBy(buildMetadata)
1290
+ }
1291
+ })
1292
+ }