@@ -25,14 +25,15 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
25
25
private $options : IOptions ,
26
26
protected $staticConfig : Config . IStaticConfig ) { }
27
27
28
- public async getToolsInfo ( ) : Promise < IAndroidToolsInfoData > {
28
+ @cache ( )
29
+ public getToolsInfo ( ) : IAndroidToolsInfoData {
29
30
if ( ! this . toolsInfo ) {
30
31
let infoData : IAndroidToolsInfoData = Object . create ( null ) ;
31
32
infoData . androidHomeEnvVar = this . androidHome ;
32
- infoData . compileSdkVersion = await this . getCompileSdk ( ) ;
33
- infoData . buildToolsVersion = await this . getBuildToolsVersion ( ) ;
34
- infoData . targetSdkVersion = await this . getTargetSdk ( ) ;
35
- infoData . supportRepositoryVersion = await this . getAndroidSupportRepositoryVersion ( ) ;
33
+ infoData . compileSdkVersion = this . getCompileSdk ( ) ;
34
+ infoData . buildToolsVersion = this . getBuildToolsVersion ( ) ;
35
+ infoData . targetSdkVersion = this . getTargetSdk ( ) ;
36
+ infoData . supportRepositoryVersion = this . getAndroidSupportRepositoryVersion ( ) ;
36
37
infoData . generateTypings = this . shouldGenerateTypings ( ) ;
37
38
38
39
this . toolsInfo = infoData ;
@@ -41,21 +42,10 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
41
42
return this . toolsInfo ;
42
43
}
43
44
44
- @cache ( )
45
- private getPathToSdkManagementTool ( ) : string {
46
- const pathToSdkmanager = path . join ( this . androidHome , "tools" , "bin" , "sdkmanager" ) + ( this . $hostInfo . isWindows ? ".bat" : "" ) ;
47
- const pathToAndroidExecutable = path . join ( this . androidHome , "tools" , "android" ) + ( this . $hostInfo . isWindows ? ".bat" : "" ) ;
48
- const pathToExecutable = this . $fs . exists ( pathToSdkmanager ) ? pathToSdkmanager : pathToAndroidExecutable ;
49
-
50
- this . $logger . trace ( `Path to Android SDK Management tool is: ${ pathToExecutable } ` ) ;
51
-
52
- return pathToExecutable . replace ( this . androidHome , this . $hostInfo . isWindows ? "%ANDROID_HOME%" : "$ANDROID_HOME" ) ;
53
- }
54
-
55
- public async validateInfo ( options ?: { showWarningsAsErrors : boolean , validateTargetSdk : boolean } ) : Promise < boolean > {
45
+ public validateInfo ( options ?: { showWarningsAsErrors : boolean , validateTargetSdk : boolean } ) : boolean {
56
46
let detectedErrors = false ;
57
47
this . showWarningsAsErrors = options && options . showWarningsAsErrors ;
58
- let toolsInfoData = await this . getToolsInfo ( ) ;
48
+ let toolsInfoData = this . getToolsInfo ( ) ;
59
49
let isAndroidHomeValid = this . validateAndroidHomeEnvVariable ( ) ;
60
50
if ( ! toolsInfoData . compileSdkVersion ) {
61
51
this . printMessage ( `Cannot find a compatible Android SDK for compilation. To be able to build for Android, install Android SDK ${ AndroidToolsInfo . MIN_REQUIRED_COMPILE_TARGET } or later.` ,
@@ -149,26 +139,49 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
149
139
return null ;
150
140
}
151
141
152
- private _cachedAndroidHomeValidationResult : boolean = null ;
142
+ @ cache ( )
153
143
public validateAndroidHomeEnvVariable ( options ?: { showWarningsAsErrors : boolean } ) : boolean {
154
- if ( this . _cachedAndroidHomeValidationResult === null ) {
155
- this . showWarningsAsErrors = options && options . showWarningsAsErrors ;
156
-
157
- this . _cachedAndroidHomeValidationResult = true ;
158
- let expectedDirectoriesInAndroidHome = [ "build-tools" , "tools" , "platform-tools" , "extras" ] ;
159
- if ( ! this . androidHome || ! this . $fs . exists ( this . androidHome ) ) {
160
- this . printMessage ( "The ANDROID_HOME environment variable is not set or it points to a non-existent directory. You will not be able to perform any build-related operations for Android." ,
161
- "To be able to perform Android build-related operations, set the `ANDROID_HOME` variable to point to the root of your Android SDK installation directory." ) ;
162
- this . _cachedAndroidHomeValidationResult = false ;
163
- } else if ( ! _ . some ( expectedDirectoriesInAndroidHome . map ( dir => this . $fs . exists ( path . join ( this . androidHome , dir ) ) ) ) ) {
164
- this . printMessage ( "The ANDROID_HOME environment variable points to incorrect directory. You will not be able to perform any build-related operations for Android." ,
165
- "To be able to perform Android build-related operations, set the `ANDROID_HOME` variable to point to the root of your Android SDK installation directory, " +
166
- "where you will find `tools` and `platform-tools` directories." ) ;
167
- this . _cachedAndroidHomeValidationResult = false ;
168
- }
144
+ if ( options ) {
145
+ this . showWarningsAsErrors = options . showWarningsAsErrors ;
146
+ }
147
+
148
+ const expectedDirectoriesInAndroidHome = [ "build-tools" , "tools" , "platform-tools" , "extras" ] ;
149
+ let androidHomeValidationResult = true ;
150
+
151
+ if ( ! this . androidHome || ! this . $fs . exists ( this . androidHome ) ) {
152
+ this . printMessage ( "The ANDROID_HOME environment variable is not set or it points to a non-existent directory. You will not be able to perform any build-related operations for Android." ,
153
+ "To be able to perform Android build-related operations, set the `ANDROID_HOME` variable to point to the root of your Android SDK installation directory." ) ;
154
+ androidHomeValidationResult = false ;
155
+ } else if ( ! _ . some ( expectedDirectoriesInAndroidHome . map ( dir => this . $fs . exists ( path . join ( this . androidHome , dir ) ) ) ) ) {
156
+ this . printMessage ( "The ANDROID_HOME environment variable points to incorrect directory. You will not be able to perform any build-related operations for Android." ,
157
+ "To be able to perform Android build-related operations, set the `ANDROID_HOME` variable to point to the root of your Android SDK installation directory, " +
158
+ "where you will find `tools` and `platform-tools` directories." ) ;
159
+ androidHomeValidationResult = false ;
160
+ }
161
+
162
+ return androidHomeValidationResult ;
163
+ }
164
+
165
+ @cache ( )
166
+ private getPathToSdkManagementTool ( ) : string {
167
+ const sdkmanagerName = "sdkmanager" ;
168
+ let sdkManagementToolPath = sdkmanagerName ;
169
+
170
+ const isAndroidHomeValid = this . validateAndroidHomeEnvVariable ( ) ;
171
+
172
+ if ( isAndroidHomeValid ) {
173
+ // In case ANDROID_HOME is correct, check if sdkmanager exists and if not it means the SDK has not been updated.
174
+ // In this case user shoud use `android` from the command-line instead of sdkmanager.
175
+ const pathToSdkmanager = path . join ( this . androidHome , "tools" , "bin" , sdkmanagerName ) ;
176
+ const pathToAndroidExecutable = path . join ( this . androidHome , "tools" , "android" ) ;
177
+ const pathToExecutable = this . $fs . exists ( pathToSdkmanager ) ? pathToSdkmanager : pathToAndroidExecutable ;
178
+
179
+ this . $logger . trace ( `Path to Android SDK Management tool is: ${ pathToExecutable } ` ) ;
180
+
181
+ sdkManagementToolPath = pathToExecutable . replace ( this . androidHome , this . $hostInfo . isWindows ? "%ANDROID_HOME%" : "$ANDROID_HOME" ) ;
169
182
}
170
183
171
- return this . _cachedAndroidHomeValidationResult ;
184
+ return sdkManagementToolPath ;
172
185
}
173
186
174
187
private shouldGenerateTypings ( ) : boolean {
@@ -196,19 +209,19 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
196
209
}
197
210
}
198
211
199
- private async getCompileSdk ( ) : Promise < number > {
212
+ private getCompileSdk ( ) : number {
200
213
if ( ! this . selectedCompileSdk ) {
201
214
let userSpecifiedCompileSdk = this . $options . compileSdk ;
202
215
if ( userSpecifiedCompileSdk ) {
203
- let installedTargets = await this . getInstalledTargets ( ) ;
216
+ let installedTargets = this . getInstalledTargets ( ) ;
204
217
let androidCompileSdk = `${ AndroidToolsInfo . ANDROID_TARGET_PREFIX } -${ userSpecifiedCompileSdk } ` ;
205
218
if ( ! _ . includes ( installedTargets , androidCompileSdk ) ) {
206
219
this . $errors . failWithoutHelp ( `You have specified '${ userSpecifiedCompileSdk } ' for compile sdk, but it is not installed on your system.` ) ;
207
220
}
208
221
209
222
this . selectedCompileSdk = userSpecifiedCompileSdk ;
210
223
} else {
211
- let latestValidAndroidTarget = await this . getLatestValidAndroidTarget ( ) ;
224
+ let latestValidAndroidTarget = this . getLatestValidAndroidTarget ( ) ;
212
225
if ( latestValidAndroidTarget ) {
213
226
let integerVersion = this . parseAndroidSdkString ( latestValidAndroidTarget ) ;
214
227
@@ -222,8 +235,8 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
222
235
return this . selectedCompileSdk ;
223
236
}
224
237
225
- private async getTargetSdk ( ) : Promise < number > {
226
- let targetSdk = this . $options . sdk ? parseInt ( this . $options . sdk ) : await this . getCompileSdk ( ) ;
238
+ private getTargetSdk ( ) : number {
239
+ let targetSdk = this . $options . sdk ? parseInt ( this . $options . sdk ) : this . getCompileSdk ( ) ;
227
240
this . $logger . trace ( `Selected targetSdk is: ${ targetSdk } ` ) ;
228
241
return targetSdk ;
229
242
}
@@ -258,7 +271,7 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
258
271
return `${ AndroidToolsInfo . REQUIRED_BUILD_TOOLS_RANGE_PREFIX } <=${ this . getMaxSupportedVersion ( ) } ` ;
259
272
}
260
273
261
- private async getBuildToolsVersion ( ) : Promise < string > {
274
+ private getBuildToolsVersion ( ) : string {
262
275
let buildToolsVersion : string ;
263
276
if ( this . androidHome ) {
264
277
let pathToBuildTools = path . join ( this . androidHome , "build-tools" ) ;
@@ -269,8 +282,8 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
269
282
return buildToolsVersion ;
270
283
}
271
284
272
- private async getAppCompatRange ( ) : Promise < string > {
273
- let compileSdkVersion = await this . getCompileSdk ( ) ;
285
+ private getAppCompatRange ( ) : string {
286
+ let compileSdkVersion = this . getCompileSdk ( ) ;
274
287
let requiredAppCompatRange : string ;
275
288
if ( compileSdkVersion ) {
276
289
requiredAppCompatRange = `>=${ compileSdkVersion } <${ compileSdkVersion + 1 } ` ;
@@ -279,9 +292,9 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
279
292
return requiredAppCompatRange ;
280
293
}
281
294
282
- private async getAndroidSupportRepositoryVersion ( ) : Promise < string > {
295
+ private getAndroidSupportRepositoryVersion ( ) : string {
283
296
let selectedAppCompatVersion : string ;
284
- let requiredAppCompatRange = await this . getAppCompatRange ( ) ;
297
+ let requiredAppCompatRange = this . getAppCompatRange ( ) ;
285
298
if ( this . androidHome && requiredAppCompatRange ) {
286
299
let pathToAppCompat = path . join ( this . androidHome , "extras" , "android" , "m2repository" , "com" , "android" , "support" , "appcompat-v7" ) ;
287
300
selectedAppCompatVersion = this . getMatchingDir ( pathToAppCompat , requiredAppCompatRange ) ;
@@ -291,16 +304,16 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
291
304
return selectedAppCompatVersion ;
292
305
}
293
306
294
- private async getLatestValidAndroidTarget ( ) : Promise < string > {
295
- let installedTargets = await this . getInstalledTargets ( ) ;
307
+ private getLatestValidAndroidTarget ( ) : string {
308
+ let installedTargets = this . getInstalledTargets ( ) ;
296
309
return _ . findLast ( AndroidToolsInfo . SUPPORTED_TARGETS . sort ( ) , supportedTarget => _ . includes ( installedTargets , supportedTarget ) ) ;
297
310
}
298
311
299
312
private parseAndroidSdkString ( androidSdkString : string ) : number {
300
313
return parseInt ( androidSdkString . replace ( `${ AndroidToolsInfo . ANDROID_TARGET_PREFIX } -` , "" ) ) ;
301
314
}
302
315
303
- private async getInstalledTargets ( ) : Promise < string [ ] > {
316
+ private getInstalledTargets ( ) : string [ ] {
304
317
if ( ! this . installedTargetsCache ) {
305
318
try {
306
319
const pathToInstalledTargets = path . join ( this . androidHome , "platforms" ) ;
0 commit comments