Add Android embedding version analytics (#44043)
diff --git a/packages/flutter_tools/lib/src/commands/packages.dart b/packages/flutter_tools/lib/src/commands/packages.dart index d6aeeb0..cf2689c 100644 --- a/packages/flutter_tools/lib/src/commands/packages.dart +++ b/packages/flutter_tools/lib/src/commands/packages.dart
@@ -87,6 +87,8 @@ usageValues[CustomDimensions.commandPackagesNumberPlugins] = '0'; } usageValues[CustomDimensions.commandPackagesProjectModule] = '${rootProject.isModule}'; + usageValues[CustomDimensions.commandPackagesAndroidEmbeddingVersion] = + rootProject.android.getEmbeddingVersion().toString().split('.').last; return usageValues; }
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index fd6dc53..6bd40df 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -250,6 +250,7 @@ CustomDimensions.commandRunModeName: modeName, CustomDimensions.commandRunProjectModule: '${FlutterProject.current().isModule}', CustomDimensions.commandRunProjectHostLanguage: hostLanguage.join(','), + CustomDimensions.commandRunAndroidEmbeddingVersion: androidProject.getEmbeddingVersion().toString().split('.').last, }; }
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart index da994b4..613400c 100644 --- a/packages/flutter_tools/lib/src/plugins.dart +++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -5,7 +5,6 @@ import 'dart:async'; import 'package:mustache/mustache.dart' as mustache; -import 'package:xml/xml.dart' as xml; import 'package:yaml/yaml.dart'; import 'android/gradle.dart'; @@ -364,30 +363,10 @@ /// Returns the version of the Android embedding that the current /// [project] is using. -String _getAndroidEmbeddingVersion(FlutterProject project) { +AndroidEmbeddingVersion _getAndroidEmbeddingVersion(FlutterProject project) { assert(project.android != null); - final File androidManifest = project.android.appManifestFile; - if (androidManifest == null || !androidManifest.existsSync()) { - return '1'; - } - xml.XmlDocument document; - try { - document = xml.parse(androidManifest.readAsStringSync()); - } on xml.XmlParserException { - throwToolExit('Error parsing ${project.android.appManifestFile} ' - 'Please ensure that the android manifest is a valid XML document and try again.'); - } on FileSystemException { - throwToolExit('Error reading ${project.android.appManifestFile} even though it exists. ' - 'Please ensure that you have read permission to this file and try again.'); - } - for (xml.XmlElement metaData in document.findAllElements('meta-data')) { - final String name = metaData.getAttribute('android:name'); - if (name == 'flutterEmbedding') { - return metaData.getAttribute('android:value'); - } - } - return '1'; + return project.android.getEmbeddingVersion(); } Future<void> _writeAndroidPluginRegistrant(FlutterProject project, List<Plugin> plugins) async { @@ -412,9 +391,9 @@ 'GeneratedPluginRegistrant.java', ); String templateContent; - final String appEmbeddingVersion = _getAndroidEmbeddingVersion(project); + final AndroidEmbeddingVersion appEmbeddingVersion = _getAndroidEmbeddingVersion(project); switch (appEmbeddingVersion) { - case '2': + case AndroidEmbeddingVersion.v2: templateContext['needsShim'] = false; // If a plugin is using an embedding version older than 2.0 and the app is using 2.0, // then add shim for the old plugins. @@ -425,8 +404,9 @@ } } templateContent = _androidPluginRegistryTemplateNewEmbedding; - break; - case '1': + break; + case AndroidEmbeddingVersion.v1: + default: for (Map<String, dynamic> plugin in androidPlugins) { if (!plugin['supportsEmbeddingV1'] && plugin['supportsEmbeddingV2']) { throwToolExit( @@ -437,9 +417,7 @@ } } templateContent = _androidPluginRegistryTemplateOldEmbedding; - break; - default: - throwToolExit('Unsupported Android embedding'); + break; } printTrace('Generating $registryPath'); _renderTemplateToFile(
diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 5bc5c77..f8e8576 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart
@@ -5,6 +5,7 @@ import 'dart:async'; import 'package:meta/meta.dart'; +import 'package:xml/xml.dart' as xml; import 'package:yaml/yaml.dart'; import 'android/gradle_utils.dart' as gradle; @@ -642,6 +643,43 @@ overwriteExisting: true, ); } + + AndroidEmbeddingVersion getEmbeddingVersion() { + if (appManifestFile == null || !appManifestFile.existsSync()) { + return AndroidEmbeddingVersion.v1; + } + xml.XmlDocument document; + try { + document = xml.parse(appManifestFile.readAsStringSync()); + } on xml.XmlParserException { + throwToolExit('Error parsing $appManifestFile ' + 'Please ensure that the android manifest is a valid XML document and try again.'); + } on FileSystemException { + throwToolExit('Error reading $appManifestFile even though it exists. ' + 'Please ensure that you have read permission to this file and try again.'); + } + for (xml.XmlElement metaData in document.findAllElements('meta-data')) { + final String name = metaData.getAttribute('android:name'); + if (name == 'flutterEmbedding') { + final String embeddingVersionString = metaData.getAttribute('android:value'); + if (embeddingVersionString == '1') { + return AndroidEmbeddingVersion.v1; + } + if (embeddingVersionString == '2') { + return AndroidEmbeddingVersion.v2; + } + } + } + return AndroidEmbeddingVersion.v1; + } +} + +/// Iteration of the embedding Java API in the engine used by the Android project. +enum AndroidEmbeddingVersion { + /// V1 APIs based on io.flutter.app.FlutterActivity. + v1, + /// V2 APIs based on io.flutter.embedding.android.FlutterActivity. + v2, } /// Represents the web sub-project of a Flutter project.
diff --git a/packages/flutter_tools/lib/src/reporting/usage.dart b/packages/flutter_tools/lib/src/reporting/usage.dart index e737439..d352632 100644 --- a/packages/flutter_tools/lib/src/reporting/usage.dart +++ b/packages/flutter_tools/lib/src/reporting/usage.dart
@@ -55,6 +55,8 @@ commandBuildAppBundleBuildMode, // cd42 buildEventError, // cd43 commandResultEventMaxRss, // cd44 + commandRunAndroidEmbeddingVersion, // cd45 + commandPackagesAndroidEmbeddingVersion, // cd46 } String cdKey(CustomDimensions cd) => 'cd${cd.index + 1}';