这是indexloc提供的服务,不要输入任何密码
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 46 additions & 7 deletions packages/flutter_tools/lib/src/asset.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import 'base/logger.dart';
import 'base/platform.dart';
import 'base/utils.dart';
import 'build_info.dart';
import 'build_system/targets/native_assets.dart';
import 'cache.dart';
import 'convert.dart';
import 'dart/package_map.dart';
Expand Down Expand Up @@ -112,6 +113,7 @@ abstract class AssetBundle {

/// Returns 0 for success; non-zero for failure.
Future<int> build({
DartBuildResult? dartBuildResult,
String manifestPath = defaultManifestPath,
required String packageConfigPath,
bool deferredComponentsEnabled = false,
Expand Down Expand Up @@ -187,6 +189,8 @@ class ManifestAssetBundle implements AssetBundle {

DateTime? _lastBuildTimestamp;

DartBuildResult? _lastDartBuildResult;

// We assume the main asset is designed for a device pixel ratio of 1.0.
static const String _kAssetManifestJsonFilename = 'AssetManifest.json';
static const String _kAssetManifestBinFilename = 'AssetManifest.bin';
Expand All @@ -206,13 +210,21 @@ class ManifestAssetBundle implements AssetBundle {

@override
bool needsBuild({String manifestPath = defaultManifestPath}) {
final DateTime? lastBuildTimestamp = _lastBuildTimestamp;
if (lastBuildTimestamp == null) {
if (!wasBuiltOnce() ||
_lastDartBuildResult == null ||
// We need to re-run the dart build.
!_lastDartBuildResult!.isBuildUpToDate(_fileSystem) ||
// We don't have to re-run the dart build, but some files the dart build
// wants us to bundle have changed contents.
_lastDartBuildResult!.isBuildOutputDirty(_fileSystem)) {
return true;
}

final DateTime lastBuildTimestamp = _lastBuildTimestamp!;

final FileStat manifestStat = _fileSystem.file(manifestPath).statSync();
if (manifestStat.type == FileSystemEntityType.notFound) {
if (manifestStat.type == FileSystemEntityType.notFound ||
manifestStat.modified.isAfter(lastBuildTimestamp)) {
return true;
}

Expand All @@ -221,18 +233,19 @@ class ManifestAssetBundle implements AssetBundle {
return true; // directory was deleted.
}
for (final File file in directory.listSync().whereType<File>()) {
final DateTime dateTime = file.statSync().modified;
if (dateTime.isAfter(lastBuildTimestamp)) {
final DateTime lastModified = file.statSync().modified;
if (lastModified.isAfter(lastBuildTimestamp)) {
return true;
}
}
}

return manifestStat.modified.isAfter(lastBuildTimestamp);
return false;
}

@override
Future<int> build({
DartBuildResult? dartBuildResult,
String manifestPath = defaultManifestPath,
FlutterProject? flutterProject,
required String packageConfigPath,
Expand All @@ -255,6 +268,7 @@ class ManifestAssetBundle implements AssetBundle {
// hang on hot reload, as the incremental dill files will never be copied to the
// device.
_lastBuildTimestamp = DateTime.now();
_lastDartBuildResult = dartBuildResult;
if (flutterManifest.isEmpty) {
entries[_kAssetManifestJsonFilename] = AssetBundleEntry(
DevFSStringContent('{}'),
Expand Down Expand Up @@ -400,8 +414,33 @@ class ManifestAssetBundle implements AssetBundle {
}
}

for (final DataAsset dataAsset in dartBuildResult?.dataAssets ?? <DataAsset>[]) {
final Package package = packageConfig[dataAsset.package]!;
final Uri fileUri = dataAsset.file;

final String baseDir;
final Uri relativeUri;
if (fileUri.isAbsolute) {
final List<String> pathSegments = fileUri.pathSegments;
baseDir =
fileUri.replace(pathSegments: pathSegments.take(pathSegments.length - 1)).toFilePath();
relativeUri = Uri(pathSegments: <String>[pathSegments.last]);
} else {
baseDir = package.root.toFilePath();
relativeUri = fileUri;
}

final _Asset asset = _Asset(
baseDir: baseDir,
relativeUri: relativeUri,
entryUri: Uri.parse('packages/${dataAsset.package}/${dataAsset.name}'),
package: package,
);
assetVariants[asset] = <_Asset>[asset];
}

// Save the contents of each image, image variant, and font
// asset in entries.
// asset in [entries].
for (final _Asset asset in assetVariants.keys) {
final File assetFile = asset.lookupAssetFile(_fileSystem);
final List<_Asset> variants = assetVariants[asset]!;
Expand Down
14 changes: 0 additions & 14 deletions packages/flutter_tools/lib/src/build_info.dart
Original file line number Diff line number Diff line change
Expand Up @@ -930,20 +930,6 @@ const String kSdkRoot = 'SdkRoot';
/// Whether to enable Dart obfuscation and where to save the symbol map.
const String kDartObfuscation = 'DartObfuscation';

/// Whether to enable Native Assets.
///
/// If true, native assets are built and the mapping for native assets lookup
/// at runtime is embedded in the kernel file.
///
/// If false, native assets are not built, and an empty mapping is embedded in
/// the kernel file. Used for targets that trigger kernel builds but
/// are not OS/architecture specific.
///
/// Supported values are 'true' and 'false'.
///
/// Defaults to 'true'.
const String kNativeAssets = 'NativeAssets';

/// An output directory where one or more code-size measurements may be written.
const String kCodeSizeDirectory = 'CodeSizeDirectory';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,11 @@ abstract class AndroidAssetBundle extends Target {
.file(isolateSnapshotData)
.copySync(outputDirectory.childFile('isolate_snapshot_data').path);
}
final DartBuildResult dartBuildResult = await DartBuild.loadBuildResult(environment);
final Depfile assetDepfile = await copyAssets(
environment,
outputDirectory,
dartBuildResult: dartBuildResult,
targetPlatform: TargetPlatform.android,
buildMode: buildMode,
flavor: environment.defines[kFlavor],
Expand All @@ -89,7 +91,11 @@ abstract class AndroidAssetBundle extends Target {
}

@override
List<Target> get dependencies => const <Target>[KernelSnapshot(), InstallCodeAssets()];
List<Target> get dependencies => const <Target>[
DartBuildForNative(),
KernelSnapshot(),
InstallCodeAssets(),
];
}

/// An implementation of [AndroidAssetBundle] that includes dependencies on vm
Expand Down
10 changes: 9 additions & 1 deletion packages/flutter_tools/lib/src/build_system/targets/assets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import 'native_assets.dart';
Future<Depfile> copyAssets(
Environment environment,
Directory outputDirectory, {
required DartBuildResult dartBuildResult,
Map<String, DevFSContent> additionalContent = const <String, DevFSContent>{},
required TargetPlatform targetPlatform,
required BuildMode buildMode,
Expand All @@ -49,6 +50,7 @@ Future<Depfile> copyAssets(
splitDeferredAssets: buildMode != BuildMode.debug && buildMode != BuildMode.jitRelease,
).createBundle();
final int resultCode = await assetBundle.build(
dartBuildResult: dartBuildResult,
manifestPath: pubspecFile.path,
packageConfigPath: findPackageConfigFileOrDefault(environment.projectDir).path,
deferredComponentsEnabled: environment.defines[kDeferredComponents] == 'true',
Expand Down Expand Up @@ -241,7 +243,11 @@ class CopyAssets extends Target {
String get name => 'copy_assets';

@override
List<Target> get dependencies => const <Target>[KernelSnapshot(), InstallCodeAssets()];
List<Target> get dependencies => const <Target>[
DartBuildForNative(),
KernelSnapshot(),
InstallCodeAssets(),
];

@override
List<Source> get inputs => const <Source>[
Expand All @@ -267,9 +273,11 @@ class CopyAssets extends Target {
final BuildMode buildMode = BuildMode.fromCliName(buildModeEnvironment);
final Directory output = environment.buildDir.childDirectory('flutter_assets');
output.createSync(recursive: true);
final DartBuildResult dartBuildResult = await DartBuild.loadBuildResult(environment);
final Depfile depfile = await copyAssets(
environment,
output,
dartBuildResult: dartBuildResult,
targetPlatform: TargetPlatform.android,
buildMode: buildMode,
flavor: environment.defines[kFlavor],
Expand Down
14 changes: 12 additions & 2 deletions packages/flutter_tools/lib/src/build_system/targets/common.dart
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,11 @@ class CopyFlutterBundle extends Target {
.file(isolateSnapshotData)
.copySync(environment.outputDir.childFile('isolate_snapshot_data').path);
}
final DartBuildResult dartBuildResult = await DartBuild.loadBuildResult(environment);
final Depfile assetDepfile = await copyAssets(
environment,
environment.outputDir,
dartBuildResult: dartBuildResult,
targetPlatform: TargetPlatform.android,
buildMode: buildMode,
flavor: flavor,
Expand All @@ -103,7 +105,11 @@ class CopyFlutterBundle extends Target {
}

@override
List<Target> get dependencies => const <Target>[KernelSnapshot(), InstallCodeAssets()];
List<Target> get dependencies => const <Target>[
DartBuildForNative(),
KernelSnapshot(),
InstallCodeAssets(),
];
}

/// Copies the pre-built flutter bundle for release mode.
Expand Down Expand Up @@ -153,7 +159,7 @@ class KernelSnapshot extends Target {
@override
List<Source> get outputs => const <Source>[
Source.pattern('{BUILD_DIR}/${KernelSnapshot.dillName}'),
// TODO(mosuem): Should output resources.json. https://github.com/flutter/flutter/issues/146263
Source.pattern('{BUILD_DIR}/$recordedUsagesFileName'),
];

static const String depfile = 'kernel_snapshot_program.d';
Expand All @@ -168,6 +174,7 @@ class KernelSnapshot extends Target {
];

static const String dillName = 'app.dill';
static const String recordedUsagesFileName = 'recorded_usages.json';

@override
Future<void> build(Environment environment) async {
Expand Down Expand Up @@ -254,6 +261,8 @@ class KernelSnapshot extends Target {

final String dillPath = environment.buildDir.childFile(dillName).path;

final String recordedUsagesFile = environment.buildDir.childFile(recordedUsagesFileName).path;

final List<String> dartDefines = decodeDartDefines(environment.defines, kDartDefines);
await _addFlavorToDartDefines(dartDefines, environment, targetPlatform);

Expand Down Expand Up @@ -282,6 +291,7 @@ class KernelSnapshot extends Target {
buildDir: environment.buildDir,
targetOS: targetOS,
checkDartPluginRegistry: environment.generateDartPluginRegistry,
recordedUsagesFile: recordedUsagesFile,
);
if (output == null || output.errorCount != 0) {
throw Exception();
Expand Down
8 changes: 7 additions & 1 deletion packages/flutter_tools/lib/src/build_system/targets/ios.dart
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,11 @@ abstract class IosAssetBundle extends Target {
const IosAssetBundle();

@override
List<Target> get dependencies => const <Target>[KernelSnapshot(), InstallCodeAssets()];
List<Target> get dependencies => const <Target>[
DartBuildForNative(),
KernelSnapshot(),
InstallCodeAssets(),
];

@override
List<Source> get inputs => const <Source>[
Expand Down Expand Up @@ -529,9 +533,11 @@ abstract class IosAssetBundle extends Target {
final String? flavor = await flutterProject.ios.parseFlavorFromConfiguration(environment);

// Copy the assets.
final DartBuildResult dartBuildResult = await DartBuild.loadBuildResult(environment);
final Depfile assetDepfile = await copyAssets(
environment,
assetDirectory,
dartBuildResult: dartBuildResult,
targetPlatform: TargetPlatform.ios,
buildMode: buildMode,
additionalInputs: <File>[
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ abstract class BundleLinuxAssets extends Target {

@override
List<Target> get dependencies => <Target>[
const DartBuildForNative(),
const KernelSnapshot(),
const InstallCodeAssets(),
UnpackLinux(targetPlatform),
Expand Down Expand Up @@ -127,9 +128,11 @@ abstract class BundleLinuxAssets extends Target {
.copySync(outputDirectory.childFile('kernel_blob.bin').path);
}
final String versionInfo = getVersionInfo(environment.defines);
final DartBuildResult dartBuildResult = await DartBuild.loadBuildResult(environment);
final Depfile depfile = await copyAssets(
environment,
outputDirectory,
dartBuildResult: dartBuildResult,
targetPlatform: targetPlatform,
buildMode: buildMode,
additionalContent: <String, DevFSContent>{
Expand Down
25 changes: 16 additions & 9 deletions packages/flutter_tools/lib/src/build_system/targets/macos.dart
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,9 @@ class CompileMacOSFramework extends Target {
abstract class MacOSBundleFlutterAssets extends Target {
const MacOSBundleFlutterAssets();

@override
List<Target> get dependencies => const <Target>[DartBuildForNative()];

@override
List<Source> get inputs => const <Source>[
Source.pattern('{BUILD_DIR}/App.framework/App'),
Expand Down Expand Up @@ -491,9 +494,11 @@ abstract class MacOSBundleFlutterAssets extends Target {
final FlutterProject flutterProject = FlutterProject.fromDirectory(environment.projectDir);
final String? flavor = await flutterProject.macos.parseFlavorFromConfiguration(environment);

final DartBuildResult dartBuildResult = await DartBuild.loadBuildResult(environment);
final Depfile assetDepfile = await copyAssets(
environment,
assetDirectory,
dartBuildResult: dartBuildResult,
targetPlatform: TargetPlatform.darwin,
buildMode: buildMode,
flavor: flavor,
Expand Down Expand Up @@ -613,11 +618,12 @@ class DebugMacOSBundleFlutterAssets extends MacOSBundleFlutterAssets {
String get name => 'debug_macos_bundle_flutter_assets';

@override
List<Target> get dependencies => const <Target>[
KernelSnapshot(),
DebugMacOSFramework(),
DebugUnpackMacOS(),
InstallCodeAssets(),
List<Target> get dependencies => <Target>[
...super.dependencies,
const KernelSnapshot(),
const DebugMacOSFramework(),
const DebugUnpackMacOS(),
const InstallCodeAssets(),
];

@override
Expand Down Expand Up @@ -659,10 +665,11 @@ class ProfileMacOSBundleFlutterAssets extends MacOSBundleFlutterAssets {
String get name => 'profile_macos_bundle_flutter_assets';

@override
List<Target> get dependencies => const <Target>[
CompileMacOSFramework(),
InstallCodeAssets(),
ProfileUnpackMacOS(),
List<Target> get dependencies => <Target>[
...super.dependencies,
const CompileMacOSFramework(),
const ProfileUnpackMacOS(),
const InstallCodeAssets(),
];

@override
Expand Down
Loading
Loading