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
fbe6779f
Commit
fbe6779f
authored
Feb 03, 2016
by
Matt Perry
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1539 from mpcomplete/start
'flutter start' calls 'flutter apk' if necessary.
parents
ac9e016a
5d2281b6
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
343 additions
and
188 deletions
+343
-188
apk.dart
packages/flutter_tools/lib/src/commands/apk.dart
+322
-184
daemon.dart
packages/flutter_tools/lib/src/commands/daemon.dart
+1
-0
listen.dart
packages/flutter_tools/lib/src/commands/listen.dart
+1
-0
start.dart
packages/flutter_tools/lib/src/commands/start.dart
+15
-1
device_ios.dart
packages/flutter_tools/lib/src/ios/device_ios.dart
+1
-1
pubspec.yaml
packages/flutter_tools/pubspec.yaml
+1
-0
listen_test.dart
packages/flutter_tools/test/listen_test.dart
+2
-2
No files found.
packages/flutter_tools/lib/src/commands/apk.dart
View file @
fbe6779f
...
@@ -8,15 +8,19 @@ import 'dart:io';
...
@@ -8,15 +8,19 @@ import 'dart:io';
import
'package:path/path.dart'
as
path
;
import
'package:path/path.dart'
as
path
;
import
'package:yaml/yaml.dart'
;
import
'package:yaml/yaml.dart'
;
import
'package:xml/xml.dart'
as
xml
;
import
'../android/device_android.dart'
;
import
'../android/device_android.dart'
;
import
'../application_package.dart'
;
import
'../artifacts.dart'
;
import
'../artifacts.dart'
;
import
'../base/context.dart'
;
import
'../base/context.dart'
;
import
'../base/file_system.dart'
;
import
'../base/file_system.dart'
;
import
'../base/process.dart'
;
import
'../base/process.dart'
;
import
'../build_configuration.dart'
;
import
'../build_configuration.dart'
;
import
'../device.dart'
;
import
'../flx.dart'
as
flx
;
import
'../flx.dart'
as
flx
;
import
'../runner/flutter_command.dart'
;
import
'../runner/flutter_command.dart'
;
import
'../toolchain.dart'
;
import
'start.dart'
;
import
'start.dart'
;
const
String
_kDefaultAndroidManifestPath
=
'apk/AndroidManifest.xml'
;
const
String
_kDefaultAndroidManifestPath
=
'apk/AndroidManifest.xml'
;
...
@@ -25,6 +29,7 @@ const String _kDefaultResourcesPath = 'apk/res';
...
@@ -25,6 +29,7 @@ const String _kDefaultResourcesPath = 'apk/res';
const
String
_kFlutterManifestPath
=
'flutter.yaml'
;
const
String
_kFlutterManifestPath
=
'flutter.yaml'
;
const
String
_kPubspecYamlPath
=
'pubspec.yaml'
;
const
String
_kPubspecYamlPath
=
'pubspec.yaml'
;
const
String
_kPackagesStatusPath
=
'.packages'
;
// Alias of the key provided in the Chromium debug keystore
// Alias of the key provided in the Chromium debug keystore
const
String
_kDebugKeystoreKeyAlias
=
"chromiumdebugkey"
;
const
String
_kDebugKeystoreKeyAlias
=
"chromiumdebugkey"
;
...
@@ -132,6 +137,14 @@ class _ApkComponents {
...
@@ -132,6 +137,14 @@ class _ApkComponents {
Directory
resources
;
Directory
resources
;
}
}
class
ApkKeystoreInfo
{
String
keystore
;
String
password
;
String
keyAlias
;
String
keyPassword
;
ApkKeystoreInfo
({
this
.
keystore
,
this
.
password
,
this
.
keyAlias
,
this
.
keyPassword
});
}
// TODO(mpcomplete): find a better home for this.
// TODO(mpcomplete): find a better home for this.
dynamic
_loadYamlFile
(
String
path
)
{
dynamic
_loadYamlFile
(
String
path
)
{
if
(!
FileSystemEntity
.
isFileSync
(
path
))
if
(!
FileSystemEntity
.
isFileSync
(
path
))
...
@@ -179,7 +192,30 @@ class ApkCommand extends FlutterCommand {
...
@@ -179,7 +192,30 @@ class ApkCommand extends FlutterCommand {
help:
'Password for the entry within the keystore.'
);
help:
'Password for the entry within the keystore.'
);
}
}
Future
_findServices
(
_ApkComponents
components
)
async
{
@override
Future
<
int
>
runInProject
()
async
{
await
downloadToolchain
();
return
await
buildAndroid
(
toolchain:
toolchain
,
configs:
buildConfigurations
,
enginePath:
runner
.
enginePath
,
force:
true
,
manifest:
argResults
[
'manifest'
],
resources:
argResults
[
'resources'
],
outputFile:
argResults
[
'output-file'
],
target:
argResults
[
'target'
],
flxPath:
argResults
[
'flx'
],
keystore:
argResults
[
'keystore'
].
isEmpty
?
null
:
new
ApkKeystoreInfo
(
keystore:
argResults
[
'keystore'
],
password:
argResults
[
'keystore-password'
],
keyAlias:
argResults
[
'keystore-key-alias'
],
keyPassword:
argResults
[
'keystore-key-password'
]
)
);
}
}
Future
_findServices
(
_ApkComponents
components
)
async
{
if
(!
ArtifactStore
.
isPackageRootValid
)
if
(!
ArtifactStore
.
isPackageRootValid
)
return
;
return
;
...
@@ -208,24 +244,25 @@ class ApkCommand extends FlutterCommand {
...
@@ -208,24 +244,25 @@ class ApkCommand extends FlutterCommand {
}
}
}
}
}
}
}
}
Future
<
_ApkComponents
>
_findApkComponents
(
BuildConfiguration
config
)
async
{
Future
<
_ApkComponents
>
_findApkComponents
(
BuildConfiguration
config
,
String
enginePath
,
String
manifest
,
String
resources
)
async
{
String
androidSdkPath
;
String
androidSdkPath
;
List
<
String
>
artifactPaths
;
List
<
String
>
artifactPaths
;
if
(
runner
.
enginePath
!=
null
)
{
if
(
enginePath
!=
null
)
{
androidSdkPath
=
'
${runner.enginePath}
/third_party/android_tools/sdk'
;
androidSdkPath
=
'
$enginePath
/third_party/android_tools/sdk'
;
artifactPaths
=
[
artifactPaths
=
[
'
${runner.enginePath}
/third_party/icu/android/icudtl.dat'
,
'
$enginePath
/third_party/icu/android/icudtl.dat'
,
'
${config.buildDir}
/gen/sky/shell/shell/classes.dex.jar'
,
'
${config.buildDir}
/gen/sky/shell/shell/classes.dex.jar'
,
'
${config.buildDir}
/gen/sky/shell/shell/shell/libs/armeabi-v7a/libsky_shell.so'
,
'
${config.buildDir}
/gen/sky/shell/shell/shell/libs/armeabi-v7a/libsky_shell.so'
,
'
${runner.enginePath}
/build/android/ant/chromium-debug.keystore'
,
'
$enginePath
/build/android/ant/chromium-debug.keystore'
,
];
];
}
else
{
}
else
{
androidSdkPath
=
AndroidDevice
.
getAndroidSdkPath
();
androidSdkPath
=
AndroidDevice
.
getAndroidSdkPath
();
if
(
androidSdkPath
==
null
)
{
if
(
androidSdkPath
==
null
)
return
null
;
return
null
;
}
List
<
ArtifactType
>
artifactTypes
=
<
ArtifactType
>[
List
<
ArtifactType
>
artifactTypes
=
<
ArtifactType
>[
ArtifactType
.
androidIcuData
,
ArtifactType
.
androidIcuData
,
ArtifactType
.
androidClassesJar
,
ArtifactType
.
androidClassesJar
,
...
@@ -240,12 +277,12 @@ class ApkCommand extends FlutterCommand {
...
@@ -240,12 +277,12 @@ class ApkCommand extends FlutterCommand {
_ApkComponents
components
=
new
_ApkComponents
();
_ApkComponents
components
=
new
_ApkComponents
();
components
.
androidSdk
=
new
Directory
(
androidSdkPath
);
components
.
androidSdk
=
new
Directory
(
androidSdkPath
);
components
.
manifest
=
new
File
(
argResults
[
'manifest'
]
);
components
.
manifest
=
new
File
(
manifest
);
components
.
icuData
=
new
File
(
artifactPaths
[
0
]);
components
.
icuData
=
new
File
(
artifactPaths
[
0
]);
components
.
jars
=
[
new
File
(
artifactPaths
[
1
])];
components
.
jars
=
[
new
File
(
artifactPaths
[
1
])];
components
.
libSkyShell
=
new
File
(
artifactPaths
[
2
]);
components
.
libSkyShell
=
new
File
(
artifactPaths
[
2
]);
components
.
debugKeystore
=
new
File
(
artifactPaths
[
3
]);
components
.
debugKeystore
=
new
File
(
artifactPaths
[
3
]);
components
.
resources
=
new
Directory
(
argResults
[
'resources'
]
);
components
.
resources
=
new
Directory
(
resources
);
await
_findServices
(
components
);
await
_findServices
(
components
);
...
@@ -275,16 +312,16 @@ class ApkCommand extends FlutterCommand {
...
@@ -275,16 +312,16 @@ class ApkCommand extends FlutterCommand {
}
}
return
components
;
return
components
;
}
}
// Outputs a services.json file for the flutter engine to read. Format:
// Outputs a services.json file for the flutter engine to read. Format:
// {
// {
// services: [
// services: [
// { name: string, class: string },
// { name: string, class: string },
// ...
// ...
// ]
// ]
// }
// }
void
_generateServicesConfig
(
File
servicesConfig
,
List
<
Map
<
String
,
String
>>
servicesIn
)
{
void
_generateServicesConfig
(
File
servicesConfig
,
List
<
Map
<
String
,
String
>>
servicesIn
)
{
List
<
Map
<
String
,
String
>>
services
=
List
<
Map
<
String
,
String
>>
services
=
servicesIn
.
map
((
Map
<
String
,
String
>
service
)
=>
{
servicesIn
.
map
((
Map
<
String
,
String
>
service
)
=>
{
'name'
:
service
[
'name'
],
'name'
:
service
[
'name'
],
...
@@ -293,9 +330,11 @@ class ApkCommand extends FlutterCommand {
...
@@ -293,9 +330,11 @@ class ApkCommand extends FlutterCommand {
Map
<
String
,
dynamic
>
json
=
{
'services'
:
services
};
Map
<
String
,
dynamic
>
json
=
{
'services'
:
services
};
servicesConfig
.
writeAsStringSync
(
JSON
.
encode
(
json
),
mode:
FileMode
.
WRITE
,
flush:
true
);
servicesConfig
.
writeAsStringSync
(
JSON
.
encode
(
json
),
mode:
FileMode
.
WRITE
,
flush:
true
);
}
}
int
_buildApk
(
_ApkComponents
components
,
String
flxPath
)
{
int
_buildApk
(
_ApkComponents
components
,
String
flxPath
,
ApkKeystoreInfo
keystore
,
String
outputFile
)
{
Directory
tempDir
=
Directory
.
systemTemp
.
createTempSync
(
'flutter_tools'
);
Directory
tempDir
=
Directory
.
systemTemp
.
createTempSync
(
'flutter_tools'
);
try
{
try
{
_ApkBuilder
builder
=
new
_ApkBuilder
(
components
.
androidSdk
.
path
);
_ApkBuilder
builder
=
new
_ApkBuilder
(
components
.
androidSdk
.
path
);
...
@@ -319,11 +358,11 @@ class ApkCommand extends FlutterCommand {
...
@@ -319,11 +358,11 @@ class ApkCommand extends FlutterCommand {
builder
.
package
(
unalignedApk
,
components
.
manifest
,
assetBuilder
.
directory
,
builder
.
package
(
unalignedApk
,
components
.
manifest
,
assetBuilder
.
directory
,
artifactBuilder
.
directory
,
components
.
resources
);
artifactBuilder
.
directory
,
components
.
resources
);
int
signResult
=
_signApk
(
builder
,
components
,
unalignedApk
);
int
signResult
=
_signApk
(
builder
,
components
,
unalignedApk
,
keystore
);
if
(
signResult
!=
0
)
if
(
signResult
!=
0
)
return
signResult
;
return
signResult
;
File
finalApk
=
new
File
(
argResults
[
'output-file'
]
);
File
finalApk
=
new
File
(
outputFile
);
ensureDirectoryExists
(
finalApk
.
path
);
ensureDirectoryExists
(
finalApk
.
path
);
builder
.
align
(
unalignedApk
,
finalApk
);
builder
.
align
(
unalignedApk
,
finalApk
);
...
@@ -333,51 +372,115 @@ class ApkCommand extends FlutterCommand {
...
@@ -333,51 +372,115 @@ class ApkCommand extends FlutterCommand {
}
finally
{
}
finally
{
tempDir
.
deleteSync
(
recursive:
true
);
tempDir
.
deleteSync
(
recursive:
true
);
}
}
}
}
int
_signApk
(
_ApkBuilder
builder
,
_ApkComponents
components
,
File
apk
)
{
int
_signApk
(
_ApkBuilder
builder
,
_ApkComponents
components
,
File
apk
,
ApkKeystoreInfo
keystoreInfo
)
{
File
keystore
;
File
keystore
;
String
keystorePassword
;
String
keystorePassword
;
String
keyAlias
;
String
keyAlias
;
String
keyPassword
;
String
keyPassword
;
if
(
argResults
[
'keystore'
].
isEmpty
)
{
if
(
keystoreInfo
==
null
)
{
printError
(
'Signing the APK using the debug keystore
'
);
printError
(
'Signing the APK using the debug keystore.
'
);
keystore
=
components
.
debugKeystore
;
keystore
=
components
.
debugKeystore
;
keystorePassword
=
_kDebugKeystorePassword
;
keystorePassword
=
_kDebugKeystorePassword
;
keyAlias
=
_kDebugKeystoreKeyAlias
;
keyAlias
=
_kDebugKeystoreKeyAlias
;
keyPassword
=
_kDebugKeystorePassword
;
keyPassword
=
_kDebugKeystorePassword
;
}
else
{
}
else
{
keystore
=
new
File
(
argResults
[
'keystore'
]
);
keystore
=
new
File
(
keystoreInfo
.
keystore
);
keystorePassword
=
argResults
[
'keystore-password'
]
;
keystorePassword
=
keystoreInfo
.
password
;
keyAlias
=
argResults
[
'keystore-key-alias'
]
;
keyAlias
=
keystoreInfo
.
keyAlias
;
if
(
keystorePassword
.
isEmpty
||
keyAlias
.
isEmpty
)
{
if
(
keystorePassword
.
isEmpty
||
keyAlias
.
isEmpty
)
{
printError
(
'Must provide a keystore password and a key alias
'
);
printError
(
'Must provide a keystore password and a key alias.
'
);
return
1
;
return
1
;
}
}
keyPassword
=
argResults
[
'keystore-key-password'
]
;
keyPassword
=
keystoreInfo
.
keyPassword
;
if
(
keyPassword
.
isEmpty
)
if
(
keyPassword
.
isEmpty
)
keyPassword
=
keystorePassword
;
keyPassword
=
keystorePassword
;
}
}
builder
.
sign
(
keystore
,
keystorePassword
,
keyAlias
,
keyPassword
,
apk
);
builder
.
sign
(
keystore
,
keystorePassword
,
keyAlias
,
keyPassword
,
apk
);
return
0
;
}
// Creates a new ApplicationPackage from the Android manifest.
AndroidApk
_getApplicationPackage
(
String
apkPath
,
String
manifest
)
{
if
(!
FileSystemEntity
.
isFileSync
(
manifest
))
return
null
;
String
manifestString
=
new
File
(
manifest
).
readAsStringSync
();
xml
.
XmlDocument
document
=
xml
.
parse
(
manifestString
);
Iterable
<
xml
.
XmlElement
>
manifests
=
document
.
findElements
(
'manifest'
);
if
(
manifests
.
isEmpty
)
return
null
;
String
id
=
manifests
.
toList
()[
0
].
getAttribute
(
'package'
);
String
launchActivity
;
for
(
xml
.
XmlElement
category
in
document
.
findAllElements
(
'category'
))
{
if
(
category
.
getAttribute
(
'android:name'
)
==
'android.intent.category.LAUNCHER'
)
{
xml
.
XmlElement
activity
=
category
.
parent
.
parent
as
xml
.
XmlElement
;
String
activityName
=
activity
.
getAttribute
(
'android:name'
);
launchActivity
=
"
$id
/
$activityName
"
;
break
;
}
}
if
(
id
==
null
||
launchActivity
==
null
)
return
null
;
return
new
AndroidApk
(
localPath:
apkPath
,
id:
id
,
launchActivity:
launchActivity
);
}
// Returns true if the apk is out of date and needs to be rebuilt.
bool
_needsRebuild
(
String
apkPath
,
String
manifest
)
{
FileStat
apkStat
=
FileStat
.
statSync
(
apkPath
);
// Note: This list of dependencies is imperfect, but will do for now. We
// purposely don't include the .dart files, because we can load those
// over the network without needing to rebuild (at least on Android).
List
<
FileStat
>
dependenciesStat
=
[
manifest
,
_kFlutterManifestPath
,
_kPackagesStatusPath
].
map
((
String
path
)
=>
FileStat
.
statSync
(
path
));
if
(
apkStat
.
type
==
FileSystemEntityType
.
NOT_FOUND
)
return
true
;
for
(
FileStat
dep
in
dependenciesStat
)
{
if
(
dep
.
modified
.
isAfter
(
apkStat
.
modified
))
return
true
;
}
return
false
;
}
Future
<
int
>
buildAndroid
({
Toolchain
toolchain
,
List
<
BuildConfiguration
>
configs
,
String
enginePath
,
bool
force:
false
,
String
manifest:
_kDefaultAndroidManifestPath
,
String
resources:
_kDefaultResourcesPath
,
String
outputFile:
_kDefaultOutputPath
,
String
target:
''
,
String
flxPath:
''
,
ApkKeystoreInfo
keystore
})
async
{
if
(!
_needsRebuild
(
outputFile
,
manifest
))
{
printTrace
(
'APK up to date. Skipping build step.'
);
return
0
;
return
0
;
}
}
@override
BuildConfiguration
config
=
configs
.
firstWhere
(
Future
<
int
>
runInProject
()
async
{
BuildConfiguration
config
=
buildConfigurations
.
firstWhere
(
(
BuildConfiguration
bc
)
=>
bc
.
targetPlatform
==
TargetPlatform
.
android
(
BuildConfiguration
bc
)
=>
bc
.
targetPlatform
==
TargetPlatform
.
android
);
);
_ApkComponents
components
=
await
_findApkComponents
(
config
,
enginePath
,
manifest
,
resources
);
_ApkComponents
components
=
await
_findApkComponents
(
config
);
if
(
components
==
null
)
{
if
(
components
==
null
)
{
printError
(
'Unable to build APK
.'
);
printError
(
'Failure building APK. Unable to find components
.'
);
return
1
;
return
1
;
}
}
String
flxPath
=
argResults
[
'flx'
]
;
printStatus
(
'Building APK...'
)
;
if
(!
flxPath
.
isEmpty
)
{
if
(!
flxPath
.
isEmpty
)
{
if
(!
FileSystemEntity
.
isFileSync
(
flxPath
))
{
if
(!
FileSystemEntity
.
isFileSync
(
flxPath
))
{
...
@@ -385,21 +488,56 @@ class ApkCommand extends FlutterCommand {
...
@@ -385,21 +488,56 @@ class ApkCommand extends FlutterCommand {
printError
(
'(Omit the --flx option to build the FLX automatically)'
);
printError
(
'(Omit the --flx option to build the FLX automatically)'
);
return
1
;
return
1
;
}
}
return
_buildApk
(
components
,
flxPath
);
return
_buildApk
(
components
,
flxPath
,
keystore
,
outputFile
);
}
else
{
}
else
{
await
downloadToolchain
();
// Find the path to the main Dart file.
// Find the path to the main Dart file.
String
mainPath
=
findMainDartFile
(
argResults
[
'target'
]
);
String
mainPath
=
findMainDartFile
(
target
);
// Build the FLX.
// Build the FLX.
flx
.
DirectoryResult
buildResult
=
await
flx
.
buildInTempDir
(
toolchain
,
mainPath:
mainPath
);
flx
.
DirectoryResult
buildResult
=
await
flx
.
buildInTempDir
(
toolchain
,
mainPath:
mainPath
);
try
{
try
{
return
_buildApk
(
components
,
buildResult
.
localBundlePath
);
return
_buildApk
(
components
,
buildResult
.
localBundlePath
,
keystore
,
outputFile
);
}
finally
{
}
finally
{
buildResult
.
dispose
();
buildResult
.
dispose
();
}
}
}
}
}
Future
<
ApplicationPackageStore
>
buildAll
(
DeviceStore
devices
,
ApplicationPackageStore
applicationPackages
,
Toolchain
toolchain
,
List
<
BuildConfiguration
>
configs
,
{
String
enginePath
,
String
target:
''
})
async
{
for
(
Device
device
in
devices
.
all
)
{
ApplicationPackage
package
=
applicationPackages
.
getPackageForPlatform
(
device
.
platform
);
if
(
package
==
null
||
!
device
.
isConnected
())
continue
;
// TODO(mpcomplete): Temporary hack. We only support the apk builder atm.
if
(
package
==
applicationPackages
.
android
)
{
if
(!
FileSystemEntity
.
isFileSync
(
_kDefaultAndroidManifestPath
))
{
printStatus
(
'Using pre-built SkyShell.apk'
);
continue
;
}
await
buildAndroid
(
toolchain:
toolchain
,
configs:
configs
,
enginePath:
enginePath
,
force:
false
,
target:
target
);
// Replace our pre-built AndroidApk with this custom-built one.
applicationPackages
=
new
ApplicationPackageStore
(
android:
_getApplicationPackage
(
_kDefaultOutputPath
,
_kDefaultAndroidManifestPath
),
iOS:
applicationPackages
.
iOS
,
iOSSimulator:
applicationPackages
.
iOSSimulator
);
}
}
}
return
applicationPackages
;
}
}
packages/flutter_tools/lib/src/commands/daemon.dart
View file @
fbe6779f
...
@@ -253,6 +253,7 @@ class AppDomain extends Domain {
...
@@ -253,6 +253,7 @@ class AppDomain extends Domain {
command
.
devices
,
command
.
devices
,
command
.
applicationPackages
,
command
.
applicationPackages
,
command
.
toolchain
,
command
.
toolchain
,
command
.
buildConfigurations
,
target:
args
[
'target'
],
target:
args
[
'target'
],
route:
args
[
'route'
],
route:
args
[
'route'
],
checked:
args
[
'checked'
]
??
true
checked:
args
[
'checked'
]
??
true
...
...
packages/flutter_tools/lib/src/commands/listen.dart
View file @
fbe6779f
...
@@ -41,6 +41,7 @@ class ListenCommand extends StartCommandBase {
...
@@ -41,6 +41,7 @@ class ListenCommand extends StartCommandBase {
devices
,
devices
,
applicationPackages
,
applicationPackages
,
toolchain
,
toolchain
,
buildConfigurations
,
target:
argResults
[
'target'
],
target:
argResults
[
'target'
],
install:
firstTime
,
install:
firstTime
,
stop:
true
,
stop:
true
,
...
...
packages/flutter_tools/lib/src/commands/start.dart
View file @
fbe6779f
...
@@ -10,10 +10,12 @@ import 'package:path/path.dart' as path;
...
@@ -10,10 +10,12 @@ import 'package:path/path.dart' as path;
import
'../application_package.dart'
;
import
'../application_package.dart'
;
import
'../base/common.dart'
;
import
'../base/common.dart'
;
import
'../base/context.dart'
;
import
'../base/context.dart'
;
import
'../build_configuration.dart'
;
import
'../device.dart'
;
import
'../device.dart'
;
import
'../flx.dart'
;
import
'../flx.dart'
;
import
'../runner/flutter_command.dart'
;
import
'../runner/flutter_command.dart'
;
import
'../toolchain.dart'
;
import
'../toolchain.dart'
;
import
'apk.dart'
;
import
'install.dart'
;
import
'install.dart'
;
import
'stop.dart'
;
import
'stop.dart'
;
...
@@ -94,7 +96,9 @@ class StartCommand extends StartCommandBase {
...
@@ -94,7 +96,9 @@ class StartCommand extends StartCommandBase {
devices
,
devices
,
applicationPackages
,
applicationPackages
,
toolchain
,
toolchain
,
buildConfigurations
,
target:
argResults
[
'target'
],
target:
argResults
[
'target'
],
enginePath:
runner
.
enginePath
,
install:
true
,
install:
true
,
stop:
argResults
[
'full-restart'
],
stop:
argResults
[
'full-restart'
],
checked:
argResults
[
'checked'
],
checked:
argResults
[
'checked'
],
...
@@ -113,8 +117,10 @@ class StartCommand extends StartCommandBase {
...
@@ -113,8 +117,10 @@ class StartCommand extends StartCommandBase {
Future
<
int
>
startApp
(
Future
<
int
>
startApp
(
DeviceStore
devices
,
DeviceStore
devices
,
ApplicationPackageStore
applicationPackages
,
ApplicationPackageStore
applicationPackages
,
Toolchain
toolchain
,
{
Toolchain
toolchain
,
List
<
BuildConfiguration
>
configs
,
{
String
target
,
String
target
,
String
enginePath
,
bool
stop:
true
,
bool
stop:
true
,
bool
install:
true
,
bool
install:
true
,
bool
checked:
true
,
bool
checked:
true
,
...
@@ -134,6 +140,14 @@ Future<int> startApp(
...
@@ -134,6 +140,14 @@ Future<int> startApp(
return
1
;
return
1
;
}
}
if
(
install
)
{
printTrace
(
'Running build command.'
);
applicationPackages
=
await
buildAll
(
devices
,
applicationPackages
,
toolchain
,
configs
,
enginePath:
enginePath
,
target:
target
);
}
if
(
stop
)
{
if
(
stop
)
{
printTrace
(
'Running stop command.'
);
printTrace
(
'Running stop command.'
);
stopAll
(
devices
,
applicationPackages
);
stopAll
(
devices
,
applicationPackages
);
...
...
packages/flutter_tools/lib/src/ios/device_ios.dart
View file @
fbe6779f
...
@@ -614,7 +614,7 @@ class _IOSSimulatorLogReader extends DeviceLogReader {
...
@@ -614,7 +614,7 @@ class _IOSSimulatorLogReader extends DeviceLogReader {
}
}
);
);
return
result
;
return
await
result
;
}
}
int
get
hashCode
=>
device
.
logFilePath
.
hashCode
;
int
get
hashCode
=>
device
.
logFilePath
.
hashCode
;
...
...
packages/flutter_tools/pubspec.yaml
View file @
fbe6779f
...
@@ -18,6 +18,7 @@ dependencies:
...
@@ -18,6 +18,7 @@ dependencies:
stack_trace
:
^1.4.0
stack_trace
:
^1.4.0
test
:
0.12.6+1
# see note below
test
:
0.12.6+1
# see note below
yaml
:
^2.1.3
yaml
:
^2.1.3
xml
:
^2.4.1
flx
:
flx
:
path
:
../flx
path
:
../flx
...
...
packages/flutter_tools/test/listen_test.dart
View file @
fbe6779f
...
@@ -4,6 +4,7 @@
...
@@ -4,6 +4,7 @@
import
'package:args/command_runner.dart'
;
import
'package:args/command_runner.dart'
;
import
'package:flutter_tools/src/commands/listen.dart'
;
import
'package:flutter_tools/src/commands/listen.dart'
;
import
'package:flutter_tools/src/runner/flutter_command_runner.dart'
;
import
'package:mockito/mockito.dart'
;
import
'package:mockito/mockito.dart'
;
import
'package:test/test.dart'
;
import
'package:test/test.dart'
;
...
@@ -22,8 +23,7 @@ defineTests() {
...
@@ -22,8 +23,7 @@ defineTests() {
when
(
mockDevices
.
iOS
.
isConnected
()).
thenReturn
(
false
);
when
(
mockDevices
.
iOS
.
isConnected
()).
thenReturn
(
false
);
when
(
mockDevices
.
iOSSimulator
.
isConnected
()).
thenReturn
(
false
);
when
(
mockDevices
.
iOSSimulator
.
isConnected
()).
thenReturn
(
false
);
CommandRunner
runner
=
new
CommandRunner
(
'test_flutter'
,
''
)
CommandRunner
runner
=
new
FlutterCommandRunner
()..
addCommand
(
command
);
..
addCommand
(
command
);
runner
.
run
([
'listen'
]).
then
((
int
code
)
=>
expect
(
code
,
equals
(
0
)));
runner
.
run
([
'listen'
]).
then
((
int
code
)
=>
expect
(
code
,
equals
(
0
)));
});
});
});
});
...
...
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