[flutter_tools] update asset manifest to use package_config instead of package_map (#53944)

diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart
index d8db4e0..0a4a146 100644
--- a/packages/flutter_tools/lib/src/asset.dart
+++ b/packages/flutter_tools/lib/src/asset.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import 'package:meta/meta.dart';
+import 'package:package_config/package_config.dart';
 import 'package:yaml/yaml.dart';
 
 import 'base/context.dart';
@@ -147,8 +148,16 @@
     }
 
     final String assetBasePath = globals.fs.path.dirname(globals.fs.path.absolute(manifestPath));
-
-    final PackageMap packageMap = PackageMap(packagesPath, fileSystem: globals.fs);
+    final PackageConfig packageConfig = await loadPackageConfigUri(
+      globals.fs.file(packagesPath).absolute.uri,
+      loader: (Uri uri) {
+        final File file = globals.fs.file(uri);
+        if (!file.existsSync()) {
+          return null;
+        }
+        return file.readAsBytes();
+      },
+    );
     final List<Uri> wildcardDirectories = <Uri>[];
 
     // The _assetVariants map contains an entry for each asset listed
@@ -156,7 +165,7 @@
     // value of each image asset is a list of resolution-specific "variants",
     // see _AssetDirectoryCache.
     final Map<_Asset, List<_Asset>> assetVariants = _parseAssets(
-      packageMap,
+      packageConfig,
       flutterManifest,
       wildcardDirectories,
       assetBasePath,
@@ -170,14 +179,14 @@
     final List<Map<String, dynamic>> fonts = _parseFonts(
       flutterManifest,
       includeDefaultFonts,
-      packageMap,
+      packageConfig,
     );
 
     // Add fonts and assets from packages.
-    for (final String packageName in packageMap.map.keys) {
-      final Uri package = packageMap.map[packageName];
-      if (package != null && package.scheme == 'file') {
-        final String packageManifestPath = globals.fs.path.fromUri(package.resolve('../pubspec.yaml'));
+    for (final Package package in packageConfig.packages) {
+      final Uri packageUri = package.packageUriRoot;
+      if (packageUri != null && packageUri.scheme == 'file') {
+        final String packageManifestPath = globals.fs.path.fromUri(packageUri.resolve('../pubspec.yaml'));
         final FlutterManifest packageFlutterManifest = FlutterManifest.createFromPath(packageManifestPath);
         if (packageFlutterManifest == null) {
           continue;
@@ -189,11 +198,11 @@
         final String packageBasePath = globals.fs.path.dirname(packageManifestPath);
 
         final Map<_Asset, List<_Asset>> packageAssets = _parseAssets(
-          packageMap,
+          packageConfig,
           packageFlutterManifest,
           wildcardDirectories,
           packageBasePath,
-          packageName: packageName,
+          packageName: package.name,
         );
 
         if (packageAssets == null) {
@@ -204,8 +213,8 @@
         fonts.addAll(_parseFonts(
           packageFlutterManifest,
           includeDefaultFonts,
-          packageMap,
-          packageName: packageName,
+          packageConfig,
+          packageName: package.name,
         ));
       }
     }
@@ -253,7 +262,7 @@
     entries[kFontManifestJson] = DevFSStringContent(json.encode(fonts));
 
     // TODO(ianh): Only do the following line if we've changed packages or if our LICENSE file changed
-    final LicenseResult licenseResult = licenseCollector.obtainLicenses(packageMap);
+    final LicenseResult licenseResult = licenseCollector.obtainLicenses(packageConfig);
     entries[_license] = DevFSStringContent(licenseResult.combinedLicenses);
     additionalDependencies = licenseResult.dependencies;
 
@@ -383,18 +392,18 @@
 
   /// Obtain licenses from the `packageMap` into a single result.
   LicenseResult obtainLicenses(
-    PackageMap packageMap,
+    PackageConfig packageConfig,
   ) {
     final Map<String, Set<String>> packageLicenses = <String, Set<String>>{};
     final Set<String> allPackages = <String>{};
     final List<File> dependencies = <File>[];
 
-    for (final String packageName in packageMap.map.keys) {
-      final Uri package = packageMap.map[packageName];
-      if (package == null || package.scheme != 'file') {
+    for (final Package package in packageConfig.packages) {
+      final Uri packageUri = package.packageUriRoot;
+      if (packageUri == null || packageUri.scheme != 'file') {
         continue;
       }
-      final File file = _fileSystem.file(package.resolve('../LICENSE'));
+      final File file = _fileSystem.file(packageUri.resolve('../LICENSE'));
       if (!file.existsSync()) {
         continue;
       }
@@ -414,7 +423,7 @@
           }
         }
         if (licenseText == null) {
-          packageNames = <String>[packageName];
+          packageNames = <String>[package.name];
           licenseText = rawLicense;
         }
         packageLicenses.putIfAbsent(licenseText, () => <String>{})
@@ -476,7 +485,7 @@
 List<Map<String, dynamic>> _parseFonts(
   FlutterManifest manifest,
   bool includeDefaultFonts,
-  PackageMap packageMap, {
+  PackageConfig packageConfig, {
   String packageName,
 }) {
   return <Map<String, dynamic>>[
@@ -488,7 +497,7 @@
       ..._createFontsDescriptor(_parsePackageFonts(
         manifest,
         packageName,
-        packageMap,
+        packageConfig,
       )),
   ];
 }
@@ -498,7 +507,7 @@
 List<Font> _parsePackageFonts(
   FlutterManifest manifest,
   String packageName,
-  PackageMap packageMap,
+  PackageConfig packageConfig,
 ) {
   final List<Font> packageFonts = <Font>[];
   for (final Font font in manifest.fonts) {
@@ -506,7 +515,8 @@
     for (final FontAsset fontAsset in font.fontAssets) {
       final Uri assetUri = fontAsset.assetUri;
       if (assetUri.pathSegments.first == 'packages' &&
-          !globals.fs.isFileSync(globals.fs.path.fromUri(packageMap.map[packageName].resolve('../${assetUri.path}')))) {
+          !globals.fs.isFileSync(globals.fs.path.fromUri(
+            packageConfig[packageName].packageUriRoot.resolve('../${assetUri.path}')))) {
         packageFontAssets.add(FontAsset(
           fontAsset.assetUri,
           weight: fontAsset.weight,
@@ -605,7 +615,7 @@
 ///
 
 Map<_Asset, List<_Asset>> _parseAssets(
-  PackageMap packageMap,
+  PackageConfig packageConfig,
   FlutterManifest flutterManifest,
   List<Uri> wildcardDirectories,
   String assetBase, {
@@ -618,11 +628,11 @@
   for (final Uri assetUri in flutterManifest.assets) {
     if (assetUri.toString().endsWith('/')) {
       wildcardDirectories.add(assetUri);
-      _parseAssetsFromFolder(packageMap, flutterManifest, assetBase,
+      _parseAssetsFromFolder(packageConfig, flutterManifest, assetBase,
           cache, result, assetUri,
           excludeDirs: excludeDirs, packageName: packageName);
     } else {
-      _parseAssetFromFile(packageMap, flutterManifest, assetBase,
+      _parseAssetFromFile(packageConfig, flutterManifest, assetBase,
           cache, result, assetUri,
           excludeDirs: excludeDirs, packageName: packageName);
     }
@@ -632,7 +642,7 @@
   for (final Font font in flutterManifest.fonts) {
     for (final FontAsset fontAsset in font.fontAssets) {
       final _Asset baseAsset = _resolveAsset(
-        packageMap,
+        packageConfig,
         assetBase,
         fontAsset.assetUri,
         packageName,
@@ -650,7 +660,7 @@
 }
 
 void _parseAssetsFromFolder(
-  PackageMap packageMap,
+  PackageConfig packageConfig,
   FlutterManifest flutterManifest,
   String assetBase,
   _AssetDirectoryCache cache,
@@ -675,14 +685,14 @@
 
       final Uri uri = Uri.file(relativePath, windows: globals.platform.isWindows);
 
-      _parseAssetFromFile(packageMap, flutterManifest, assetBase, cache, result,
+      _parseAssetFromFile(packageConfig, flutterManifest, assetBase, cache, result,
           uri, packageName: packageName);
     }
   }
 }
 
 void _parseAssetFromFile(
-  PackageMap packageMap,
+  PackageConfig packageConfig,
   FlutterManifest flutterManifest,
   String assetBase,
   _AssetDirectoryCache cache,
@@ -692,7 +702,7 @@
   String packageName,
 }) {
   final _Asset asset = _resolveAsset(
-    packageMap,
+    packageConfig,
     assetBase,
     assetUri,
     packageName,
@@ -718,7 +728,7 @@
 }
 
 _Asset _resolveAsset(
-  PackageMap packageMap,
+  PackageConfig packageConfig,
   String assetsBaseDir,
   Uri assetUri,
   String packageName,
@@ -727,7 +737,7 @@
   if (assetUri.pathSegments.first == 'packages' && !globals.fs.isFileSync(globals.fs.path.join(assetsBaseDir, assetPath))) {
     // The asset is referenced in the pubspec.yaml as
     // 'packages/PACKAGE_NAME/PATH/TO/ASSET .
-    final _Asset packageAsset = _resolvePackageAsset(assetUri, packageMap);
+    final _Asset packageAsset = _resolvePackageAsset(assetUri, packageConfig);
     if (packageAsset != null) {
       return packageAsset;
     }
@@ -742,11 +752,11 @@
   );
 }
 
-_Asset _resolvePackageAsset(Uri assetUri, PackageMap packageMap) {
+_Asset _resolvePackageAsset(Uri assetUri, PackageConfig packageConfig) {
   assert(assetUri.pathSegments.first == 'packages');
   if (assetUri.pathSegments.length > 1) {
     final String packageName = assetUri.pathSegments[1];
-    final Uri packageUri = packageMap.map[packageName];
+    final Uri packageUri = packageConfig[packageName]?.packageUriRoot;
     if (packageUri != null && packageUri.scheme == 'file') {
       return _Asset(
         baseDir: globals.fs.path.fromUri(packageUri),
diff --git a/packages/flutter_tools/test/general.shard/license_collector_test.dart b/packages/flutter_tools/test/general.shard/license_collector_test.dart
index a41a9a4..a1f5c31 100644
--- a/packages/flutter_tools/test/general.shard/license_collector_test.dart
+++ b/packages/flutter_tools/test/general.shard/license_collector_test.dart
@@ -5,7 +5,9 @@
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/asset.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/dart/package_map.dart';
+import 'package:flutter_tools/src/convert.dart';
+import 'package:package_config/package_config.dart';
+import 'package:package_config/package_config_types.dart';
 
 import '../src/common.dart';
 
@@ -246,7 +248,7 @@
     licenseCollector = LicenseCollector(fileSystem: fileSystem);
   });
 
-  testWithoutContext('processes dependant licenses according to instructions', () {
+  testWithoutContext('processes dependent licenses according to instructions', () async {
     fileSystem.file('foo/LICENSE')
       ..createSync(recursive: true)
       ..writeAsStringSync(_kMitLicense);
@@ -257,13 +259,34 @@
       ..createSync(recursive: true)
       ..writeAsStringSync(_kMitLicense); // intentionally a duplicate
 
-    final PackageMap packageMap = PackageMap.test(<String, Uri>{
-      'foo': Uri.parse('file:///foo/lib/'),
-      'bar': Uri.parse('file:///bar/lib/'),
-      'fizz': Uri.parse('file:///fizz/lib/'),
-    }, fileSystem: fileSystem);
-
-    final LicenseResult result = licenseCollector.obtainLicenses(packageMap);
+    final File packageConfigFile = fileSystem.file('package_config.json')
+      ..writeAsStringSync(json.encode(
+        <String, Object>{
+          'configVersion': 2,
+          'packages': <Object>[
+            <String, Object>{
+              'name': 'foo',
+              'rootUri': 'file:///foo/',
+              'packageUri': 'lib/',
+              'languageVersion': '2.2'
+            },
+            <String, Object>{
+              'name': 'bar',
+              'rootUri': 'file:///bar/',
+              'packageUri': 'lib/',
+              'languageVersion': '2.2'
+            },
+            <String, Object>{
+              'name': 'fizz',
+              'rootUri': 'file:///fizz/',
+              'packageUri': 'lib/',
+              'languageVersion': '2.2'
+            },
+          ],
+        }
+      ));
+    final PackageConfig packageConfig = await loadPackageConfig(packageConfigFile.absolute);
+    final LicenseResult result = licenseCollector.obtainLicenses(packageConfig);
 
     // All included licenses are combined in the result.
     expect(result.combinedLicenses, contains(_kApacheLicense));