@@ -4,9 +4,7 @@ import * as constants from "../constants";
44import * as semver from "semver" ;
55import * as projectServiceBaseLib from "./platform-project-service-base" ;
66import { DeviceAndroidDebugBridge } from "../common/mobile/android/device-android-debug-bridge" ;
7- import { attachAwaitDetach } from "../common/helpers" ;
87import { Configurations , LiveSyncPaths } from "../common/constants" ;
9- import { SpawnOptions } from "child_process" ;
108import { performanceLog } from ".././common/decorators" ;
119
1210export class AndroidProjectService extends projectServiceBaseLib . PlatformProjectServiceBase implements IPlatformProjectService {
@@ -18,18 +16,18 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
1816 private isAndroidStudioTemplate : boolean ;
1917
2018 constructor ( private $androidToolsInfo : IAndroidToolsInfo ,
21- private $childProcess : IChildProcess ,
2219 private $errors : IErrors ,
2320 $fs : IFileSystem ,
24- private $hostInfo : IHostInfo ,
2521 private $logger : ILogger ,
2622 $projectDataService : IProjectDataService ,
2723 private $injector : IInjector ,
2824 private $devicePlatformsConstants : Mobile . IDevicePlatformsConstants ,
2925 private $androidPluginBuildService : IAndroidPluginBuildService ,
3026 private $platformEnvironmentRequirements : IPlatformEnvironmentRequirements ,
3127 private $androidResourcesMigrationService : IAndroidResourcesMigrationService ,
32- private $filesHashService : IFilesHashService ) {
28+ private $filesHashService : IFilesHashService ,
29+ private $gradleCommandService : IGradleCommandService ,
30+ private $gradleBuildService : IGradleBuildService ) {
3331 super ( $fs , $projectDataService ) ;
3432 this . isAndroidStudioTemplate = false ;
3533 }
@@ -277,76 +275,13 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
277275
278276 @performanceLog ( )
279277 public async buildProject ( projectRoot : string , projectData : IProjectData , buildConfig : IBuildConfig ) : Promise < void > {
280- let task ;
281- const gradleArgs = this . getGradleBuildOptions ( buildConfig , projectData ) ;
282- const baseTask = buildConfig . androidBundle ? "bundle" : "assemble" ;
283278 const platformData = this . getPlatformData ( projectData ) ;
284- const outputPath = buildConfig . androidBundle ? platformData . bundleBuildOutputPath : platformData . getBuildOutputPath ( buildConfig ) ;
285- if ( this . $logger . getLevel ( ) === "TRACE" ) {
286- gradleArgs . unshift ( "--stacktrace" ) ;
287- gradleArgs . unshift ( "--debug" ) ;
288- }
289- if ( buildConfig . release ) {
290- task = `${ baseTask } Release` ;
291- } else {
292- task = `${ baseTask } Debug` ;
293- }
294-
295- gradleArgs . unshift ( task ) ;
296-
297- const handler = ( data : any ) => {
298- this . emit ( constants . BUILD_OUTPUT_EVENT_NAME , data ) ;
299- } ;
300-
301- await attachAwaitDetach ( constants . BUILD_OUTPUT_EVENT_NAME ,
302- this . $childProcess ,
303- handler ,
304- this . executeCommand ( {
305- projectRoot : this . getPlatformData ( projectData ) . projectRoot ,
306- gradleArgs,
307- childProcessOpts : { stdio : buildConfig . buildOutputStdio || "inherit" } ,
308- spawnFromEventOptions : { emitOptions : { eventName : constants . BUILD_OUTPUT_EVENT_NAME } , throwError : true } ,
309- message : "Gradle build..."
310- } )
311- ) ;
279+ await this . $gradleBuildService . buildProject ( platformData . projectRoot , buildConfig ) ;
312280
281+ const outputPath = buildConfig . androidBundle ? platformData . bundleBuildOutputPath : platformData . getBuildOutputPath ( buildConfig ) ;
313282 await this . $filesHashService . saveHashesForProject ( this . _platformData , outputPath ) ;
314283 }
315284
316- private getGradleBuildOptions ( settings : IAndroidBuildOptionsSettings , projectData : IProjectData ) : Array < string > {
317- const configurationFilePath = this . getPlatformData ( projectData ) . configurationFilePath ;
318-
319- const buildOptions : Array < string > = this . getBuildOptions ( configurationFilePath ) ;
320-
321- if ( settings . release ) {
322- buildOptions . push ( "-Prelease" ) ;
323- buildOptions . push ( `-PksPath=${ path . resolve ( settings . keyStorePath ) } ` ) ;
324- buildOptions . push ( `-Palias=${ settings . keyStoreAlias } ` ) ;
325- buildOptions . push ( `-Ppassword=${ settings . keyStoreAliasPassword } ` ) ;
326- buildOptions . push ( `-PksPassword=${ settings . keyStorePassword } ` ) ;
327- }
328-
329- return buildOptions ;
330- }
331-
332- private getBuildOptions ( configurationFilePath ?: string ) : Array < string > {
333- this . $androidToolsInfo . validateInfo ( { showWarningsAsErrors : true , validateTargetSdk : true } ) ;
334-
335- const androidToolsInfo = this . $androidToolsInfo . getToolsInfo ( ) ;
336- const compileSdk = androidToolsInfo . compileSdkVersion ;
337- const targetSdk = this . getTargetFromAndroidManifest ( configurationFilePath ) || compileSdk ;
338- const buildToolsVersion = androidToolsInfo . buildToolsVersion ;
339- const generateTypings = androidToolsInfo . generateTypings ;
340- const buildOptions = [
341- `-PcompileSdk=android-${ compileSdk } ` ,
342- `-PtargetSdk=${ targetSdk } ` ,
343- `-PbuildToolsVersion=${ buildToolsVersion } ` ,
344- `-PgenerateTypings=${ generateTypings } `
345- ] ;
346-
347- return buildOptions ;
348- }
349-
350285 public async buildForDeploy ( projectRoot : string , projectData : IProjectData , buildConfig ?: IBuildConfig ) : Promise < void > {
351286 return this . buildProject ( projectRoot , projectData , buildConfig ) ;
352287 }
@@ -456,25 +391,19 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
456391 return nativescript && ( nativescript . android || ( nativescript . platforms && nativescript . platforms . android ) ) ;
457392 }
458393
459- public stopServices ( projectRoot : string ) : Promise < ISpawnResult > {
460- return this . executeCommand ( {
461- projectRoot,
462- gradleArgs : [ "--stop" , "--quiet" ] ,
463- childProcessOpts : { stdio : "pipe" } ,
464- message : "Gradle stop services..."
394+ public async stopServices ( platformData : IPlatformData ) : Promise < ISpawnResult > {
395+ const result = await this . $gradleCommandService . executeCommand ( [ "--stop" , "--quiet" ] , {
396+ cwd : platformData . projectRoot ,
397+ message : "Gradle stop services..." ,
398+ stdio : "pipe"
465399 } ) ;
400+
401+ return result ;
466402 }
467403
468404 public async cleanProject ( projectRoot : string , projectData : IProjectData ) : Promise < void > {
469- if ( this . $androidToolsInfo . getToolsInfo ( ) . androidHomeEnvVar ) {
470- const gradleArgs = this . getGradleBuildOptions ( { release : false } , projectData ) ;
471- gradleArgs . unshift ( "clean" ) ;
472- await this . executeCommand ( {
473- projectRoot,
474- gradleArgs,
475- message : "Gradle clean..."
476- } ) ;
477- }
405+ // TODO: Check why there isn't a clean release build and a clean release aab build
406+ await this . $gradleBuildService . cleanProject ( projectRoot , { release : false } ) ;
478407 }
479408
480409 public async cleanDeviceTempFolder ( deviceIdentifier : string , projectData : IProjectData ) : Promise < void > {
@@ -494,10 +423,6 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
494423 shell . cp ( cpArg , paths , projectRoot ) ;
495424 }
496425
497- private async spawn ( command : string , args : string [ ] , opts ?: any , spawnOpts ?: ISpawnFromEventOptions ) : Promise < ISpawnResult > {
498- return this . $childProcess . spawnFromEvent ( command , args , "close" , opts || { stdio : "inherit" } , spawnOpts ) ;
499- }
500-
501426 private validatePackageName ( packageName : string ) : void {
502427 //Make the package conform to Java package types
503428 //Enforce underscore limitation
@@ -522,49 +447,6 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
522447 }
523448 }
524449
525- private getTargetFromAndroidManifest ( configurationFilePath : string ) : string {
526- let versionInManifest : string ;
527- if ( this . $fs . exists ( configurationFilePath ) ) {
528- const targetFromAndroidManifest : string = this . $fs . readText ( configurationFilePath ) ;
529- if ( targetFromAndroidManifest ) {
530- const match = targetFromAndroidManifest . match ( / .* ?a n d r o i d : t a r g e t S d k V e r s i o n = \" ( .* ?) \" / ) ;
531- if ( match && match [ 1 ] ) {
532- versionInManifest = match [ 1 ] ;
533- }
534- }
535- }
536-
537- return versionInManifest ;
538- }
539-
540- private async executeCommand ( opts : { projectRoot : string , gradleArgs : any , childProcessOpts ?: SpawnOptions , spawnFromEventOptions ?: ISpawnFromEventOptions , message : string } ) : Promise < ISpawnResult > {
541- if ( this . $androidToolsInfo . getToolsInfo ( ) . androidHomeEnvVar ) {
542- const { projectRoot, gradleArgs, message, spawnFromEventOptions } = opts ;
543- const gradlew = this . $hostInfo . isWindows ? "gradlew.bat" : "./gradlew" ;
544-
545- if ( this . $logger . getLevel ( ) === "INFO" ) {
546- gradleArgs . push ( "--quiet" ) ;
547- }
548-
549- this . $logger . info ( message ) ;
550-
551- const childProcessOpts = opts . childProcessOpts || { } ;
552- childProcessOpts . cwd = childProcessOpts . cwd || projectRoot ;
553- childProcessOpts . stdio = childProcessOpts . stdio || "inherit" ;
554- let commandResult ;
555- try {
556- commandResult = await this . spawn ( gradlew ,
557- gradleArgs ,
558- childProcessOpts ,
559- spawnFromEventOptions ) ;
560- } catch ( err ) {
561- this . $errors . failWithoutHelp ( err . message ) ;
562- }
563-
564- return commandResult ;
565- }
566- }
567-
568450 private isAndroidStudioCompatibleTemplate ( projectData : IProjectData , frameworkVersion ?: string ) : boolean {
569451 const currentPlatformData : IDictionary < any > = this . $projectDataService . getNSValue ( projectData . projectDir , constants . TNS_ANDROID_RUNTIME_NAME ) ;
570452 const platformVersion = ( currentPlatformData && currentPlatformData [ constants . VERSION_STRING ] ) || frameworkVersion ;
0 commit comments