Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
80a4f9b1
Unverified
Commit
80a4f9b1
authored
May 20, 2023
by
Andrew Kolos
Committed by
GitHub
May 20, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reland "[tool] Move Java functions to their own file" (#126577)
Relands #126086, which was reverted by #126569.
parent
0a6e1375
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
706 additions
and
567 deletions
+706
-567
android_sdk.dart
packages/flutter_tools/lib/src/android/android_sdk.dart
+7
-165
android_workflow.dart
packages/flutter_tools/lib/src/android/android_workflow.dart
+17
-20
gradle.dart
packages/flutter_tools/lib/src/android/gradle.dart
+5
-11
java.dart
packages/flutter_tools/lib/src/android/java.dart
+230
-0
android_studio_java_gradle_conflict_migration.dart
...ations/android_studio_java_gradle_conflict_migration.dart
+6
-26
daemon.dart
packages/flutter_tools/lib/src/commands/daemon.dart
+1
-0
context_runner.dart
packages/flutter_tools/lib/src/context_runner.dart
+10
-1
emulator.dart
packages/flutter_tools/lib/src/emulator.dart
+8
-4
globals.dart
packages/flutter_tools/lib/src/globals.dart
+7
-0
project.dart
packages/flutter_tools/lib/src/project.dart
+1
-7
proxied_devices_test.dart
...ls/test/commands.shard/hermetic/proxied_devices_test.dart
+6
-0
build_apk_test.dart
...r_tools/test/commands.shard/permeable/build_apk_test.dart
+0
-3
build_appbundle_test.dart
...s/test/commands.shard/permeable/build_appbundle_test.dart
+0
-3
analytics_test.dart
...ages/flutter_tools/test/general.shard/analytics_test.dart
+0
-2
android_project_migration_test.dart
...general.shard/android/android_project_migration_test.dart
+17
-76
android_sdk_test.dart
...er_tools/test/general.shard/android/android_sdk_test.dart
+33
-167
android_workflow_test.dart
...ols/test/general.shard/android/android_workflow_test.dart
+11
-14
java_test.dart
...s/flutter_tools/test/general.shard/android/java_test.dart
+254
-0
emulator_test.dart
packages/flutter_tools/test/general.shard/emulator_test.dart
+9
-3
project_test.dart
packages/flutter_tools/test/general.shard/project_test.dart
+44
-65
fakes.dart
packages/flutter_tools/test/src/fakes.dart
+40
-0
No files found.
packages/flutter_tools/lib/src/android/android_sdk.dart
View file @
80a4f9b1
...
@@ -2,17 +2,13 @@
...
@@ -2,17 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// found in the LICENSE file.
import
'package:meta/meta.dart'
;
import
'../base/common.dart'
;
import
'../base/common.dart'
;
import
'../base/file_system.dart'
;
import
'../base/file_system.dart'
;
import
'../base/os.dart'
;
import
'../base/platform.dart'
;
import
'../base/process.dart'
;
import
'../base/process.dart'
;
import
'../base/version.dart'
;
import
'../base/version.dart'
;
import
'../convert.dart'
;
import
'../convert.dart'
;
import
'../globals.dart'
as
globals
;
import
'../globals.dart'
as
globals
;
import
'
android_studio
.dart'
;
import
'
java
.dart'
;
// ANDROID_HOME is deprecated.
// ANDROID_HOME is deprecated.
// See https://developer.android.com/studio/command-line/variables.html#envar
// See https://developer.android.com/studio/command-line/variables.html#envar
...
@@ -36,16 +32,18 @@ final RegExp _sdkVersionRe = RegExp(r'^ro.build.version.sdk=([0-9]+)$');
...
@@ -36,16 +32,18 @@ final RegExp _sdkVersionRe = RegExp(r'^ro.build.version.sdk=([0-9]+)$');
// $ANDROID_SDK_ROOT/platforms/android-23/android.jar
// $ANDROID_SDK_ROOT/platforms/android-23/android.jar
// $ANDROID_SDK_ROOT/platforms/android-N/android.jar
// $ANDROID_SDK_ROOT/platforms/android-N/android.jar
class
AndroidSdk
{
class
AndroidSdk
{
AndroidSdk
(
this
.
directory
)
{
AndroidSdk
(
this
.
directory
,
{
Java
?
java
,
}):
_java
=
java
{
reinitialize
();
reinitialize
();
}
}
static
const
String
javaHomeEnvironmentVariable
=
'JAVA_HOME'
;
static
const
String
javaHomeEnvironmentVariable
=
'JAVA_HOME'
;
static
const
String
_javaExecutable
=
'java'
;
/// The Android SDK root directory.
/// The Android SDK root directory.
final
Directory
directory
;
final
Directory
directory
;
final
Java
?
_java
;
List
<
AndroidSdkVersion
>
_sdkVersions
=
<
AndroidSdkVersion
>[];
List
<
AndroidSdkVersion
>
_sdkVersions
=
<
AndroidSdkVersion
>[];
AndroidSdkVersion
?
_latestVersion
;
AndroidSdkVersion
?
_latestVersion
;
...
@@ -411,162 +409,6 @@ class AndroidSdk {
...
@@ -411,162 +409,6 @@ class AndroidSdk {
return
null
;
return
null
;
}
}
/// Returns the version of java in the format \d(.\d)+(.\d)+
/// Returns null if version not found.
String
?
getJavaVersion
({
required
AndroidStudio
?
androidStudio
,
required
FileSystem
fileSystem
,
required
OperatingSystemUtils
operatingSystemUtils
,
required
Platform
platform
,
required
ProcessUtils
processUtils
,
})
{
final
String
?
javaBinary
=
findJavaBinary
(
androidStudio:
androidStudio
,
fileSystem:
fileSystem
,
operatingSystemUtils:
operatingSystemUtils
,
platform:
platform
,
);
if
(
javaBinary
==
null
)
{
globals
.
printTrace
(
'Could not find java binary to get version.'
);
return
null
;
}
final
RunResult
result
=
processUtils
.
runSync
(
<
String
>[
javaBinary
,
'--version'
],
environment:
sdkManagerEnv
,
);
if
(
result
.
exitCode
!=
0
)
{
globals
.
printTrace
(
'java --version failed: exitCode:
${result.exitCode}
stdout:
${result.stdout}
stderr:
${result.stderr}
'
);
return
null
;
}
return
parseJavaVersion
(
result
.
stdout
);
}
/// Extracts JDK version from the output of java --version.
@visibleForTesting
static
String
?
parseJavaVersion
(
String
rawVersionOutput
)
{
// The contents that matter come in the format '11.0.18' or '1.8.0_202'.
final
RegExp
jdkVersionRegex
=
RegExp
(
r'\d+\.\d+(\.\d+(?:_\d+)?)?'
);
final
Iterable
<
RegExpMatch
>
matches
=
jdkVersionRegex
.
allMatches
(
rawVersionOutput
);
if
(
matches
.
isEmpty
)
{
globals
.
logger
.
printWarning
(
_formatJavaVersionWarning
(
rawVersionOutput
));
return
null
;
}
final
String
?
versionString
=
matches
.
first
.
group
(
0
);
if
(
versionString
==
null
||
versionString
.
split
(
'_'
).
isEmpty
)
{
globals
.
logger
.
printWarning
(
_formatJavaVersionWarning
(
rawVersionOutput
));
return
null
;
}
// Trim away _d+ from versions 1.8 and below.
return
versionString
.
split
(
'_'
).
first
;
}
/// A value that would be appropriate to use as JAVA_HOME.
///
/// This method considers jdk in the following order:
/// * the JDK bundled with Android Studio, if one is found;
/// * the JAVA_HOME in the ambient environment, if set;
String
?
get
javaHome
{
return
findJavaHome
(
androidStudio:
globals
.
androidStudio
,
fileSystem:
globals
.
fs
,
operatingSystemUtils:
globals
.
os
,
platform:
globals
.
platform
,
);
}
static
String
?
findJavaHome
({
required
AndroidStudio
?
androidStudio
,
required
FileSystem
fileSystem
,
required
OperatingSystemUtils
operatingSystemUtils
,
required
Platform
platform
,
})
{
if
(
androidStudio
?.
javaPath
!=
null
)
{
globals
.
printTrace
(
"Using Android Studio's java."
);
return
androidStudio
!.
javaPath
!;
}
final
String
?
javaHomeEnv
=
platform
.
environment
[
javaHomeEnvironmentVariable
];
if
(
javaHomeEnv
!=
null
)
{
globals
.
printTrace
(
'Using JAVA_HOME from environment valuables.'
);
return
javaHomeEnv
;
}
return
null
;
}
/// Finds the java binary that is used for all operations across the tool.
///
/// This comes from [findJavaHome] if that method returns non-null;
/// otherwise, it gets from searching PATH.
// TODO(andrewkolos): To prevent confusion when debugging Android-related
// issues (see https://github.com/flutter/flutter/issues/122609 for an example),
// this logic should be consistently followed by any Java-dependent operation
// across the the tool (building Android apps, interacting with the Android SDK, etc.).
// Currently, this consistency is fragile since the logic used for building
// Android apps exists independently of this method.
// See https://github.com/flutter/flutter/issues/124252.
static
String
?
findJavaBinary
({
required
AndroidStudio
?
androidStudio
,
required
FileSystem
fileSystem
,
required
OperatingSystemUtils
operatingSystemUtils
,
required
Platform
platform
,
})
{
final
String
?
javaHome
=
findJavaHome
(
androidStudio:
androidStudio
,
fileSystem:
fileSystem
,
operatingSystemUtils:
operatingSystemUtils
,
platform:
platform
,
);
if
(
javaHome
!=
null
)
{
return
fileSystem
.
path
.
join
(
javaHome
,
'bin'
,
'java'
);
}
// Fallback to PATH based lookup.
final
String
?
pathJava
=
operatingSystemUtils
.
which
(
_javaExecutable
)?.
path
;
if
(
pathJava
!=
null
)
{
globals
.
printTrace
(
'Using java from PATH.'
);
}
else
{
globals
.
printTrace
(
'Could not find java path.'
);
}
return
pathJava
;
}
// Returns a user visible String that says the tool failed to parse
// the version of java along with the output.
static
String
_formatJavaVersionWarning
(
String
javaVersionRaw
)
{
return
'Could not parse java version from:
\n
'
'
$javaVersionRaw
\n
'
'If there is a version please look for an existing bug '
'https://github.com/flutter/flutter/issues/'
' and if one does not exist file a new issue.'
;
}
Map
<
String
,
String
>?
_sdkManagerEnv
;
/// Returns an environment with the Java folder added to PATH for use in calling
/// Java-based Android SDK commands such as sdkmanager and avdmanager.
Map
<
String
,
String
>
get
sdkManagerEnv
{
if
(
_sdkManagerEnv
==
null
)
{
// If we can locate Java, then add it to the path used to run the Android SDK manager.
_sdkManagerEnv
=
<
String
,
String
>{};
final
String
?
javaBinary
=
findJavaBinary
(
androidStudio:
globals
.
androidStudio
,
fileSystem:
globals
.
fs
,
operatingSystemUtils:
globals
.
os
,
platform:
globals
.
platform
,
);
if
(
javaBinary
!=
null
&&
globals
.
platform
.
environment
[
'PATH'
]
!=
null
)
{
_sdkManagerEnv
![
'PATH'
]
=
globals
.
fs
.
path
.
dirname
(
javaBinary
)
+
globals
.
os
.
pathVarSeparator
+
globals
.
platform
.
environment
[
'PATH'
]!;
}
}
return
_sdkManagerEnv
!;
}
/// Returns the version of the Android SDK manager tool or null if not found.
/// Returns the version of the Android SDK manager tool or null if not found.
String
?
get
sdkManagerVersion
{
String
?
get
sdkManagerVersion
{
if
(
sdkManagerPath
==
null
||
!
globals
.
processManager
.
canRun
(
sdkManagerPath
))
{
if
(
sdkManagerPath
==
null
||
!
globals
.
processManager
.
canRun
(
sdkManagerPath
))
{
...
@@ -577,7 +419,7 @@ class AndroidSdk {
...
@@ -577,7 +419,7 @@ class AndroidSdk {
}
}
final
RunResult
result
=
globals
.
processUtils
.
runSync
(
final
RunResult
result
=
globals
.
processUtils
.
runSync
(
<
String
>[
sdkManagerPath
!,
'--version'
],
<
String
>[
sdkManagerPath
!,
'--version'
],
environment:
sdkManagerEnv
,
environment:
_java
?.
environment
,
);
);
if
(
result
.
exitCode
!=
0
)
{
if
(
result
.
exitCode
!=
0
)
{
globals
.
printTrace
(
'sdkmanager --version failed: exitCode:
${result.exitCode}
stdout:
${result.stdout}
stderr:
${result.stderr}
'
);
globals
.
printTrace
(
'sdkmanager --version failed: exitCode:
${result.exitCode}
stdout:
${result.stdout}
stderr:
${result.stderr}
'
);
...
...
packages/flutter_tools/lib/src/android/android_workflow.dart
View file @
80a4f9b1
...
@@ -11,7 +11,6 @@ import '../base/context.dart';
...
@@ -11,7 +11,6 @@ import '../base/context.dart';
import
'../base/file_system.dart'
;
import
'../base/file_system.dart'
;
import
'../base/io.dart'
;
import
'../base/io.dart'
;
import
'../base/logger.dart'
;
import
'../base/logger.dart'
;
import
'../base/os.dart'
;
import
'../base/platform.dart'
;
import
'../base/platform.dart'
;
import
'../base/user_messages.dart'
hide
userMessages
;
import
'../base/user_messages.dart'
hide
userMessages
;
import
'../base/version.dart'
;
import
'../base/version.dart'
;
...
@@ -20,6 +19,7 @@ import '../doctor_validator.dart';
...
@@ -20,6 +19,7 @@ import '../doctor_validator.dart';
import
'../features.dart'
;
import
'../features.dart'
;
import
'android_sdk.dart'
;
import
'android_sdk.dart'
;
import
'android_studio.dart'
;
import
'android_studio.dart'
;
import
'java.dart'
;
const
int
kAndroidSdkMinVersion
=
29
;
const
int
kAndroidSdkMinVersion
=
29
;
final
Version
kAndroidJavaMinVersion
=
Version
(
1
,
8
,
0
);
final
Version
kAndroidJavaMinVersion
=
Version
(
1
,
8
,
0
);
...
@@ -86,12 +86,6 @@ class AndroidValidator extends DoctorValidator {
...
@@ -86,12 +86,6 @@ class AndroidValidator extends DoctorValidator {
_androidStudio
=
androidStudio
,
_androidStudio
=
androidStudio
,
_fileSystem
=
fileSystem
,
_fileSystem
=
fileSystem
,
_logger
=
logger
,
_logger
=
logger
,
_operatingSystemUtils
=
OperatingSystemUtils
(
fileSystem:
fileSystem
,
logger:
logger
,
platform:
platform
,
processManager:
processManager
,
),
_platform
=
platform
,
_platform
=
platform
,
_processManager
=
processManager
,
_processManager
=
processManager
,
_userMessages
=
userMessages
,
_userMessages
=
userMessages
,
...
@@ -101,7 +95,6 @@ class AndroidValidator extends DoctorValidator {
...
@@ -101,7 +95,6 @@ class AndroidValidator extends DoctorValidator {
final
AndroidStudio
?
_androidStudio
;
final
AndroidStudio
?
_androidStudio
;
final
FileSystem
_fileSystem
;
final
FileSystem
_fileSystem
;
final
Logger
_logger
;
final
Logger
_logger
;
final
OperatingSystemUtils
_operatingSystemUtils
;
final
Platform
_platform
;
final
Platform
_platform
;
final
ProcessManager
_processManager
;
final
ProcessManager
_processManager
;
final
UserMessages
_userMessages
;
final
UserMessages
_userMessages
;
...
@@ -138,6 +131,8 @@ class AndroidValidator extends DoctorValidator {
...
@@ -138,6 +131,8 @@ class AndroidValidator extends DoctorValidator {
}
}
String
?
javaVersionText
;
String
?
javaVersionText
;
try
{
try
{
// TODO(andrewkolos): Use Java class to find version instead of using duplicate
// code. See https://github.com/flutter/flutter/issues/124252.
_logger
.
printTrace
(
'java -version'
);
_logger
.
printTrace
(
'java -version'
);
final
ProcessResult
result
=
await
_processManager
.
run
(<
String
>[
javaBinary
,
'-version'
]);
final
ProcessResult
result
=
await
_processManager
.
run
(<
String
>[
javaBinary
,
'-version'
]);
if
(
result
.
exitCode
==
0
)
{
if
(
result
.
exitCode
==
0
)
{
...
@@ -240,12 +235,13 @@ class AndroidValidator extends DoctorValidator {
...
@@ -240,12 +235,13 @@ class AndroidValidator extends DoctorValidator {
_task
=
'Finding Java binary'
;
_task
=
'Finding Java binary'
;
// Now check for the JDK.
// Now check for the JDK.
final
String
?
javaBinary
=
AndroidSdk
.
findJavaBinary
(
final
String
?
javaBinary
=
Java
.
find
(
logger:
_logger
,
androidStudio:
_androidStudio
,
androidStudio:
_androidStudio
,
fileSystem:
_fileSystem
,
fileSystem:
_fileSystem
,
operatingSystemUtils:
_operatingSystemUtils
,
platform:
_platform
,
platform:
_platform
,
);
processManager:
_processManager
,
)?.
binaryPath
;
if
(
javaBinary
==
null
)
{
if
(
javaBinary
==
null
)
{
messages
.
add
(
ValidationMessage
.
error
(
_userMessages
.
androidMissingJdk
));
messages
.
add
(
ValidationMessage
.
error
(
_userMessages
.
androidMissingJdk
));
return
ValidationResult
(
ValidationType
.
partial
,
messages
,
statusInfo:
sdkVersionText
);
return
ValidationResult
(
ValidationType
.
partial
,
messages
,
statusInfo:
sdkVersionText
);
...
@@ -266,18 +262,18 @@ class AndroidValidator extends DoctorValidator {
...
@@ -266,18 +262,18 @@ class AndroidValidator extends DoctorValidator {
/// SDK have been accepted.
/// SDK have been accepted.
class
AndroidLicenseValidator
extends
DoctorValidator
{
class
AndroidLicenseValidator
extends
DoctorValidator
{
AndroidLicenseValidator
({
AndroidLicenseValidator
({
required
Java
?
java
,
required
AndroidSdk
?
androidSdk
,
required
AndroidSdk
?
androidSdk
,
required
Platform
platform
,
required
Platform
platform
,
required
OperatingSystemUtils
operatingSystemUtils
,
required
FileSystem
fileSystem
,
required
FileSystem
fileSystem
,
required
ProcessManager
processManager
,
required
ProcessManager
processManager
,
required
Logger
logger
,
required
Logger
logger
,
required
AndroidStudio
?
androidStudio
,
required
AndroidStudio
?
androidStudio
,
required
Stdio
stdio
,
required
Stdio
stdio
,
required
UserMessages
userMessages
,
required
UserMessages
userMessages
,
})
:
_androidSdk
=
androidSdk
,
})
:
_java
=
java
,
_androidSdk
=
androidSdk
,
_platform
=
platform
,
_platform
=
platform
,
_operatingSystemUtils
=
operatingSystemUtils
,
_fileSystem
=
fileSystem
,
_fileSystem
=
fileSystem
,
_processManager
=
processManager
,
_processManager
=
processManager
,
_logger
=
logger
,
_logger
=
logger
,
...
@@ -286,10 +282,10 @@ class AndroidLicenseValidator extends DoctorValidator {
...
@@ -286,10 +282,10 @@ class AndroidLicenseValidator extends DoctorValidator {
_userMessages
=
userMessages
,
_userMessages
=
userMessages
,
super
(
'Android license subvalidator'
);
super
(
'Android license subvalidator'
);
final
Java
?
_java
;
final
AndroidSdk
?
_androidSdk
;
final
AndroidSdk
?
_androidSdk
;
final
AndroidStudio
?
_androidStudio
;
final
AndroidStudio
?
_androidStudio
;
final
Stdio
_stdio
;
final
Stdio
_stdio
;
final
OperatingSystemUtils
_operatingSystemUtils
;
final
Platform
_platform
;
final
Platform
_platform
;
final
FileSystem
_fileSystem
;
final
FileSystem
_fileSystem
;
final
ProcessManager
_processManager
;
final
ProcessManager
_processManager
;
...
@@ -330,12 +326,13 @@ class AndroidLicenseValidator extends DoctorValidator {
...
@@ -330,12 +326,13 @@ class AndroidLicenseValidator extends DoctorValidator {
}
}
Future
<
bool
>
_checkJavaVersionNoOutput
()
async
{
Future
<
bool
>
_checkJavaVersionNoOutput
()
async
{
final
String
?
javaBinary
=
AndroidSdk
.
findJavaBinary
(
final
String
?
javaBinary
=
Java
.
find
(
logger:
_logger
,
androidStudio:
_androidStudio
,
androidStudio:
_androidStudio
,
fileSystem:
_fileSystem
,
fileSystem:
_fileSystem
,
operatingSystemUtils:
_operatingSystemUtils
,
platform:
_platform
,
platform:
_platform
,
);
processManager:
_processManager
,
)?.
binaryPath
;
if
(
javaBinary
==
null
)
{
if
(
javaBinary
==
null
)
{
return
false
;
return
false
;
}
}
...
@@ -387,7 +384,7 @@ class AndroidLicenseValidator extends DoctorValidator {
...
@@ -387,7 +384,7 @@ class AndroidLicenseValidator extends DoctorValidator {
try
{
try
{
final
Process
process
=
await
_processManager
.
start
(
final
Process
process
=
await
_processManager
.
start
(
<
String
>[
_androidSdk
!.
sdkManagerPath
!,
'--licenses'
],
<
String
>[
_androidSdk
!.
sdkManagerPath
!,
'--licenses'
],
environment:
_
androidSdk
!.
sdkManagerEnv
,
environment:
_
java
?.
environment
,
);
);
process
.
stdin
.
write
(
'n
\n
'
);
process
.
stdin
.
write
(
'n
\n
'
);
// We expect logcat streams to occasionally contain invalid utf-8,
// We expect logcat streams to occasionally contain invalid utf-8,
...
@@ -427,7 +424,7 @@ class AndroidLicenseValidator extends DoctorValidator {
...
@@ -427,7 +424,7 @@ class AndroidLicenseValidator extends DoctorValidator {
try
{
try
{
final
Process
process
=
await
_processManager
.
start
(
final
Process
process
=
await
_processManager
.
start
(
<
String
>[
_androidSdk
!.
sdkManagerPath
!,
'--licenses'
],
<
String
>[
_androidSdk
!.
sdkManagerPath
!,
'--licenses'
],
environment:
_
androidSdk
!.
sdkManagerEnv
,
environment:
_
java
?.
environment
,
);
);
// The real stdin will never finish streaming. Pipe until the child process
// The real stdin will never finish streaming. Pipe until the child process
...
...
packages/flutter_tools/lib/src/android/gradle.dart
View file @
80a4f9b1
...
@@ -147,8 +147,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
...
@@ -147,8 +147,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
_gradleUtils
=
gradleUtils
,
_gradleUtils
=
gradleUtils
,
_androidStudio
=
androidStudio
,
_androidStudio
=
androidStudio
,
_fileSystemUtils
=
FileSystemUtils
(
fileSystem:
fileSystem
,
platform:
platform
),
_fileSystemUtils
=
FileSystemUtils
(
fileSystem:
fileSystem
,
platform:
platform
),
_processUtils
=
ProcessUtils
(
logger:
logger
,
processManager:
processManager
),
_processUtils
=
ProcessUtils
(
logger:
logger
,
processManager:
processManager
);
_platform
=
platform
;
final
Logger
_logger
;
final
Logger
_logger
;
final
ProcessUtils
_processUtils
;
final
ProcessUtils
_processUtils
;
...
@@ -158,7 +157,6 @@ class AndroidGradleBuilder implements AndroidBuilder {
...
@@ -158,7 +157,6 @@ class AndroidGradleBuilder implements AndroidBuilder {
final
GradleUtils
_gradleUtils
;
final
GradleUtils
_gradleUtils
;
final
FileSystemUtils
_fileSystemUtils
;
final
FileSystemUtils
_fileSystemUtils
;
final
AndroidStudio
?
_androidStudio
;
final
AndroidStudio
?
_androidStudio
;
final
Platform
_platform
;
/// Builds the AAR and POM files for the current Flutter module or plugin.
/// Builds the AAR and POM files for the current Flutter module or plugin.
@override
@override
...
@@ -268,11 +266,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
...
@@ -268,11 +266,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
AndroidStudioJavaGradleConflictMigration
(
_logger
,
AndroidStudioJavaGradleConflictMigration
(
_logger
,
project:
project
.
android
,
project:
project
.
android
,
androidStudio:
_androidStudio
,
androidStudio:
_androidStudio
,
fileSystem:
_fileSystem
,
java:
globals
.
java
)
processUtils:
_processUtils
,
platform:
_platform
,
os:
globals
.
os
,
androidSdk:
globals
.
androidSdk
)
,
,
];
];
...
@@ -428,7 +422,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
...
@@ -428,7 +422,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
..
start
();
..
start
();
int
exitCode
=
1
;
int
exitCode
=
1
;
try
{
try
{
final
String
?
javaHome
=
globals
.
androidSdk
?.
javaHome
;
final
String
?
javaHome
=
globals
.
java
?.
javaHome
;
exitCode
=
await
_processUtils
.
stream
(
exitCode
=
await
_processUtils
.
stream
(
command
,
command
,
workingDirectory:
project
.
android
.
hostAppGradleRoot
.
path
,
workingDirectory:
project
.
android
.
hostAppGradleRoot
.
path
,
...
@@ -698,7 +692,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
...
@@ -698,7 +692,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
..
start
();
..
start
();
RunResult
result
;
RunResult
result
;
try
{
try
{
final
String
?
javaHome
=
globals
.
androidSdk
?.
javaHome
;
final
String
?
javaHome
=
globals
.
java
?.
javaHome
;
result
=
await
_processUtils
.
run
(
result
=
await
_processUtils
.
run
(
command
,
command
,
workingDirectory:
project
.
android
.
hostAppGradleRoot
.
path
,
workingDirectory:
project
.
android
.
hostAppGradleRoot
.
path
,
...
@@ -751,7 +745,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
...
@@ -751,7 +745,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
..
start
();
..
start
();
RunResult
result
;
RunResult
result
;
try
{
try
{
final
String
?
javaHome
=
globals
.
androidSdk
?.
javaHome
;
final
String
?
javaHome
=
globals
.
java
?.
javaHome
;
result
=
await
_processUtils
.
run
(
result
=
await
_processUtils
.
run
(
command
,
command
,
workingDirectory:
project
.
android
.
hostAppGradleRoot
.
path
,
workingDirectory:
project
.
android
.
hostAppGradleRoot
.
path
,
...
...
packages/flutter_tools/lib/src/android/java.dart
0 → 100644
View file @
80a4f9b1
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'package:process/process.dart'
;
import
'../base/file_system.dart'
;
import
'../base/logger.dart'
;
import
'../base/os.dart'
;
import
'../base/platform.dart'
;
import
'../base/process.dart'
;
import
'android_studio.dart'
;
const
String
_javaHomeEnvironmentVariable
=
'JAVA_HOME'
;
const
String
_kJavaExecutable
=
'java'
;
/// Represents an installation of Java.
class
Java
{
Java
({
required
this
.
javaHome
,
required
this
.
binaryPath
,
required
Logger
logger
,
required
FileSystem
fileSystem
,
required
OperatingSystemUtils
os
,
required
Platform
platform
,
required
ProcessManager
processManager
,
}):
_logger
=
logger
,
_fileSystem
=
fileSystem
,
_os
=
os
,
_platform
=
platform
,
_processManager
=
processManager
,
_processUtils
=
ProcessUtils
(
processManager:
processManager
,
logger:
logger
);
/// Finds the Java runtime environment that should be used for all java-dependent
/// operations across the tool.
///
/// This searches for Java in the following places, in order:
///
/// 1. the runtime environment bundled with Android Studio;
/// 2. the runtime environment found in the JAVA_HOME env variable, if set; or
/// 3. the java binary found on PATH.
///
/// Returns null if no java binary could be found.
// TODO(andrewkolos): To prevent confusion when debugging Android-related
// issues (see https://github.com/flutter/flutter/issues/122609 for an example),
// this logic should be consistently followed by any Java-dependent operation
// across the the tool (building Android apps, interacting with the Android SDK, etc.).
// Currently, this consistency is fragile since the logic used for building
// Android apps exists independently of this method.
// See https://github.com/flutter/flutter/issues/124252.
static
Java
?
find
({
required
AndroidStudio
?
androidStudio
,
required
Logger
logger
,
required
FileSystem
fileSystem
,
required
Platform
platform
,
required
ProcessManager
processManager
,
})
{
final
OperatingSystemUtils
os
=
OperatingSystemUtils
(
fileSystem:
fileSystem
,
logger:
logger
,
platform:
platform
,
processManager:
processManager
);
final
String
?
home
=
_findJavaHome
(
logger:
logger
,
androidStudio:
androidStudio
,
platform:
platform
);
final
String
?
binary
=
_findJavaBinary
(
logger:
logger
,
javaHome:
home
,
fileSystem:
fileSystem
,
operatingSystemUtils:
os
,
platform:
platform
);
if
(
binary
==
null
)
{
return
null
;
}
return
Java
(
javaHome:
home
,
binaryPath:
binary
,
logger:
logger
,
fileSystem:
fileSystem
,
os:
os
,
platform:
platform
,
processManager:
processManager
,
);
}
/// The path of the runtime's home directory.
///
/// This should only be used for logging and validation purposes.
/// If you need to set JAVA_HOME when starting a process, consider
/// using [environment] instead.
/// If you need to inspect the files of the runtime, considering adding
/// a new method to this class instead.
final
String
?
javaHome
;
/// The path of the runtime's java binary.
///
/// This should be only used for logging and validation purposes.
/// If you need to invoke the binary directly, consider adding a new method
/// to this class instead.
final
String
binaryPath
;
final
Logger
_logger
;
final
FileSystem
_fileSystem
;
final
OperatingSystemUtils
_os
;
final
Platform
_platform
;
final
ProcessManager
_processManager
;
final
ProcessUtils
_processUtils
;
/// Returns an environment variable map with
/// 1. JAVA_HOME set if this object has a known home directory, and
/// 2. The java binary folder appended onto PATH, if the binary location is known.
///
/// This map should be used as the environment when invoking any Java-dependent
/// processes, such as Gradle or Android SDK tools (avdmanager, sdkmanager, etc.)
Map
<
String
,
String
>
get
environment
{
return
<
String
,
String
>{
if
(
javaHome
!=
null
)
_javaHomeEnvironmentVariable:
javaHome
!,
'PATH'
:
_fileSystem
.
path
.
dirname
(
binaryPath
)
+
_os
.
pathVarSeparator
+
_platform
.
environment
[
'PATH'
]!,
};
}
/// Returns the version of java in the format \d(.\d)+(.\d)+
/// Returns null if version could not be determined.
late
final
JavaVersion
?
version
=
(()
{
final
RunResult
result
=
_processUtils
.
runSync
(
<
String
>[
binaryPath
,
'--version'
],
environment:
environment
,
);
if
(
result
.
exitCode
!=
0
)
{
_logger
.
printTrace
(
'java --version failed: exitCode:
${result.exitCode}
'
' stdout:
${result.stdout}
stderr:
${result.stderr}
'
);
}
return
JavaVersion
.
tryParseFromJavaOutput
(
result
.
stdout
,
logger:
_logger
);
})();
bool
canRun
()
{
return
_processManager
.
canRun
(
binaryPath
);
}
}
String
?
_findJavaHome
({
required
Logger
logger
,
required
AndroidStudio
?
androidStudio
,
required
Platform
platform
,
})
{
final
String
?
androidStudioJavaPath
=
androidStudio
?.
javaPath
;
if
(
androidStudioJavaPath
!=
null
)
{
return
androidStudioJavaPath
;
}
final
String
?
javaHomeEnv
=
platform
.
environment
[
_javaHomeEnvironmentVariable
];
if
(
javaHomeEnv
!=
null
)
{
return
javaHomeEnv
;
}
return
null
;
}
String
?
_findJavaBinary
({
required
Logger
logger
,
required
String
?
javaHome
,
required
FileSystem
fileSystem
,
required
OperatingSystemUtils
operatingSystemUtils
,
required
Platform
platform
,
})
{
if
(
javaHome
!=
null
)
{
return
fileSystem
.
path
.
join
(
javaHome
,
'bin'
,
'java'
);
}
// Fallback to PATH based lookup.
return
operatingSystemUtils
.
which
(
_kJavaExecutable
)?.
path
;
}
// Returns a user visible String that says the tool failed to parse
// the version of java along with the output.
String
_formatJavaVersionWarning
(
String
javaVersionRaw
)
{
return
'Could not parse java version from:
\n
'
'
$javaVersionRaw
\n
'
'If there is a version please look for an existing bug '
'https://github.com/flutter/flutter/issues/ '
'and if one does not exist file a new issue.'
;
}
class
JavaVersion
{
JavaVersion
({
required
this
.
longText
,
required
this
.
number
});
/// Typically the first line of the output from `java --version`.
/// For example, `"openjdk 19.0.2 2023-01-17"`.
final
String
longText
;
/// The version number. For example, `"19.0.2."`.
final
String
number
;
/// Extracts JDK version from the output of java --version.
static
JavaVersion
?
tryParseFromJavaOutput
(
String
rawVersionOutput
,
{
required
Logger
logger
,
})
{
final
List
<
String
>
versionLines
=
rawVersionOutput
.
split
(
'
\n
'
);
final
String
longText
=
versionLines
.
length
>=
2
?
versionLines
[
1
]
:
versionLines
[
0
];
// The contents that matter come in the format '11.0.18' or '1.8.0_202'.
final
RegExp
jdkVersionRegex
=
RegExp
(
r'\d+\.\d+(\.\d+(?:_\d+)?)?'
);
final
Iterable
<
RegExpMatch
>
matches
=
jdkVersionRegex
.
allMatches
(
rawVersionOutput
);
if
(
matches
.
isEmpty
)
{
logger
.
printWarning
(
_formatJavaVersionWarning
(
rawVersionOutput
));
return
null
;
}
final
String
?
rawShortText
=
matches
.
first
.
group
(
0
);
if
(
rawShortText
==
null
||
rawShortText
.
split
(
'_'
).
isEmpty
)
{
logger
.
printWarning
(
_formatJavaVersionWarning
(
rawVersionOutput
));
return
null
;
}
// Trim away _d+ from versions 1.8 and below.
final
String
shortText
=
rawShortText
.
split
(
'_'
).
first
;
return
JavaVersion
(
longText:
longText
,
number:
shortText
);
}
}
packages/flutter_tools/lib/src/android/migrations/android_studio_java_gradle_conflict_migration.dart
View file @
80a4f9b1
...
@@ -5,15 +5,12 @@
...
@@ -5,15 +5,12 @@
import
'package:meta/meta.dart'
;
import
'package:meta/meta.dart'
;
import
'../../base/file_system.dart'
;
import
'../../base/file_system.dart'
;
import
'../../base/os.dart'
;
import
'../../base/platform.dart'
;
import
'../../base/process.dart'
;
import
'../../base/project_migrator.dart'
;
import
'../../base/project_migrator.dart'
;
import
'../../base/version.dart'
;
import
'../../base/version.dart'
;
import
'../../project.dart'
;
import
'../../project.dart'
;
import
'../android_sdk.dart'
;
import
'../android_studio.dart'
;
import
'../android_studio.dart'
;
import
'../gradle_utils.dart'
;
import
'../gradle_utils.dart'
;
import
'../java.dart'
;
// Android Studio 2022.2 "Flamingo" is the first to bundle a Java 17 JDK.
// Android Studio 2022.2 "Flamingo" is the first to bundle a Java 17 JDK.
// Previous versions bundled a Java 11 JDK.
// Previous versions bundled a Java 11 JDK.
...
@@ -77,25 +74,14 @@ class AndroidStudioJavaGradleConflictMigration extends ProjectMigrator {
...
@@ -77,25 +74,14 @@ class AndroidStudioJavaGradleConflictMigration extends ProjectMigrator {
super
.
logger
,
super
.
logger
,
{
required
AndroidProject
project
,
{
required
AndroidProject
project
,
AndroidStudio
?
androidStudio
,
AndroidStudio
?
androidStudio
,
required
FileSystem
fileSystem
,
required
Java
?
java
,
required
ProcessUtils
processUtils
,
required
Platform
platform
,
required
OperatingSystemUtils
os
,
AndroidSdk
?
androidSdk
,
})
:
_gradleWrapperPropertiesFile
=
getGradleWrapperFile
(
project
.
hostAppGradleRoot
),
})
:
_gradleWrapperPropertiesFile
=
getGradleWrapperFile
(
project
.
hostAppGradleRoot
),
_androidStudio
=
androidStudio
,
_androidStudio
=
androidStudio
,
_fileSystem
=
fileSystem
,
_java
=
java
;
_processUtils
=
processUtils
,
_platform
=
platform
,
_os
=
os
,
_androidSdk
=
androidSdk
;
final
File
_gradleWrapperPropertiesFile
;
final
File
_gradleWrapperPropertiesFile
;
final
AndroidStudio
?
_androidStudio
;
final
AndroidStudio
?
_androidStudio
;
final
FileSystem
_fileSystem
;
final
Java
?
_java
;
final
ProcessUtils
_processUtils
;
final
Platform
_platform
;
final
OperatingSystemUtils
_os
;
final
AndroidSdk
?
_androidSdk
;
@override
@override
void
migrate
()
{
void
migrate
()
{
...
@@ -113,13 +99,7 @@ class AndroidStudioJavaGradleConflictMigration extends ProjectMigrator {
...
@@ -113,13 +99,7 @@ class AndroidStudioJavaGradleConflictMigration extends ProjectMigrator {
return
;
return
;
}
}
final
String
?
javaVersionString
=
_androidSdk
?.
getJavaVersion
(
final
String
?
javaVersionString
=
_java
?.
version
?.
number
;
androidStudio:
_androidStudio
,
fileSystem:
_fileSystem
,
operatingSystemUtils:
_os
,
platform:
_platform
,
processUtils:
_processUtils
,
);
final
Version
?
javaVersion
=
Version
.
parse
(
javaVersionString
);
final
Version
?
javaVersion
=
Version
.
parse
(
javaVersionString
);
if
(
javaVersion
==
null
)
{
if
(
javaVersion
==
null
)
{
logger
.
printTrace
(
javaVersionNotFound
);
logger
.
printTrace
(
javaVersionNotFound
);
...
...
packages/flutter_tools/lib/src/commands/daemon.dart
View file @
80a4f9b1
...
@@ -1360,6 +1360,7 @@ class EmulatorDomain extends Domain {
...
@@ -1360,6 +1360,7 @@ class EmulatorDomain extends Domain {
EmulatorManager
emulators
=
EmulatorManager
(
EmulatorManager
emulators
=
EmulatorManager
(
fileSystem:
globals
.
fs
,
fileSystem:
globals
.
fs
,
logger:
globals
.
logger
,
logger:
globals
.
logger
,
java:
globals
.
java
,
androidSdk:
globals
.
androidSdk
,
androidSdk:
globals
.
androidSdk
,
processManager:
globals
.
processManager
,
processManager:
globals
.
processManager
,
androidWorkflow:
androidWorkflow
!,
androidWorkflow:
androidWorkflow
!,
...
...
packages/flutter_tools/lib/src/context_runner.dart
View file @
80a4f9b1
...
@@ -14,6 +14,7 @@ import 'android/android_studio.dart';
...
@@ -14,6 +14,7 @@ import 'android/android_studio.dart';
import
'android/android_workflow.dart'
;
import
'android/android_workflow.dart'
;
import
'android/gradle.dart'
;
import
'android/gradle.dart'
;
import
'android/gradle_utils.dart'
;
import
'android/gradle_utils.dart'
;
import
'android/java.dart'
;
import
'application_package.dart'
;
import
'application_package.dart'
;
import
'artifacts.dart'
;
import
'artifacts.dart'
;
import
'asset.dart'
;
import
'asset.dart'
;
...
@@ -97,11 +98,11 @@ Future<T> runInContext<T>(
...
@@ -97,11 +98,11 @@ Future<T> runInContext<T>(
androidStudio:
globals
.
androidStudio
,
androidStudio:
globals
.
androidStudio
,
),
),
AndroidLicenseValidator:
()
=>
AndroidLicenseValidator
(
AndroidLicenseValidator:
()
=>
AndroidLicenseValidator
(
operatingSystemUtils:
globals
.
os
,
platform:
globals
.
platform
,
platform:
globals
.
platform
,
userMessages:
globals
.
userMessages
,
userMessages:
globals
.
userMessages
,
processManager:
globals
.
processManager
,
processManager:
globals
.
processManager
,
androidStudio:
globals
.
androidStudio
,
androidStudio:
globals
.
androidStudio
,
java:
globals
.
java
,
androidSdk:
globals
.
androidSdk
,
androidSdk:
globals
.
androidSdk
,
logger:
globals
.
logger
,
logger:
globals
.
logger
,
fileSystem:
globals
.
fs
,
fileSystem:
globals
.
fs
,
...
@@ -216,6 +217,7 @@ Future<T> runInContext<T>(
...
@@ -216,6 +217,7 @@ Future<T> runInContext<T>(
Doctor:
()
=>
Doctor
(
logger:
globals
.
logger
),
Doctor:
()
=>
Doctor
(
logger:
globals
.
logger
),
DoctorValidatorsProvider:
()
=>
DoctorValidatorsProvider
.
defaultInstance
,
DoctorValidatorsProvider:
()
=>
DoctorValidatorsProvider
.
defaultInstance
,
EmulatorManager:
()
=>
EmulatorManager
(
EmulatorManager:
()
=>
EmulatorManager
(
java:
globals
.
java
,
androidSdk:
globals
.
androidSdk
,
androidSdk:
globals
.
androidSdk
,
processManager:
globals
.
processManager
,
processManager:
globals
.
processManager
,
logger:
globals
.
logger
,
logger:
globals
.
logger
,
...
@@ -253,6 +255,13 @@ Future<T> runInContext<T>(
...
@@ -253,6 +255,13 @@ Future<T> runInContext<T>(
xcode:
globals
.
xcode
!,
xcode:
globals
.
xcode
!,
platform:
globals
.
platform
,
platform:
globals
.
platform
,
),
),
Java:
()
=>
Java
.
find
(
androidStudio:
globals
.
androidStudio
,
logger:
globals
.
logger
,
fileSystem:
globals
.
fs
,
platform:
globals
.
platform
,
processManager:
globals
.
processManager
),
LocalEngineLocator:
()
=>
LocalEngineLocator
(
LocalEngineLocator:
()
=>
LocalEngineLocator
(
userMessages:
userMessages
,
userMessages:
userMessages
,
logger:
globals
.
logger
,
logger:
globals
.
logger
,
...
...
packages/flutter_tools/lib/src/emulator.dart
View file @
80a4f9b1
...
@@ -10,6 +10,7 @@ import 'package:process/process.dart';
...
@@ -10,6 +10,7 @@ import 'package:process/process.dart';
import
'android/android_emulator.dart'
;
import
'android/android_emulator.dart'
;
import
'android/android_sdk.dart'
;
import
'android/android_sdk.dart'
;
import
'android/android_workflow.dart'
;
import
'android/android_workflow.dart'
;
import
'android/java.dart'
;
import
'base/context.dart'
;
import
'base/context.dart'
;
import
'base/file_system.dart'
;
import
'base/file_system.dart'
;
import
'base/logger.dart'
;
import
'base/logger.dart'
;
...
@@ -22,12 +23,14 @@ EmulatorManager? get emulatorManager => context.get<EmulatorManager>();
...
@@ -22,12 +23,14 @@ EmulatorManager? get emulatorManager => context.get<EmulatorManager>();
/// A class to get all available emulators.
/// A class to get all available emulators.
class
EmulatorManager
{
class
EmulatorManager
{
EmulatorManager
({
EmulatorManager
({
required
Java
?
java
,
AndroidSdk
?
androidSdk
,
AndroidSdk
?
androidSdk
,
required
Logger
logger
,
required
Logger
logger
,
required
ProcessManager
processManager
,
required
ProcessManager
processManager
,
required
AndroidWorkflow
androidWorkflow
,
required
AndroidWorkflow
androidWorkflow
,
required
FileSystem
fileSystem
,
required
FileSystem
fileSystem
,
})
:
_androidSdk
=
androidSdk
,
})
:
_java
=
java
,
_androidSdk
=
androidSdk
,
_processUtils
=
ProcessUtils
(
logger:
logger
,
processManager:
processManager
),
_processUtils
=
ProcessUtils
(
logger:
logger
,
processManager:
processManager
),
_androidEmulators
=
AndroidEmulators
(
_androidEmulators
=
AndroidEmulators
(
androidSdk:
androidSdk
,
androidSdk:
androidSdk
,
...
@@ -39,6 +42,7 @@ class EmulatorManager {
...
@@ -39,6 +42,7 @@ class EmulatorManager {
_emulatorDiscoverers
.
add
(
_androidEmulators
);
_emulatorDiscoverers
.
add
(
_androidEmulators
);
}
}
final
Java
?
_java
;
final
AndroidSdk
?
_androidSdk
;
final
AndroidSdk
?
_androidSdk
;
final
AndroidEmulators
_androidEmulators
;
final
AndroidEmulators
_androidEmulators
;
final
ProcessUtils
_processUtils
;
final
ProcessUtils
_processUtils
;
...
@@ -152,7 +156,7 @@ class EmulatorManager {
...
@@ -152,7 +156,7 @@ class EmulatorManager {
'-n'
,
emulatorName
,
'-n'
,
emulatorName
,
'-k'
,
sdkId
,
'-k'
,
sdkId
,
'-d'
,
device
,
'-d'
,
device
,
],
environment:
_
androidSdk
?.
sdkManagerEnv
,
],
environment:
_
java
?.
environment
,
);
);
return
CreateEmulatorResult
(
return
CreateEmulatorResult
(
emulatorName
,
emulatorName
,
...
@@ -175,7 +179,7 @@ class EmulatorManager {
...
@@ -175,7 +179,7 @@ class EmulatorManager {
'-c'
,
'-c'
,
];
];
final
RunResult
runResult
=
await
_processUtils
.
run
(
args
,
final
RunResult
runResult
=
await
_processUtils
.
run
(
args
,
environment:
_
androidSdk
?.
sdkManagerEnv
);
environment:
_
java
?.
environment
);
if
(
runResult
.
exitCode
!=
0
)
{
if
(
runResult
.
exitCode
!=
0
)
{
return
null
;
return
null
;
}
}
...
@@ -205,7 +209,7 @@ class EmulatorManager {
...
@@ -205,7 +209,7 @@ class EmulatorManager {
'-n'
,
'temp'
,
'-n'
,
'temp'
,
];
];
final
RunResult
runResult
=
await
_processUtils
.
run
(
args
,
final
RunResult
runResult
=
await
_processUtils
.
run
(
args
,
environment:
_
androidSdk
?.
sdkManagerEnv
);
environment:
_
java
?.
environment
);
// Get the list of IDs that match our criteria
// Get the list of IDs that match our criteria
final
List
<
String
>
availableIDs
=
runResult
.
stderr
final
List
<
String
>
availableIDs
=
runResult
.
stderr
...
...
packages/flutter_tools/lib/src/globals.dart
View file @
80a4f9b1
...
@@ -9,6 +9,7 @@ import 'package:unified_analytics/unified_analytics.dart';
...
@@ -9,6 +9,7 @@ import 'package:unified_analytics/unified_analytics.dart';
import
'android/android_sdk.dart'
;
import
'android/android_sdk.dart'
;
import
'android/android_studio.dart'
;
import
'android/android_studio.dart'
;
import
'android/gradle_utils.dart'
;
import
'android/gradle_utils.dart'
;
import
'android/java.dart'
;
import
'artifacts.dart'
;
import
'artifacts.dart'
;
import
'base/bot_detector.dart'
;
import
'base/bot_detector.dart'
;
import
'base/config.dart'
;
import
'base/config.dart'
;
...
@@ -308,3 +309,9 @@ final RegExp kVMServiceMessageRegExp = RegExp(r'The Dart VM service is listening
...
@@ -308,3 +309,9 @@ final RegExp kVMServiceMessageRegExp = RegExp(r'The Dart VM service is listening
// The official tool no longer allows non-null safe builds. This can be
// The official tool no longer allows non-null safe builds. This can be
// overridden in other clients.
// overridden in other clients.
NonNullSafeBuilds
get
nonNullSafeBuilds
=>
context
.
get
<
NonNullSafeBuilds
>()
??
NonNullSafeBuilds
.
notAllowed
;
NonNullSafeBuilds
get
nonNullSafeBuilds
=>
context
.
get
<
NonNullSafeBuilds
>()
??
NonNullSafeBuilds
.
notAllowed
;
/// Contains information about the JRE/JDK to use for Java-dependent operations.
///
/// A value of [null] indicates that no installation of java could be found on
/// the host machine.
Java
?
get
java
=>
context
.
get
<
Java
>();
packages/flutter_tools/lib/src/project.dart
View file @
80a4f9b1
...
@@ -568,13 +568,7 @@ class AndroidProject extends FlutterProjectPlatform {
...
@@ -568,13 +568,7 @@ class AndroidProject extends FlutterProjectPlatform {
hostAppGradleRoot
,
globals
.
logger
,
globals
.
processManager
);
hostAppGradleRoot
,
globals
.
logger
,
globals
.
processManager
);
final
String
?
agpVersion
=
final
String
?
agpVersion
=
gradle
.
getAgpVersion
(
hostAppGradleRoot
,
globals
.
logger
);
gradle
.
getAgpVersion
(
hostAppGradleRoot
,
globals
.
logger
);
final
String
?
javaVersion
=
globals
.
androidSdk
?.
getJavaVersion
(
final
String
?
javaVersion
=
globals
.
java
?.
version
?.
number
;
androidStudio:
globals
.
androidStudio
,
fileSystem:
globals
.
fs
,
operatingSystemUtils:
globals
.
os
,
platform:
globals
.
platform
,
processUtils:
globals
.
processUtils
,
);
// Assume valid configuration.
// Assume valid configuration.
String
description
=
validJavaGradleAgpString
;
String
description
=
validJavaGradleAgpString
;
...
...
packages/flutter_tools/test/commands.shard/hermetic/proxied_devices_test.dart
View file @
80a4f9b1
...
@@ -6,6 +6,7 @@ import 'dart:async';
...
@@ -6,6 +6,7 @@ import 'dart:async';
import
'package:file/memory.dart'
;
import
'package:file/memory.dart'
;
import
'package:flutter_tools/src/android/android_device.dart'
;
import
'package:flutter_tools/src/android/android_device.dart'
;
import
'package:flutter_tools/src/android/java.dart'
;
import
'package:flutter_tools/src/application_package.dart'
;
import
'package:flutter_tools/src/application_package.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
...
@@ -20,6 +21,7 @@ import 'package:test/fake.dart';
...
@@ -20,6 +21,7 @@ import 'package:test/fake.dart';
import
'../../src/common.dart'
;
import
'../../src/common.dart'
;
import
'../../src/context.dart'
;
import
'../../src/context.dart'
;
import
'../../src/fake_devices.dart'
;
import
'../../src/fake_devices.dart'
;
import
'../../src/fakes.dart'
;
void
main
(
)
{
void
main
(
)
{
Daemon
?
daemon
;
Daemon
?
daemon
;
...
@@ -104,6 +106,8 @@ void main() {
...
@@ -104,6 +106,8 @@ void main() {
final
bool
supportsRuntimeMode
=
await
device
.
supportsRuntimeMode
(
BuildMode
.
release
);
final
bool
supportsRuntimeMode
=
await
device
.
supportsRuntimeMode
(
BuildMode
.
release
);
expect
(
fakeDevice
.
supportsRuntimeModeCalledBuildMode
,
BuildMode
.
release
);
expect
(
fakeDevice
.
supportsRuntimeModeCalledBuildMode
,
BuildMode
.
release
);
expect
(
supportsRuntimeMode
,
true
);
expect
(
supportsRuntimeMode
,
true
);
},
overrides:
<
Type
,
Generator
>{
Java:
()
=>
FakeJava
(),
});
});
testUsingContext
(
'redirects logs'
,
()
async
{
testUsingContext
(
'redirects logs'
,
()
async
{
...
@@ -183,6 +187,7 @@ void main() {
...
@@ -183,6 +187,7 @@ void main() {
expect
(
fakeDevice
.
stopAppPackage
,
applicationPackage
);
expect
(
fakeDevice
.
stopAppPackage
,
applicationPackage
);
expect
(
stopAppResult
,
true
);
expect
(
stopAppResult
,
true
);
},
overrides:
<
Type
,
Generator
>{
},
overrides:
<
Type
,
Generator
>{
Java:
()
=>
FakeJava
(),
ApplicationPackageFactory:
()
=>
applicationPackageFactory
,
ApplicationPackageFactory:
()
=>
applicationPackageFactory
,
FileSystem:
()
=>
memoryFileSystem
,
FileSystem:
()
=>
memoryFileSystem
,
ProcessManager:
()
=>
fakeProcessManager
,
ProcessManager:
()
=>
fakeProcessManager
,
...
@@ -212,6 +217,7 @@ void main() {
...
@@ -212,6 +217,7 @@ void main() {
expect
(
await
screenshotOutputFile
.
readAsBytes
(),
screenshot
);
expect
(
await
screenshotOutputFile
.
readAsBytes
(),
screenshot
);
},
overrides:
<
Type
,
Generator
>{
},
overrides:
<
Type
,
Generator
>{
Java:
()
=>
FakeJava
(),
FileSystem:
()
=>
memoryFileSystem
,
FileSystem:
()
=>
memoryFileSystem
,
ProcessManager:
()
=>
fakeProcessManager
,
ProcessManager:
()
=>
fakeProcessManager
,
});
});
...
...
packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart
View file @
80a4f9b1
...
@@ -447,9 +447,6 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
...
@@ -447,9 +447,6 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
@override
@override
final
Directory
directory
;
final
Directory
directory
;
@override
String
?
get
javaHome
=>
'java'
;
}
}
class
FakeAndroidStudio
extends
Fake
implements
AndroidStudio
{
class
FakeAndroidStudio
extends
Fake
implements
AndroidStudio
{
...
...
packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart
View file @
80a4f9b1
...
@@ -230,7 +230,4 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
...
@@ -230,7 +230,4 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
@override
@override
final
Directory
directory
;
final
Directory
directory
;
@override
String
?
get
javaHome
=>
'java'
;
}
}
packages/flutter_tools/test/general.shard/analytics_test.dart
View file @
80a4f9b1
...
@@ -389,8 +389,6 @@ class FakeDoctor extends Fake implements Doctor {
...
@@ -389,8 +389,6 @@ class FakeDoctor extends Fake implements Doctor {
}
}
}
}
class
FakeAndroidStudio
extends
Fake
implements
AndroidStudio
{}
class
FakeClock
extends
Fake
implements
SystemClock
{
class
FakeClock
extends
Fake
implements
SystemClock
{
List
<
int
>
times
=
<
int
>[];
List
<
int
>
times
=
<
int
>[];
...
...
packages/flutter_tools/test/general.shard/android/android_project_migration_test.dart
View file @
80a4f9b1
...
@@ -4,9 +4,9 @@
...
@@ -4,9 +4,9 @@
import
'package:file/file.dart'
;
import
'package:file/file.dart'
;
import
'package:file/memory.dart'
;
import
'package:file/memory.dart'
;
import
'package:flutter_tools/src/android/android_sdk.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/gradle_utils.dart'
;
import
'package:flutter_tools/src/android/gradle_utils.dart'
;
import
'package:flutter_tools/src/android/java.dart'
;
import
'package:flutter_tools/src/android/migrations/android_studio_java_gradle_conflict_migration.dart'
;
import
'package:flutter_tools/src/android/migrations/android_studio_java_gradle_conflict_migration.dart'
;
import
'package:flutter_tools/src/android/migrations/top_level_gradle_build_file_migration.dart'
;
import
'package:flutter_tools/src/android/migrations/top_level_gradle_build_file_migration.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
...
@@ -19,6 +19,7 @@ import 'package:test/fake.dart';
...
@@ -19,6 +19,7 @@ import 'package:test/fake.dart';
import
'../../src/common.dart'
;
import
'../../src/common.dart'
;
import
'../../src/context.dart'
;
import
'../../src/context.dart'
;
import
'../../src/fakes.dart'
;
const
String
otherGradleVersionWrapper
=
r''
'
const
String
otherGradleVersionWrapper
=
r''
'
distributionBase=GRADLE_USER_HOME
distributionBase=GRADLE_USER_HOME
...
@@ -46,6 +47,9 @@ zipStorePath=wrapper/dists
...
@@ -46,6 +47,9 @@ zipStorePath=wrapper/dists
final
Version
androidStudioDolphin
=
Version
(
2021
,
3
,
1
);
final
Version
androidStudioDolphin
=
Version
(
2021
,
3
,
1
);
final
JavaVersion
_javaVersion17
=
JavaVersion
(
longText:
'openjdk 17.0.2'
,
number:
'17.0.2'
);
final
JavaVersion
_javaVersion16
=
JavaVersion
(
longText:
'openjdk 16.0.2'
,
number:
'16.0.2'
);
void
main
(
)
{
void
main
(
)
{
group
(
'Android migration'
,
()
{
group
(
'Android migration'
,
()
{
group
(
'migrate the Gradle "clean" task to lazy declaration'
,
()
{
group
(
'migrate the Gradle "clean" task to lazy declaration'
,
()
{
...
@@ -136,14 +140,10 @@ tasks.register("clean", Delete) {
...
@@ -136,14 +140,10 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'skipped if files are missing'
,
()
{
testWithoutContext
(
'skipped if files are missing'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeJava
(
version:
_javaVersion17
),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
androidStudio:
FakeAndroidStudio
(
version:
androidStudioDolphin
),
androidStudio:
FakeAndroidStudio
(
version:
androidStudioDolphin
),
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeAndroidSdk
(
javaVersion:
'17'
),
);
);
migration
.
migrate
();
migration
.
migrate
();
expect
(
gradleWrapperPropertiesFile
.
existsSync
(),
isFalse
);
expect
(
gradleWrapperPropertiesFile
.
existsSync
(),
isFalse
);
...
@@ -153,13 +153,9 @@ tasks.register("clean", Delete) {
...
@@ -153,13 +153,9 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'skipped if android studio is null'
,
()
{
testWithoutContext
(
'skipped if android studio is null'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeJava
(
version:
_javaVersion17
),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeAndroidSdk
(
javaVersion:
'17'
),
);
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
migration
.
migrate
();
migration
.
migrate
();
...
@@ -170,14 +166,10 @@ tasks.register("clean", Delete) {
...
@@ -170,14 +166,10 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'skipped if android studio version is null'
,
()
{
testWithoutContext
(
'skipped if android studio version is null'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeJava
(
version:
_javaVersion17
),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
androidStudio:
FakeAndroidStudio
(
version:
null
),
androidStudio:
FakeAndroidStudio
(
version:
null
),
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeAndroidSdk
(
javaVersion:
'17'
),
);
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
migration
.
migrate
();
migration
.
migrate
();
...
@@ -188,14 +180,10 @@ tasks.register("clean", Delete) {
...
@@ -188,14 +180,10 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'skipped if error is encountered in migrate()'
,
()
{
testWithoutContext
(
'skipped if error is encountered in migrate()'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeErroringJava
(),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeErroringAndroidSdk
(),
);
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
migration
.
migrate
();
migration
.
migrate
();
...
@@ -206,14 +194,10 @@ tasks.register("clean", Delete) {
...
@@ -206,14 +194,10 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'skipped if android studio version is less than flamingo'
,
()
{
testWithoutContext
(
'skipped if android studio version is less than flamingo'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeJava
(),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
androidStudio:
FakeAndroidStudio
(
version:
androidStudioDolphin
),
androidStudio:
FakeAndroidStudio
(
version:
androidStudioDolphin
),
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeAndroidSdk
(
javaVersion:
'17'
),
);
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
migration
.
migrate
();
migration
.
migrate
();
...
@@ -223,14 +207,10 @@ tasks.register("clean", Delete) {
...
@@ -223,14 +207,10 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'skipped if bundled java version is less than 17'
,
()
{
testWithoutContext
(
'skipped if bundled java version is less than 17'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeJava
(
version:
_javaVersion16
),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeAndroidSdk
(
javaVersion:
'16'
),
);
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
migration
.
migrate
();
migration
.
migrate
();
...
@@ -241,14 +221,10 @@ tasks.register("clean", Delete) {
...
@@ -241,14 +221,10 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'nothing is changed if gradle version not one that was '
testWithoutContext
(
'nothing is changed if gradle version not one that was '
'used by flutter create'
,
()
{
'used by flutter create'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeJava
(
version:
_javaVersion17
),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeAndroidSdk
(
javaVersion:
'17'
),
);
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
otherGradleVersionWrapper
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
otherGradleVersionWrapper
);
migration
.
migrate
();
migration
.
migrate
();
...
@@ -259,14 +235,10 @@ tasks.register("clean", Delete) {
...
@@ -259,14 +235,10 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'change is made with one of the specific gradle versions'
testWithoutContext
(
'change is made with one of the specific gradle versions'
' we migrate for'
,
()
{
' we migrate for'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeJava
(
version:
_javaVersion17
),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeAndroidSdk
(
javaVersion:
'17'
),
);
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
);
migration
.
migrate
();
migration
.
migrate
();
...
@@ -278,14 +250,10 @@ tasks.register("clean", Delete) {
...
@@ -278,14 +250,10 @@ tasks.register("clean", Delete) {
testWithoutContext
(
'change is not made when opt out flag is set'
,
()
{
testWithoutContext
(
'change is not made when opt out flag is set'
,
()
{
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
final
AndroidStudioJavaGradleConflictMigration
migration
=
AndroidStudioJavaGradleConflictMigration
(
java:
FakeJava
(
version:
_javaVersion17
),
bufferLogger
,
bufferLogger
,
project:
project
,
project:
project
,
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
androidStudio:
FakeAndroidStudio
(
version:
androidStudioFlamingo
),
fileSystem:
FakeFileSystem
(),
processUtils:
FakeProcessUtils
(),
platform:
FakePlatform
(),
os:
FakeOperatingSystemUtils
(),
androidSdk:
FakeAndroidSdk
(
javaVersion:
'17'
),
);
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
+
optOutFlag
);
gradleWrapperPropertiesFile
.
writeAsStringSync
(
gradleWrapperToMigrate
+
optOutFlag
);
migration
.
migrate
();
migration
.
migrate
();
...
@@ -314,37 +282,10 @@ class FakeAndroidStudio extends Fake implements AndroidStudio {
...
@@ -314,37 +282,10 @@ class FakeAndroidStudio extends Fake implements AndroidStudio {
Version
?
get
version
=>
_version
;
Version
?
get
version
=>
_version
;
}
}
class
FakeAndroidSdk
extends
Fake
implements
AndroidSdk
{
class
FakeErroringJava
extends
FakeJava
{
FakeAndroidSdk
({
required
String
javaVersion
})
{
_javaVersion
=
javaVersion
;
}
late
String
_javaVersion
;
@override
String
?
getJavaVersion
({
required
AndroidStudio
?
androidStudio
,
required
FileSystem
fileSystem
,
required
OperatingSystemUtils
operatingSystemUtils
,
required
Platform
platform
,
required
ProcessUtils
processUtils
,
})
{
return
_javaVersion
;
}
}
class
FakeErroringAndroidSdk
extends
Fake
implements
AndroidSdk
{
FakeErroringAndroidSdk
();
@override
@override
String
?
getJavaVersion
({
JavaVersion
get
version
{
required
AndroidStudio
?
androidStudio
,
throw
Exception
(
'How did this happen?'
);
required
FileSystem
fileSystem
,
required
OperatingSystemUtils
operatingSystemUtils
,
required
Platform
platform
,
required
ProcessUtils
processUtils
,
})
{
throw
const
FileSystemException
();
}
}
}
}
...
...
packages/flutter_tools/test/general.shard/android/android_sdk_test.dart
View file @
80a4f9b1
...
@@ -5,19 +5,16 @@
...
@@ -5,19 +5,16 @@
import
'package:file/memory.dart'
;
import
'package:file/memory.dart'
;
import
'package:flutter_tools/src/android/android_sdk.dart'
;
import
'package:flutter_tools/src/android/android_sdk.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/java.dart'
;
import
'package:flutter_tools/src/base/config.dart'
;
import
'package:flutter_tools/src/base/config.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/os.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:flutter_tools/src/base/process.dart'
;
import
'package:flutter_tools/src/globals.dart'
as
globals
;
import
'package:flutter_tools/src/globals.dart'
as
globals
;
import
'package:test/fake.dart'
;
import
'package:test/fake.dart'
;
import
'../../integration.shard/test_utils.dart'
;
import
'../../src/common.dart'
;
import
'../../src/common.dart'
;
import
'../../src/context.dart'
;
import
'../../src/context.dart'
;
import
'../../src/fakes.dart'
show
FakeAndroidStudio
,
FakeOperatingSystemUtils
;
void
main
(
)
{
void
main
(
)
{
late
MemoryFileSystem
fileSystem
;
late
MemoryFileSystem
fileSystem
;
...
@@ -354,18 +351,18 @@ void main() {
...
@@ -354,18 +351,18 @@ void main() {
final
String
androidStudioBundledJdkHome
=
globals
.
androidStudio
!.
javaPath
!;
final
String
androidStudioBundledJdkHome
=
globals
.
androidStudio
!.
javaPath
!;
final
String
expectedJavaBinaryPath
=
globals
.
fs
.
path
.
join
(
androidStudioBundledJdkHome
,
'bin'
,
'java'
);
final
String
expectedJavaBinaryPath
=
globals
.
fs
.
path
.
join
(
androidStudioBundledJdkHome
,
'bin'
,
'java'
);
final
String
?
foundJavaBinaryPath
=
AndroidSdk
.
findJavaBinary
(
final
String
?
foundJavaBinaryPath
=
Java
.
find
(
logger:
globals
.
logger
,
androidStudio:
globals
.
androidStudio
,
androidStudio:
globals
.
androidStudio
,
fileSystem:
globals
.
fs
,
fileSystem:
globals
.
fs
,
operatingSystemUtils:
globals
.
os
,
platform:
globals
.
platform
,
platform:
globals
.
platform
,
);
processManager:
globals
.
processManager
,
)?.
binaryPath
;
expect
(
foundJavaBinaryPath
,
expectedJavaBinaryPath
);
expect
(
foundJavaBinaryPath
,
expectedJavaBinaryPath
);
},
overrides:
<
Type
,
Generator
>{
},
overrides:
<
Type
,
Generator
>{
FileSystem:
()
=>
MemoryFileSystem
.
test
(),
FileSystem:
()
=>
MemoryFileSystem
.
test
(),
ProcessManager:
()
=>
FakeProcessManager
.
any
(),
ProcessManager:
()
=>
FakeProcessManager
.
any
(),
OperatingSystemUtils:
()
=>
FakeOperatingSystemUtilsWithJava
(),
Platform:
()
=>
FakePlatform
(),
Platform:
()
=>
FakePlatform
(),
Config:
()
=>
Config
,
Config:
()
=>
Config
,
AndroidStudio:
()
=>
FakeAndroidStudioWithJdk
(),
AndroidStudio:
()
=>
FakeAndroidStudioWithJdk
(),
...
@@ -374,18 +371,18 @@ void main() {
...
@@ -374,18 +371,18 @@ void main() {
testUsingContext
(
'returns the current value of JAVA_HOME if it is set and the JDK bundled with Android Studio could not be found'
,
()
{
testUsingContext
(
'returns the current value of JAVA_HOME if it is set and the JDK bundled with Android Studio could not be found'
,
()
{
final
String
expectedJavaBinaryPath
=
globals
.
fs
.
path
.
join
(
'java-home-path'
,
'bin'
,
'java'
);
final
String
expectedJavaBinaryPath
=
globals
.
fs
.
path
.
join
(
'java-home-path'
,
'bin'
,
'java'
);
final
String
?
foundJavaBinaryPath
=
AndroidSdk
.
findJavaBinary
(
final
String
?
foundJavaBinaryPath
=
Java
.
find
(
logger:
globals
.
logger
,
androidStudio:
globals
.
androidStudio
,
androidStudio:
globals
.
androidStudio
,
fileSystem:
globals
.
fs
,
fileSystem:
globals
.
fs
,
operatingSystemUtils:
globals
.
os
,
platform:
globals
.
platform
,
platform:
globals
.
platform
,
);
processManager:
globals
.
processManager
,
)?.
binaryPath
;
expect
(
foundJavaBinaryPath
,
expectedJavaBinaryPath
);
expect
(
foundJavaBinaryPath
,
expectedJavaBinaryPath
);
},
overrides:
<
Type
,
Generator
>{
},
overrides:
<
Type
,
Generator
>{
FileSystem:
()
=>
MemoryFileSystem
.
test
(),
FileSystem:
()
=>
MemoryFileSystem
.
test
(),
ProcessManager:
()
=>
FakeProcessManager
.
any
(),
ProcessManager:
()
=>
FakeProcessManager
.
empty
(),
OperatingSystemUtils:
()
=>
FakeOperatingSystemUtilsWithJava
(),
Platform:
()
=>
FakePlatform
(
environment:
<
String
,
String
>{
Platform:
()
=>
FakePlatform
(
environment:
<
String
,
String
>{
AndroidSdk
.
javaHomeEnvironmentVariable
:
'java-home-path'
,
AndroidSdk
.
javaHomeEnvironmentVariable
:
'java-home-path'
,
}),
}),
...
@@ -394,168 +391,54 @@ void main() {
...
@@ -394,168 +391,54 @@ void main() {
});
});
testUsingContext
(
'returns the java binary found on PATH if no other can be found'
,
()
{
testUsingContext
(
'returns the java binary found on PATH if no other can be found'
,
()
{
final
String
?
foundJavaBinaryPath
=
AndroidSdk
.
findJavaBinary
(
final
String
?
foundJavaBinaryPath
=
Java
.
find
(
logger:
globals
.
logger
,
androidStudio:
globals
.
androidStudio
,
androidStudio:
globals
.
androidStudio
,
fileSystem:
globals
.
fs
,
fileSystem:
globals
.
fs
,
operatingSystemUtils:
globals
.
os
,
platform:
globals
.
platform
,
platform:
globals
.
platform
,
);
processManager:
globals
.
processManager
,
)?.
binaryPath
;
expect
(
foundJavaBinaryPath
,
globals
.
os
.
which
(
'java'
)!.
path
);
expect
(
foundJavaBinaryPath
,
'java'
);
},
overrides:
<
Type
,
Generator
>{
},
overrides:
<
Type
,
Generator
>{
Logger:
()
=>
BufferLogger
.
test
(),
FileSystem:
()
=>
MemoryFileSystem
.
test
(),
FileSystem:
()
=>
MemoryFileSystem
.
test
(),
ProcessManager:
()
=>
FakeProcessManager
.
any
(),
ProcessManager:
()
=>
FakeProcessManager
.
list
(<
FakeCommand
>[
OperatingSystemUtils:
()
=>
FakeOperatingSystemUtilsWithJava
(),
const
FakeCommand
(
command:
<
String
>[
'which'
,
'java'
],
stdout:
'java'
,
),
]),
Platform:
()
=>
FakePlatform
(),
Platform:
()
=>
FakePlatform
(),
Config:
()
=>
Config
,
Config:
()
=>
Config
,
AndroidStudio:
()
=>
FakeAndroidStudioWithoutJdk
(),
AndroidStudio:
()
=>
FakeAndroidStudioWithoutJdk
(),
});
});
testUsingContext
(
'returns null if no java binary could be found'
,
()
{
testUsingContext
(
'returns null if no java binary could be found'
,
()
{
final
String
?
foundJavaBinaryPath
=
AndroidSdk
.
findJavaBinary
(
final
String
?
foundJavaBinaryPath
=
Java
.
find
(
logger:
globals
.
logger
,
androidStudio:
globals
.
androidStudio
,
androidStudio:
globals
.
androidStudio
,
fileSystem:
globals
.
fs
,
fileSystem:
globals
.
fs
,
operatingSystemUtils:
globals
.
os
,
platform:
globals
.
platform
,
platform:
globals
.
platform
,
);
processManager:
globals
.
processManager
,
)?.
binaryPath
;
expect
(
foundJavaBinaryPath
,
null
);
expect
(
foundJavaBinaryPath
,
null
);
},
overrides:
<
Type
,
Generator
>{
},
overrides:
<
Type
,
Generator
>{
Logger:
()
=>
BufferLogger
.
test
(),
FileSystem:
()
=>
MemoryFileSystem
.
test
(),
FileSystem:
()
=>
MemoryFileSystem
.
test
(),
ProcessManager:
()
=>
FakeProcessManager
.
any
(),
ProcessManager:
()
=>
FakeProcessManager
.
list
(<
FakeCommand
>[
OperatingSystemUtils:
()
=>
FakeOperatingSystemUtilsWithoutJava
(),
const
FakeCommand
(
command:
<
String
>[
'which'
,
'java'
],
exitCode:
1
,
),
]),
Platform:
()
=>
FakePlatform
(),
Platform:
()
=>
FakePlatform
(),
Config:
()
=>
Config
,
Config:
()
=>
Config
,
AndroidStudio:
()
=>
FakeAndroidStudioWithoutJdk
(),
AndroidStudio:
()
=>
FakeAndroidStudioWithoutJdk
(),
});
});
});
});
});
});
group
(
'java version'
,
()
{
const
String
exampleJdk8Output
=
'''
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b10, mixed mode)
'''
;
// Example strings came from actual terminal output.
testWithoutContext
(
'parses jdk 8'
,
()
{
expect
(
AndroidSdk
.
parseJavaVersion
(
exampleJdk8Output
),
'1.8.0'
);
});
testWithoutContext
(
'parses jdk 11 windows'
,
()
{
const
String
exampleJdkOutput
=
'''
java version "11.0.14"
Java(TM) SE Runtime Environment (build 11.0.14+10-b13)
Java HotSpot(TM) 64-Bit Server VM (build 11.0.14+10-b13, mixed mode)
'''
;
expect
(
AndroidSdk
.
parseJavaVersion
(
exampleJdkOutput
),
'11.0.14'
);
});
testWithoutContext
(
'parses jdk 11 mac/linux'
,
()
{
const
String
exampleJdkOutput
=
'''
openjdk version "11.0.18" 2023-01-17 LTS
OpenJDK Runtime Environment Zulu11.62+17-CA (build 11.0.18+10-LTS)
OpenJDK 64-Bit Server VM Zulu11.62+17-CA (build 11.0.18+10-LTS, mixed mode)
'''
;
expect
(
AndroidSdk
.
parseJavaVersion
(
exampleJdkOutput
),
'11.0.18'
);
});
testWithoutContext
(
'parses jdk 17'
,
()
{
const
String
exampleJdkOutput
=
'''
openjdk 17.0.6 2023-01-17
OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b802.4-9586694)
OpenJDK 64-Bit Server VM (build 17.0.6+0-17.0.6b802.4-9586694, mixed mode)
'''
;
expect
(
AndroidSdk
.
parseJavaVersion
(
exampleJdkOutput
),
'17.0.6'
);
});
testWithoutContext
(
'parses jdk 19'
,
()
{
const
String
exampleJdkOutput
=
'''
openjdk 19.0.2 2023-01-17
OpenJDK Runtime Environment Homebrew (build 19.0.2)
OpenJDK 64-Bit Server VM Homebrew (build 19.0.2, mixed mode, sharing)
'''
;
expect
(
AndroidSdk
.
parseJavaVersion
(
exampleJdkOutput
),
'19.0.2'
);
});
// https://chrome-infra-packages.appspot.com/p/flutter/java/openjdk/
testWithoutContext
(
'parses jdk output from ci'
,
()
{
const
String
exampleJdkOutput
=
'''
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
'''
;
expect
(
AndroidSdk
.
parseJavaVersion
(
exampleJdkOutput
),
'11.0.2'
);
});
testWithoutContext
(
'parses jdk two number versions'
,
()
{
const
String
exampleJdkOutput
=
'openjdk 19.0 2023-01-17'
;
expect
(
AndroidSdk
.
parseJavaVersion
(
exampleJdkOutput
),
'19.0'
);
});
testUsingContext
(
'getJavaBinary with AS install'
,
()
{
final
Directory
sdkDir
=
createSdkDirectory
(
fileSystem:
fileSystem
);
config
.
setValue
(
'android-sdk'
,
sdkDir
.
path
);
final
AndroidStudio
androidStudio
=
FakeAndroidStudio
();
final
String
javaPath
=
AndroidSdk
.
findJavaBinary
(
androidStudio:
androidStudio
,
fileSystem:
fileSystem
,
operatingSystemUtils:
FakeOperatingSystemUtils
(),
platform:
platform
)!;
// Built from the implementation of findJavaBinary android studio case.
final
String
expectedJavaPath
=
'
${androidStudio.javaPath}
/bin/java'
;
expect
(
javaPath
,
expectedJavaPath
);
},
overrides:
<
Type
,
Generator
>{
FileSystem:
()
=>
fileSystem
,
ProcessManager:
()
=>
processManager
,
Config:
()
=>
config
,
Platform:
()
=>
FakePlatform
(
environment:
<
String
,
String
>{}),
});
group
(
'java'
,
()
{
late
AndroidStudio
androidStudio
;
setUp
(()
{
androidStudio
=
FakeAndroidStudio
();
});
testUsingContext
(
'getJavaVersion finds AS java and parses version'
,
()
{
final
Directory
sdkDir
=
createSdkDirectory
(
fileSystem:
fileSystem
);
config
.
setValue
(
'android-sdk'
,
sdkDir
.
path
);
final
ProcessUtils
processUtils
=
ProcessUtils
(
processManager:
processManager
,
logger:
BufferLogger
.
test
());
// Built from the implementation of findJavaBinary android studio case.
final
String
expectedJavaPath
=
'
${androidStudio.javaPath}
/bin/java'
;
processManager
.
addCommand
(
FakeCommand
(
command:
<
String
>[
expectedJavaPath
,
'--version'
,
],
stdout:
exampleJdk8Output
,
));
final
AndroidSdk
sdk
=
AndroidSdk
.
locateAndroidSdk
()!;
final
String
?
javaVersion
=
sdk
.
getJavaVersion
(
androidStudio:
androidStudio
,
fileSystem:
fileSystem
,
operatingSystemUtils:
FakeOperatingSystemUtils
(),
platform:
FakePlatform
(),
processUtils:
processUtils
,
);
expect
(
javaVersion
,
'1.8.0'
);
},
overrides:
<
Type
,
Generator
>{
FileSystem:
()
=>
fileSystem
,
ProcessManager:
()
=>
processManager
,
AndroidStudio:
()
=>
androidStudio
,
Config:
()
=>
config
,
Platform:
()
=>
FakePlatform
(
environment:
<
String
,
String
>{}),
});
});
});
}
}
/// A broken SDK installation.
/// A broken SDK installation.
...
@@ -646,20 +529,3 @@ class FakeAndroidStudioWithoutJdk extends Fake implements AndroidStudio {
...
@@ -646,20 +529,3 @@ class FakeAndroidStudioWithoutJdk extends Fake implements AndroidStudio {
@override
@override
String
?
get
javaPath
=>
null
;
String
?
get
javaPath
=>
null
;
}
}
class
FakeOperatingSystemUtilsWithJava
extends
Fake
implements
OperatingSystemUtils
{
@override
File
?
which
(
String
execName
)
{
if
(
execName
==
'java'
)
{
return
globals
.
fs
.
file
(
'/fake/which/java/path'
);
}
return
null
;
}
}
class
FakeOperatingSystemUtilsWithoutJava
extends
Fake
implements
OperatingSystemUtils
{
@override
File
?
which
(
String
execName
)
{
return
null
;
}
}
packages/flutter_tools/test/general.shard/android/android_workflow_test.dart
View file @
80a4f9b1
...
@@ -122,6 +122,7 @@ void main() {
...
@@ -122,6 +122,7 @@ void main() {
sdk
.
sdkManagerPath
=
'/foo/bar/sdkmanager'
;
sdk
.
sdkManagerPath
=
'/foo/bar/sdkmanager'
;
processManager
.
excludedExecutables
.
add
(
'/foo/bar/sdkmanager'
);
processManager
.
excludedExecutables
.
add
(
'/foo/bar/sdkmanager'
);
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -130,7 +131,6 @@ void main() {
...
@@ -130,7 +131,6 @@ void main() {
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
final
LicensesAccepted
licenseStatus
=
await
licenseValidator
.
licensesAccepted
;
final
LicensesAccepted
licenseStatus
=
await
licenseValidator
.
licensesAccepted
;
...
@@ -141,6 +141,7 @@ void main() {
...
@@ -141,6 +141,7 @@ void main() {
sdk
.
sdkManagerPath
=
'/foo/bar/sdkmanager'
;
sdk
.
sdkManagerPath
=
'/foo/bar/sdkmanager'
;
processManager
.
excludedExecutables
.
add
(
'/foo/bar/sdkmanager'
);
processManager
.
excludedExecutables
.
add
(
'/foo/bar/sdkmanager'
);
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -149,7 +150,6 @@ void main() {
...
@@ -149,7 +150,6 @@ void main() {
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
final
LicensesAccepted
licenseStatus
=
await
licenseValidator
.
licensesAccepted
;
final
LicensesAccepted
licenseStatus
=
await
licenseValidator
.
licensesAccepted
;
...
@@ -165,6 +165,7 @@ void main() {
...
@@ -165,6 +165,7 @@ void main() {
],
stdout:
'asdasassad'
,
],
stdout:
'asdasassad'
,
));
));
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -173,7 +174,6 @@ void main() {
...
@@ -173,7 +174,6 @@ void main() {
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
final
LicensesAccepted
result
=
await
licenseValidator
.
licensesAccepted
;
final
LicensesAccepted
result
=
await
licenseValidator
.
licensesAccepted
;
...
@@ -194,6 +194,7 @@ All SDK package licenses accepted.
...
@@ -194,6 +194,7 @@ All SDK package licenses accepted.
));
));
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -202,7 +203,6 @@ All SDK package licenses accepted.
...
@@ -202,7 +203,6 @@ All SDK package licenses accepted.
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
final
LicensesAccepted
result
=
await
licenseValidator
.
licensesAccepted
;
final
LicensesAccepted
result
=
await
licenseValidator
.
licensesAccepted
;
...
@@ -224,6 +224,7 @@ Review licenses that have not been accepted (y/N)?
...
@@ -224,6 +224,7 @@ Review licenses that have not been accepted (y/N)?
));
));
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -232,7 +233,6 @@ Review licenses that have not been accepted (y/N)?
...
@@ -232,7 +233,6 @@ Review licenses that have not been accepted (y/N)?
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
final
LicensesAccepted
result
=
await
licenseValidator
.
licensesAccepted
;
final
LicensesAccepted
result
=
await
licenseValidator
.
licensesAccepted
;
...
@@ -254,6 +254,7 @@ Review licenses that have not been accepted (y/N)?
...
@@ -254,6 +254,7 @@ Review licenses that have not been accepted (y/N)?
));
));
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -262,7 +263,6 @@ Review licenses that have not been accepted (y/N)?
...
@@ -262,7 +263,6 @@ Review licenses that have not been accepted (y/N)?
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
final
LicensesAccepted
result
=
await
licenseValidator
.
licensesAccepted
;
final
LicensesAccepted
result
=
await
licenseValidator
.
licensesAccepted
;
...
@@ -280,6 +280,7 @@ Review licenses that have not been accepted (y/N)?
...
@@ -280,6 +280,7 @@ Review licenses that have not been accepted (y/N)?
));
));
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -288,7 +289,6 @@ Review licenses that have not been accepted (y/N)?
...
@@ -288,7 +289,6 @@ Review licenses that have not been accepted (y/N)?
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
expect
(
await
licenseValidator
.
runLicenseManager
(),
isTrue
);
expect
(
await
licenseValidator
.
runLicenseManager
(),
isTrue
);
...
@@ -299,6 +299,7 @@ Review licenses that have not been accepted (y/N)?
...
@@ -299,6 +299,7 @@ Review licenses that have not been accepted (y/N)?
processManager
.
excludedExecutables
.
add
(
'/foo/bar/sdkmanager'
);
processManager
.
excludedExecutables
.
add
(
'/foo/bar/sdkmanager'
);
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -307,7 +308,6 @@ Review licenses that have not been accepted (y/N)?
...
@@ -307,7 +308,6 @@ Review licenses that have not been accepted (y/N)?
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
expect
(
licenseValidator
.
runLicenseManager
(),
throwsToolExit
());
expect
(
licenseValidator
.
runLicenseManager
(),
throwsToolExit
());
...
@@ -328,6 +328,7 @@ Review licenses that have not been accepted (y/N)?
...
@@ -328,6 +328,7 @@ Review licenses that have not been accepted (y/N)?
final
BufferLogger
logger
=
BufferLogger
.
test
();
final
BufferLogger
logger
=
BufferLogger
.
test
();
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -336,7 +337,6 @@ Review licenses that have not been accepted (y/N)?
...
@@ -336,7 +337,6 @@ Review licenses that have not been accepted (y/N)?
logger:
logger
,
logger:
logger
,
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
await
licenseValidator
.
runLicenseManager
();
await
licenseValidator
.
runLicenseManager
();
...
@@ -349,6 +349,7 @@ Review licenses that have not been accepted (y/N)?
...
@@ -349,6 +349,7 @@ Review licenses that have not been accepted (y/N)?
processManager
.
excludedExecutables
.
add
(
'/foo/bar/sdkmanager'
);
processManager
.
excludedExecutables
.
add
(
'/foo/bar/sdkmanager'
);
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -357,7 +358,6 @@ Review licenses that have not been accepted (y/N)?
...
@@ -357,7 +358,6 @@ Review licenses that have not been accepted (y/N)?
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
expect
(
licenseValidator
.
runLicenseManager
(),
throwsToolExit
());
expect
(
licenseValidator
.
runLicenseManager
(),
throwsToolExit
());
...
@@ -376,6 +376,7 @@ Review licenses that have not been accepted (y/N)?
...
@@ -376,6 +376,7 @@ Review licenses that have not been accepted (y/N)?
);
);
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
final
AndroidLicenseValidator
licenseValidator
=
AndroidLicenseValidator
(
java:
FakeJava
(),
androidSdk:
sdk
,
androidSdk:
sdk
,
fileSystem:
fileSystem
,
fileSystem:
fileSystem
,
processManager:
processManager
,
processManager:
processManager
,
...
@@ -384,7 +385,6 @@ Review licenses that have not been accepted (y/N)?
...
@@ -384,7 +385,6 @@ Review licenses that have not been accepted (y/N)?
logger:
logger
,
logger:
logger
,
userMessages:
UserMessages
(),
userMessages:
UserMessages
(),
androidStudio:
FakeAndroidStudio
(),
androidStudio:
FakeAndroidStudio
(),
operatingSystemUtils:
FakeOperatingSystemUtils
(),
);
);
await
expectLater
(
await
expectLater
(
...
@@ -620,9 +620,6 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
...
@@ -620,9 +620,6 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
@override
@override
List
<
String
>
validateSdkWellFormed
()
=>
<
String
>[];
List
<
String
>
validateSdkWellFormed
()
=>
<
String
>[];
@override
Map
<
String
,
String
>
get
sdkManagerEnv
=>
<
String
,
String
>{};
}
}
class
FakeAndroidSdkVersion
extends
Fake
implements
AndroidSdkVersion
{
class
FakeAndroidSdkVersion
extends
Fake
implements
AndroidSdkVersion
{
...
...
packages/flutter_tools/test/general.shard/android/java_test.dart
0 → 100644
View file @
80a4f9b1
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'package:file/memory.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/java.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/os.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:test/fake.dart'
;
import
'package:webdriver/async_io.dart'
;
import
'../../integration.shard/test_utils.dart'
;
import
'../../src/common.dart'
;
import
'../../src/context.dart'
;
import
'../../src/fakes.dart'
;
void
main
(
)
{
late
Logger
logger
;
late
FileSystem
fs
;
late
Platform
platform
;
late
FakeProcessManager
processManager
;
setUp
(()
{
logger
=
BufferLogger
.
test
();
fs
=
MemoryFileSystem
.
test
();
platform
=
FakePlatform
(
environment:
<
String
,
String
>{
'PATH'
:
''
,
});
processManager
=
FakeProcessManager
.
empty
();
});
group
(
Java
,
()
{
group
(
'find'
,
()
{
testWithoutContext
(
'finds the JDK bundled with Android Studio, if it exists'
,
()
{
final
AndroidStudio
androidStudio
=
_FakeAndroidStudioWithJdk
();
final
String
androidStudioBundledJdkHome
=
androidStudio
.
javaPath
!;
final
String
expectedJavaBinaryPath
=
fs
.
path
.
join
(
androidStudioBundledJdkHome
,
'bin'
,
'java'
);
processManager
.
addCommand
(
FakeCommand
(
command:
<
String
>[
expectedJavaBinaryPath
,
'--version'
,
],
stdout:
'''
openjdk 19.0.2 2023-01-17
OpenJDK Runtime Environment Zulu19.32+15-CA (build 19.0.2+7)
OpenJDK 64-Bit Server VM Zulu19.32+15-CA (build 19.0.2+7, mixed mode, sharing)
'''
));
final
Java
java
=
Java
.
find
(
androidStudio:
androidStudio
,
logger:
logger
,
fileSystem:
fs
,
platform:
platform
,
processManager:
processManager
,
)!;
final
JavaVersion
version
=
java
.
version
!;
expect
(
java
.
javaHome
,
androidStudioBundledJdkHome
);
expect
(
java
.
binaryPath
,
expectedJavaBinaryPath
);
expect
(
version
.
longText
,
'OpenJDK Runtime Environment Zulu19.32+15-CA (build 19.0.2+7)'
);
expect
(
version
.
number
,
'19.0.2'
);
});
testWithoutContext
(
'finds JAVA_HOME if it is set and the JDK bundled with Android Studio could not be found'
,
()
{
final
AndroidStudio
androidStudio
=
_FakeAndroidStudioWithoutJdk
();
const
String
javaHome
=
'/java/home'
;
final
String
expectedJavaBinaryPath
=
fs
.
path
.
join
(
javaHome
,
'bin'
,
'java'
);
final
Java
java
=
Java
.
find
(
androidStudio:
androidStudio
,
logger:
logger
,
fileSystem:
fs
,
platform:
FakePlatform
(
environment:
<
String
,
String
>{
'JAVA_HOME'
:
javaHome
,
}),
processManager:
processManager
,
)!;
expect
(
java
.
javaHome
,
javaHome
);
expect
(
java
.
binaryPath
,
expectedJavaBinaryPath
);
});
testWithoutContext
(
'returns the java binary found on PATH if no other can be found'
,
()
{
final
AndroidStudio
androidStudio
=
_FakeAndroidStudioWithoutJdk
();
final
OperatingSystemUtils
os
=
_FakeOperatingSystemUtilsWithJava
(
fileSystem
);
processManager
.
addCommand
(
const
FakeCommand
(
command:
<
String
>[
'which'
,
'java'
],
stdout:
'/fake/which/java/path'
,
),
);
final
Java
java
=
Java
.
find
(
androidStudio:
androidStudio
,
logger:
logger
,
fileSystem:
fs
,
platform:
platform
,
processManager:
processManager
,
)!;
expect
(
java
.
javaHome
,
isNull
);
expect
(
java
.
binaryPath
,
os
.
which
(
'java'
)!.
path
);
});
testWithoutContext
(
'returns null if no java could be found'
,
()
{
final
AndroidStudio
androidStudio
=
_FakeAndroidStudioWithoutJdk
();
processManager
.
addCommand
(
const
FakeCommand
(
command:
<
String
>[
'which'
,
'java'
],
exitCode:
1
,
),
);
final
Java
?
java
=
Java
.
find
(
androidStudio:
androidStudio
,
logger:
logger
,
fileSystem:
fs
,
platform:
platform
,
processManager:
processManager
,
);
expect
(
java
,
isNull
);
});
});
group
(
'getVersionString'
,
()
{
late
Java
java
;
setUp
(()
{
processManager
=
FakeProcessManager
.
empty
();
java
=
Java
(
fileSystem:
fs
,
logger:
logger
,
os:
FakeOperatingSystemUtils
(),
platform:
platform
,
processManager:
processManager
,
binaryPath:
'javaHome/bin/java'
,
javaHome:
'javaHome'
,
);
});
void
addJavaVersionCommand
(
String
output
)
{
processManager
.
addCommand
(
FakeCommand
(
command:
<
String
>[
java
.
binaryPath
,
'--version'
],
stdout:
output
,
),
);
}
testWithoutContext
(
'parses jdk 8'
,
()
{
addJavaVersionCommand
(
'''
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b10, mixed mode)
'''
);
final
JavaVersion
version
=
java
.
version
!;
expect
(
version
.
longText
,
'Java(TM) SE Runtime Environment (build 1.8.0_202-b10)'
);
expect
(
version
.
number
,
'1.8.0'
);
});
testWithoutContext
(
'parses jdk 11 windows'
,
()
{
addJavaVersionCommand
(
'''
java version "11.0.14"
Java(TM) SE Runtime Environment (build 11.0.14+10-b13)
Java HotSpot(TM) 64-Bit Server VM (build 11.0.14+10-b13, mixed mode)
'''
);
final
JavaVersion
version
=
java
.
version
!;
expect
(
version
.
longText
,
'Java(TM) SE Runtime Environment (build 11.0.14+10-b13)'
);
expect
(
version
.
number
,
'11.0.14'
);
});
testWithoutContext
(
'parses jdk 11 mac/linux'
,
()
{
addJavaVersionCommand
(
'''
openjdk version "11.0.18" 2023-01-17 LTS
OpenJDK Runtime Environment Zulu11.62+17-CA (build 11.0.18+10-LTS)
OpenJDK 64-Bit Server VM Zulu11.62+17-CA (build 11.0.18+10-LTS, mixed mode)
'''
);
final
JavaVersion
version
=
java
.
version
!;
expect
(
version
.
longText
,
'OpenJDK Runtime Environment Zulu11.62+17-CA (build 11.0.18+10-LTS)'
);
expect
(
version
.
number
,
'11.0.18'
);
});
testWithoutContext
(
'parses jdk 17'
,
()
{
addJavaVersionCommand
(
'''
openjdk 17.0.6 2023-01-17
OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b802.4-9586694)
OpenJDK 64-Bit Server VM (build 17.0.6+0-17.0.6b802.4-9586694, mixed mode)
'''
);
final
JavaVersion
version
=
java
.
version
!;
expect
(
version
.
longText
,
'OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b802.4-9586694)'
);
expect
(
version
.
number
,
'17.0.6'
);
});
testWithoutContext
(
'parses jdk 19'
,
()
{
addJavaVersionCommand
(
'''
openjdk 19.0.2 2023-01-17
OpenJDK Runtime Environment Homebrew (build 19.0.2)
OpenJDK 64-Bit Server VM Homebrew (build 19.0.2, mixed mode, sharing)
'''
);
final
JavaVersion
version
=
java
.
version
!;
expect
(
version
.
longText
,
'OpenJDK Runtime Environment Homebrew (build 19.0.2)'
);
expect
(
version
.
number
,
'19.0.2'
);
});
// https://chrome-infra-packages.appspot.com/p/flutter/java/openjdk/
testWithoutContext
(
'parses jdk output from ci'
,
()
{
addJavaVersionCommand
(
'''
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
'''
);
final
JavaVersion
version
=
java
.
version
!;
expect
(
version
.
longText
,
'OpenJDK Runtime Environment 18.9 (build 11.0.2+9)'
);
expect
(
version
.
number
,
'11.0.2'
);
});
testWithoutContext
(
'parses jdk two number versions'
,
()
{
addJavaVersionCommand
(
'openjdk 19.0 2023-01-17'
);
final
JavaVersion
version
=
java
.
version
!;
expect
(
version
.
longText
,
'openjdk 19.0 2023-01-17'
);
expect
(
version
.
number
,
'19.0'
);
});
});
});
}
class
_FakeAndroidStudioWithJdk
extends
Fake
implements
AndroidStudio
{
@override
String
?
get
javaPath
=>
'/fake/android_studio/java/path/'
;
}
class
_FakeAndroidStudioWithoutJdk
extends
Fake
implements
AndroidStudio
{
@override
String
?
get
javaPath
=>
null
;
}
class
_FakeOperatingSystemUtilsWithJava
extends
FakeOperatingSystemUtils
{
_FakeOperatingSystemUtilsWithJava
(
this
.
_fileSystem
);
final
FileSystem
_fileSystem
;
@override
File
?
which
(
String
execName
)
{
if
(
execName
==
'java'
)
{
return
_fileSystem
.
file
(
'/fake/which/java/path'
);
}
throw
const
InvalidArgumentException
(
null
,
null
);
}
}
packages/flutter_tools/test/general.shard/emulator_test.dart
View file @
80a4f9b1
...
@@ -67,6 +67,7 @@ void main() {
...
@@ -67,6 +67,7 @@ void main() {
testUsingContext
(
'getEmulators'
,
()
async
{
testUsingContext
(
'getEmulators'
,
()
async
{
// Test that EmulatorManager.getEmulators() doesn't throw.
// Test that EmulatorManager.getEmulators() doesn't throw.
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
java:
FakeJava
(),
fileSystem:
MemoryFileSystem
.
test
(),
fileSystem:
MemoryFileSystem
.
test
(),
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -89,6 +90,7 @@ void main() {
...
@@ -89,6 +90,7 @@ void main() {
testUsingContext
(
'getEmulators with no Android SDK'
,
()
async
{
testUsingContext
(
'getEmulators with no Android SDK'
,
()
async
{
// Test that EmulatorManager.getEmulators() doesn't throw when there's no Android SDK.
// Test that EmulatorManager.getEmulators() doesn't throw when there's no Android SDK.
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
java:
FakeJava
(),
fileSystem:
MemoryFileSystem
.
test
(),
fileSystem:
MemoryFileSystem
.
test
(),
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -109,6 +111,7 @@ void main() {
...
@@ -109,6 +111,7 @@ void main() {
testWithoutContext
(
'getEmulatorsById'
,
()
async
{
testWithoutContext
(
'getEmulatorsById'
,
()
async
{
final
TestEmulatorManager
testEmulatorManager
=
TestEmulatorManager
(
emulators
,
final
TestEmulatorManager
testEmulatorManager
=
TestEmulatorManager
(
emulators
,
java:
FakeJava
(),
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
processManager:
fakeProcessManager
,
processManager:
fakeProcessManager
,
androidWorkflow:
AndroidWorkflow
(
androidWorkflow:
AndroidWorkflow
(
...
@@ -129,6 +132,7 @@ void main() {
...
@@ -129,6 +132,7 @@ void main() {
testUsingContext
(
'create emulator with a missing avdmanager does not crash.'
,
()
async
{
testUsingContext
(
'create emulator with a missing avdmanager does not crash.'
,
()
async
{
sdk
.
avdManagerPath
=
null
;
sdk
.
avdManagerPath
=
null
;
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
java:
FakeJava
(),
fileSystem:
MemoryFileSystem
.
test
(),
fileSystem:
MemoryFileSystem
.
test
(),
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -152,6 +156,7 @@ void main() {
...
@@ -152,6 +156,7 @@ void main() {
// iOS discovery uses context.
// iOS discovery uses context.
testUsingContext
(
'create emulator with an empty name does not fail'
,
()
async
{
testUsingContext
(
'create emulator with an empty name does not fail'
,
()
async
{
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
java:
FakeJava
(),
fileSystem:
MemoryFileSystem
.
test
(),
fileSystem:
MemoryFileSystem
.
test
(),
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -191,6 +196,7 @@ void main() {
...
@@ -191,6 +196,7 @@ void main() {
testWithoutContext
(
'create emulator with a unique name does not throw'
,
()
async
{
testWithoutContext
(
'create emulator with a unique name does not throw'
,
()
async
{
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
java:
FakeJava
(),
fileSystem:
MemoryFileSystem
.
test
(),
fileSystem:
MemoryFileSystem
.
test
(),
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -227,6 +233,7 @@ void main() {
...
@@ -227,6 +233,7 @@ void main() {
testWithoutContext
(
'create emulator with an existing name errors'
,
()
async
{
testWithoutContext
(
'create emulator with an existing name errors'
,
()
async
{
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
java:
FakeJava
(),
fileSystem:
MemoryFileSystem
.
test
(),
fileSystem:
MemoryFileSystem
.
test
(),
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -266,6 +273,7 @@ void main() {
...
@@ -266,6 +273,7 @@ void main() {
// iOS discovery uses context.
// iOS discovery uses context.
testUsingContext
(
'create emulator without a name but when default exists adds a suffix'
,
()
async
{
testUsingContext
(
'create emulator without a name but when default exists adds a suffix'
,
()
async
{
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
final
EmulatorManager
emulatorManager
=
EmulatorManager
(
java:
FakeJava
(),
fileSystem:
MemoryFileSystem
.
test
(),
fileSystem:
MemoryFileSystem
.
test
(),
logger:
BufferLogger
.
test
(),
logger:
BufferLogger
.
test
(),
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
processManager:
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -342,6 +350,7 @@ void main() {
...
@@ -342,6 +350,7 @@ void main() {
class
TestEmulatorManager
extends
EmulatorManager
{
class
TestEmulatorManager
extends
EmulatorManager
{
TestEmulatorManager
(
this
.
allEmulators
,
{
TestEmulatorManager
(
this
.
allEmulators
,
{
required
super
.
java
,
required
super
.
logger
,
required
super
.
logger
,
required
super
.
processManager
,
required
super
.
processManager
,
required
super
.
androidWorkflow
,
required
super
.
androidWorkflow
,
...
@@ -393,7 +402,4 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
...
@@ -393,7 +402,4 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
@override
@override
String
getAvdPath
()
=>
'avd'
;
String
getAvdPath
()
=>
'avd'
;
@override
Map
<
String
,
String
>
get
sdkManagerEnv
=>
<
String
,
String
>{};
}
}
packages/flutter_tools/test/general.shard/project_test.dart
View file @
80a4f9b1
...
@@ -7,11 +7,10 @@ import 'package:file/memory.dart';
...
@@ -7,11 +7,10 @@ import 'package:file/memory.dart';
import
'package:flutter_tools/src/android/android_sdk.dart'
;
import
'package:flutter_tools/src/android/android_sdk.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/gradle_utils.dart'
as
gradle_utils
;
import
'package:flutter_tools/src/android/gradle_utils.dart'
as
gradle_utils
;
import
'package:flutter_tools/src/android/java.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/os.dart'
;
import
'package:flutter_tools/src/base/os.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:flutter_tools/src/base/process.dart'
;
import
'package:flutter_tools/src/build_info.dart'
;
import
'package:flutter_tools/src/build_info.dart'
;
import
'package:flutter_tools/src/cache.dart'
;
import
'package:flutter_tools/src/cache.dart'
;
import
'package:flutter_tools/src/convert.dart'
;
import
'package:flutter_tools/src/convert.dart'
;
...
@@ -407,9 +406,7 @@ void main() {
...
@@ -407,9 +406,7 @@ void main() {
});
});
group
(
'java gradle agp compatibility'
,
()
{
group
(
'java gradle agp compatibility'
,
()
{
Future
<
FlutterProject
?>
configureJavaGradleAgpForTest
(
Future
<
FlutterProject
?>
configureGradleAgpForTest
({
FakeAndroidSdkWithDir
androidSdk
,
{
required
String
javaV
,
required
String
gradleV
,
required
String
gradleV
,
required
String
agpV
,
required
String
agpV
,
})
async
{
})
async
{
...
@@ -422,7 +419,6 @@ dependencies {
...
@@ -422,7 +419,6 @@ dependencies {
'''
;
'''
;
});
});
addGradleWrapperFile
(
project
.
directory
,
gradleV
);
addGradleWrapperFile
(
project
.
directory
,
gradleV
);
androidSdk
.
javaVersion
=
javaV
;
return
project
;
return
project
;
}
}
...
@@ -431,22 +427,22 @@ dependencies {
...
@@ -431,22 +427,22 @@ dependencies {
// especially important for filesystem.
// especially important for filesystem.
group
(
'_'
,
()
{
group
(
'_'
,
()
{
final
FakeProcessManager
processManager
;
final
FakeProcessManager
processManager
;
final
Java
java
;
final
AndroidStudio
androidStudio
;
final
AndroidStudio
androidStudio
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
java
=
FakeJava
(
version:
JavaVersion
(
longText:
'17.0.2'
,
number:
'17.0.2'
));
processManager
=
FakeProcessManager
.
empty
();
processManager
=
FakeProcessManager
.
empty
();
androidStudio
=
FakeAndroidStudio
();
androidStudio
=
FakeAndroidStudio
();
androidSdk
=
androidSdk
=
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
,
androidStudio
);
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
);
fileSystem
.
currentDirectory
fileSystem
.
currentDirectory
.
childDirectory
(
androidStudio
.
javaPath
!)
.
childDirectory
(
androidStudio
.
javaPath
!)
.
createSync
();
.
createSync
();
_testInMemory
(
_testInMemory
(
'flamingo values are compatible'
,
'flamingo values are compatible'
,
()
async
{
()
async
{
final
FlutterProject
?
project
=
await
configureJavaGradleAgpForTest
(
final
FlutterProject
?
project
=
await
configureGradleAgpForTest
(
androidSdk
,
javaV:
'17.0.2'
,
gradleV:
'8.0'
,
gradleV:
'8.0'
,
agpV:
'7.4.2'
,
agpV:
'7.4.2'
,
);
);
...
@@ -454,6 +450,7 @@ dependencies {
...
@@ -454,6 +450,7 @@ dependencies {
await
project
!.
android
.
hasValidJavaGradleAgpVersions
();
await
project
!.
android
.
hasValidJavaGradleAgpVersions
();
expect
(
value
.
success
,
isTrue
);
expect
(
value
.
success
,
isTrue
);
},
},
java:
java
,
androidStudio:
androidStudio
,
androidStudio:
androidStudio
,
processManager:
processManager
,
processManager:
processManager
,
androidSdk:
androidSdk
,
androidSdk:
androidSdk
,
...
@@ -461,22 +458,22 @@ dependencies {
...
@@ -461,22 +458,22 @@ dependencies {
});
});
group
(
'_'
,
()
{
group
(
'_'
,
()
{
final
FakeProcessManager
processManager
;
final
FakeProcessManager
processManager
;
final
Java
java
;
final
AndroidStudio
androidStudio
;
final
AndroidStudio
androidStudio
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
java
=
FakeJava
(
version:
JavaVersion
(
longText:
'1.8.0_242'
,
number:
'1.8.0_242'
));
processManager
=
FakeProcessManager
.
empty
();
processManager
=
FakeProcessManager
.
empty
();
androidStudio
=
FakeAndroidStudio
();
androidStudio
=
FakeAndroidStudio
();
androidSdk
=
androidSdk
=
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
,
androidStudio
);
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
);
fileSystem
.
currentDirectory
fileSystem
.
currentDirectory
.
childDirectory
(
androidStudio
.
javaPath
!)
.
childDirectory
(
androidStudio
.
javaPath
!)
.
createSync
();
.
createSync
();
_testInMemory
(
_testInMemory
(
'java 8 era values are compatible'
,
'java 8 era values are compatible'
,
()
async
{
()
async
{
final
FlutterProject
?
project
=
await
configureJavaGradleAgpForTest
(
final
FlutterProject
?
project
=
await
configureGradleAgpForTest
(
androidSdk
,
javaV:
'1.8.0_242'
,
gradleV:
'6.7.1'
,
gradleV:
'6.7.1'
,
agpV:
'4.2.0'
,
agpV:
'4.2.0'
,
);
);
...
@@ -484,6 +481,7 @@ dependencies {
...
@@ -484,6 +481,7 @@ dependencies {
await
project
!.
android
.
hasValidJavaGradleAgpVersions
();
await
project
!.
android
.
hasValidJavaGradleAgpVersions
();
expect
(
value
.
success
,
isTrue
);
expect
(
value
.
success
,
isTrue
);
},
},
java:
java
,
androidStudio:
androidStudio
,
androidStudio:
androidStudio
,
processManager:
processManager
,
processManager:
processManager
,
androidSdk:
androidSdk
,
androidSdk:
androidSdk
,
...
@@ -492,22 +490,22 @@ dependencies {
...
@@ -492,22 +490,22 @@ dependencies {
group
(
'_'
,
()
{
group
(
'_'
,
()
{
final
FakeProcessManager
processManager
;
final
FakeProcessManager
processManager
;
final
Java
java
;
final
AndroidStudio
androidStudio
;
final
AndroidStudio
androidStudio
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
processManager
=
FakeProcessManager
.
empty
();
processManager
=
FakeProcessManager
.
empty
();
java
=
FakeJava
(
version:
JavaVersion
(
longText:
'11.0.14'
,
number:
'11.0.14'
));
androidStudio
=
FakeAndroidStudio
();
androidStudio
=
FakeAndroidStudio
();
androidSdk
=
androidSdk
=
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
,
androidStudio
);
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
);
fileSystem
.
currentDirectory
fileSystem
.
currentDirectory
.
childDirectory
(
androidStudio
.
javaPath
!)
.
childDirectory
(
androidStudio
.
javaPath
!)
.
createSync
();
.
createSync
();
_testInMemory
(
_testInMemory
(
'electric eel era values are compatible'
,
'electric eel era values are compatible'
,
()
async
{
()
async
{
final
FlutterProject
?
project
=
await
configureJavaGradleAgpForTest
(
final
FlutterProject
?
project
=
await
configureGradleAgpForTest
(
androidSdk
,
javaV:
'11.0.14'
,
gradleV:
'7.3.3'
,
gradleV:
'7.3.3'
,
agpV:
'7.2.0'
,
agpV:
'7.2.0'
,
);
);
...
@@ -515,32 +513,35 @@ dependencies {
...
@@ -515,32 +513,35 @@ dependencies {
await
project
!.
android
.
hasValidJavaGradleAgpVersions
();
await
project
!.
android
.
hasValidJavaGradleAgpVersions
();
expect
(
value
.
success
,
isTrue
);
expect
(
value
.
success
,
isTrue
);
},
},
java:
java
,
androidStudio:
androidStudio
,
androidStudio:
androidStudio
,
processManager:
processManager
,
processManager:
processManager
,
androidSdk:
androidSdk
,
androidSdk:
androidSdk
,
);
);
});
});
group
(
'_'
,
()
{
group
(
'_'
,
()
{
const
String
javaV
=
'17.0.2'
;
const
String
gradleV
=
'6.7.3'
;
const
String
agpV
=
'7.2.0'
;
final
FakeProcessManager
processManager
;
final
FakeProcessManager
processManager
;
final
Java
java
;
final
AndroidStudio
androidStudio
;
final
AndroidStudio
androidStudio
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
processManager
=
FakeProcessManager
.
empty
();
processManager
=
FakeProcessManager
.
empty
();
java
=
FakeJava
(
version:
JavaVersion
(
longText:
javaV
,
number:
javaV
));
androidStudio
=
FakeAndroidStudio
();
androidStudio
=
FakeAndroidStudio
();
androidSdk
=
androidSdk
=
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
,
androidStudio
);
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
);
fileSystem
.
currentDirectory
fileSystem
.
currentDirectory
.
childDirectory
(
androidStudio
.
javaPath
!)
.
childDirectory
(
androidStudio
.
javaPath
!)
.
createSync
();
.
createSync
();
_testInMemory
(
_testInMemory
(
'incompatible everything'
,
'incompatible everything'
,
()
async
{
()
async
{
const
String
javaV
=
'17.0.2'
;
const
String
gradleV
=
'6.7.3'
;
final
FlutterProject
?
project
=
await
configureGradleAgpForTest
(
const
String
agpV
=
'7.2.0'
;
final
FlutterProject
?
project
=
await
configureJavaGradleAgpForTest
(
androidSdk
,
javaV:
javaV
,
gradleV:
gradleV
,
gradleV:
gradleV
,
agpV:
agpV
,
agpV:
agpV
,
);
);
...
@@ -563,32 +564,34 @@ dependencies {
...
@@ -563,32 +564,34 @@ dependencies {
expect
(
value
.
description
,
contains
(
RegExp
(
javaV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
javaV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
gradleV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
gradleV
)));
},
},
java:
java
,
androidStudio:
androidStudio
,
androidStudio:
androidStudio
,
processManager:
processManager
,
processManager:
processManager
,
androidSdk:
androidSdk
,
androidSdk:
androidSdk
,
);
);
});
});
group
(
'_'
,
()
{
group
(
'_'
,
()
{
const
String
javaV
=
'17.0.2'
;
const
String
gradleV
=
'6.7.3'
;
const
String
agpV
=
'4.2.0'
;
final
FakeProcessManager
processManager
;
final
FakeProcessManager
processManager
;
final
Java
java
;
final
AndroidStudio
androidStudio
;
final
AndroidStudio
androidStudio
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
processManager
=
FakeProcessManager
.
empty
();
processManager
=
FakeProcessManager
.
empty
();
java
=
FakeJava
(
version:
JavaVersion
(
longText:
'17.0.2'
,
number:
'17.0.2'
));
androidStudio
=
FakeAndroidStudio
();
androidStudio
=
FakeAndroidStudio
();
androidSdk
=
androidSdk
=
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
,
androidStudio
);
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
);
fileSystem
.
currentDirectory
fileSystem
.
currentDirectory
.
childDirectory
(
androidStudio
.
javaPath
!)
.
childDirectory
(
androidStudio
.
javaPath
!)
.
createSync
();
.
createSync
();
_testInMemory
(
_testInMemory
(
'incompatible java/gradle only'
,
'incompatible java/gradle only'
,
()
async
{
()
async
{
const
String
javaV
=
'17.0.2'
;
final
FlutterProject
?
project
=
await
configureGradleAgpForTest
(
const
String
gradleV
=
'6.7.3'
;
const
String
agpV
=
'4.2.0'
;
final
FlutterProject
?
project
=
await
configureJavaGradleAgpForTest
(
androidSdk
,
javaV:
javaV
,
gradleV:
gradleV
,
gradleV:
gradleV
,
agpV:
agpV
,
agpV:
agpV
,
);
);
...
@@ -606,6 +609,7 @@ dependencies {
...
@@ -606,6 +609,7 @@ dependencies {
expect
(
value
.
description
,
contains
(
RegExp
(
javaV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
javaV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
gradleV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
gradleV
)));
},
},
java:
java
,
androidStudio:
androidStudio
,
androidStudio:
androidStudio
,
processManager:
processManager
,
processManager:
processManager
,
androidSdk:
androidSdk
,
androidSdk:
androidSdk
,
...
@@ -613,25 +617,24 @@ dependencies {
...
@@ -613,25 +617,24 @@ dependencies {
});
});
group
(
'_'
,
()
{
group
(
'_'
,
()
{
final
FakeProcessManager
processManager
;
final
FakeProcessManager
processManager
;
final
Java
java
;
final
AndroidStudio
androidStudio
;
final
AndroidStudio
androidStudio
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FakeAndroidSdkWithDir
androidSdk
;
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
final
FileSystem
fileSystem
=
getFileSystemForPlatform
();
java
=
FakeJava
(
version:
JavaVersion
(
longText:
'11.0.2'
,
number:
'11.0.2'
));
processManager
=
FakeProcessManager
.
empty
();
processManager
=
FakeProcessManager
.
empty
();
androidStudio
=
FakeAndroidStudio
();
androidStudio
=
FakeAndroidStudio
();
androidSdk
=
androidSdk
=
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
,
androidStudio
);
FakeAndroidSdkWithDir
(
fileSystem
.
currentDirectory
);
fileSystem
.
currentDirectory
fileSystem
.
currentDirectory
.
childDirectory
(
androidStudio
.
javaPath
!)
.
childDirectory
(
androidStudio
.
javaPath
!)
.
createSync
();
.
createSync
();
_testInMemory
(
_testInMemory
(
'incompatible gradle/agp only'
,
'incompatible gradle/agp only'
,
()
async
{
()
async
{
const
String
javaV
=
'11.0.2'
;
const
String
gradleV
=
'7.0.3'
;
const
String
gradleV
=
'7.0.3'
;
const
String
agpV
=
'7.1.0'
;
const
String
agpV
=
'7.1.0'
;
final
FlutterProject
?
project
=
await
configureJavaGradleAgpForTest
(
final
FlutterProject
?
project
=
await
configureGradleAgpForTest
(
androidSdk
,
javaV:
javaV
,
gradleV:
gradleV
,
gradleV:
gradleV
,
agpV:
agpV
,
agpV:
agpV
,
);
);
...
@@ -649,6 +652,7 @@ dependencies {
...
@@ -649,6 +652,7 @@ dependencies {
expect
(
value
.
description
,
contains
(
RegExp
(
gradleV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
gradleV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
agpV
)));
expect
(
value
.
description
,
contains
(
RegExp
(
agpV
)));
},
},
java:
java
,
androidStudio:
androidStudio
,
androidStudio:
androidStudio
,
processManager:
processManager
,
processManager:
processManager
,
androidSdk:
androidSdk
,
androidSdk:
androidSdk
,
...
@@ -1404,6 +1408,7 @@ void _testInMemory(
...
@@ -1404,6 +1408,7 @@ void _testInMemory(
String
description
,
String
description
,
Future
<
void
>
Function
()
testMethod
,
{
Future
<
void
>
Function
()
testMethod
,
{
FileSystem
?
fileSystem
,
FileSystem
?
fileSystem
,
Java
?
java
,
AndroidStudio
?
androidStudio
,
AndroidStudio
?
androidStudio
,
ProcessManager
?
processManager
,
ProcessManager
?
processManager
,
AndroidSdk
?
androidSdk
,
AndroidSdk
?
androidSdk
,
...
@@ -1466,6 +1471,7 @@ void _testInMemory(
...
@@ -1466,6 +1471,7 @@ void _testInMemory(
overrides:
<
Type
,
Generator
>{
overrides:
<
Type
,
Generator
>{
FileSystem:
()
=>
testFileSystem
,
FileSystem:
()
=>
testFileSystem
,
ProcessManager:
()
=>
processManager
??
FakeProcessManager
.
any
(),
ProcessManager:
()
=>
processManager
??
FakeProcessManager
.
any
(),
Java
:
()
=>
java
,
AndroidStudio:
()
=>
androidStudio
??
FakeAndroidStudio
(),
AndroidStudio:
()
=>
androidStudio
??
FakeAndroidStudio
(),
// Intentionlly null if not set. Some ios tests fail if this is a fake.
// Intentionlly null if not set. Some ios tests fail if this is a fake.
AndroidSdk:
()
=>
androidSdk
,
AndroidSdk:
()
=>
androidSdk
,
...
@@ -1667,37 +1673,10 @@ class FakeXcodeProjectInterpreter extends Fake implements XcodeProjectInterprete
...
@@ -1667,37 +1673,10 @@ class FakeXcodeProjectInterpreter extends Fake implements XcodeProjectInterprete
}
}
class
FakeAndroidSdkWithDir
extends
Fake
implements
AndroidSdk
{
class
FakeAndroidSdkWithDir
extends
Fake
implements
AndroidSdk
{
FakeAndroidSdkWithDir
(
this
.
_directory
,
AndroidStudio
_androidStudio
)
{
FakeAndroidSdkWithDir
(
this
.
_directory
);
_javaPath
=
'
${_androidStudio.javaPath}
/bin/java'
;
}
late
String
_javaPath
;
String
?
javaVersion
;
final
Directory
_directory
;
final
Directory
_directory
;
@override
late
bool
platformToolsAvailable
;
@override
late
bool
licensesAvailable
;
@override
AndroidSdkVersion
?
latestVersion
;
@override
@override
Directory
get
directory
=>
_directory
;
Directory
get
directory
=>
_directory
;
@override
Map
<
String
,
String
>
get
sdkManagerEnv
=>
<
String
,
String
>{
'PATH'
:
_javaPath
};
@override
String
?
getJavaVersion
({
required
AndroidStudio
?
androidStudio
,
required
FileSystem
fileSystem
,
required
OperatingSystemUtils
operatingSystemUtils
,
required
Platform
platform
,
required
ProcessUtils
processUtils
,
})
{
return
javaVersion
;
}
}
}
packages/flutter_tools/test/src/fakes.dart
View file @
80a4f9b1
...
@@ -7,6 +7,7 @@ import 'dart:io' as io show IOSink, ProcessSignal, Stdout, StdoutException;
...
@@ -7,6 +7,7 @@ import 'dart:io' as io show IOSink, ProcessSignal, Stdout, StdoutException;
import
'package:flutter_tools/src/android/android_sdk.dart'
;
import
'package:flutter_tools/src/android/android_sdk.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/android_studio.dart'
;
import
'package:flutter_tools/src/android/java.dart'
;
import
'package:flutter_tools/src/base/bot_detector.dart'
;
import
'package:flutter_tools/src/base/bot_detector.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/io.dart'
;
import
'package:flutter_tools/src/base/io.dart'
;
...
@@ -588,6 +589,7 @@ class FakeFlutterProjectFactory implements FlutterProjectFactory {
...
@@ -588,6 +589,7 @@ class FakeFlutterProjectFactory implements FlutterProjectFactory {
}
}
class
FakeAndroidSdk
extends
Fake
implements
AndroidSdk
{
class
FakeAndroidSdk
extends
Fake
implements
AndroidSdk
{
@override
@override
late
bool
platformToolsAvailable
;
late
bool
platformToolsAvailable
;
...
@@ -602,3 +604,41 @@ class FakeAndroidStudio extends Fake implements AndroidStudio {
...
@@ -602,3 +604,41 @@ class FakeAndroidStudio extends Fake implements AndroidStudio {
@override
@override
String
get
javaPath
=>
'java'
;
String
get
javaPath
=>
'java'
;
}
}
class
FakeJava
extends
Fake
implements
Java
{
FakeJava
({
this
.
javaHome
=
'/android-studio/jbr'
,
String
binary
=
'/android-studio/jbr/bin/java'
,
JavaVersion
?
version
,
bool
canRun
=
true
,
}):
binaryPath
=
binary
,
version
=
version
??
JavaVersion
(
longText:
'openjdk 19.0.2 2023-01-17'
,
number:
'19.0.2'
,
),
_environment
=
<
String
,
String
>{
if
(
javaHome
!=
null
)
'JAVA_HOME'
:
javaHome
,
'PATH'
:
'/android-studio/jbr/bin'
,
},
_canRun
=
canRun
;
@override
String
?
javaHome
;
@override
String
binaryPath
;
final
Map
<
String
,
String
>
_environment
;
final
bool
_canRun
;
@override
Map
<
String
,
String
>
get
environment
=>
_environment
;
@override
JavaVersion
?
version
;
@override
bool
canRun
()
{
return
_canRun
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment