Unverified Commit dd6a11b7 authored by Gary Qian's avatar Gary Qian Committed by GitHub

Add reason logging to v1 embedding warning message (#94636)

parent a607a60b
......@@ -546,7 +546,8 @@ class AndroidProject extends FlutterProjectPlatform {
}
void checkForDeprecation({DeprecationBehavior deprecationBehavior = DeprecationBehavior.none}) {
if (getEmbeddingVersion() == AndroidEmbeddingVersion.v1) {
final AndroidEmbeddingVersionResult result = computeEmbeddingVersion();
if (result.version == AndroidEmbeddingVersion.v1) {
globals.printStatus(
'''
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
......@@ -562,6 +563,10 @@ to migrate your project. You may also pass the --ignore-deprecation flag to
ignore this check and continue with the deprecated v1 embedding. However,
the v1 Android embedding will be removed in future versions of Flutter.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
The detected reason was:
${result.reason}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'''
);
switch (deprecationBehavior) {
......@@ -581,13 +586,17 @@ the v1 Android embedding will be removed in future versions of Flutter.
}
AndroidEmbeddingVersion getEmbeddingVersion() {
return computeEmbeddingVersion().version;
}
AndroidEmbeddingVersionResult computeEmbeddingVersion() {
if (isModule) {
// A module type's Android project is used in add-to-app scenarios and
// only supports the V2 embedding.
return AndroidEmbeddingVersion.v2;
return AndroidEmbeddingVersionResult(AndroidEmbeddingVersion.v2, 'Is add-to-app module');
}
if (appManifestFile == null || !appManifestFile.existsSync()) {
return AndroidEmbeddingVersion.v1;
return AndroidEmbeddingVersionResult(AndroidEmbeddingVersion.v1, 'No `${appManifestFile.absolute.path}` file');
}
XmlDocument document;
try {
......@@ -602,7 +611,7 @@ the v1 Android embedding will be removed in future versions of Flutter.
for (final XmlElement application in document.findAllElements('application')) {
final String? applicationName = application.getAttribute('android:name');
if (applicationName == 'io.flutter.app.FlutterApplication') {
return AndroidEmbeddingVersion.v1;
return AndroidEmbeddingVersionResult(AndroidEmbeddingVersion.v1, '${appManifestFile.absolute.path} uses `android:name="io.flutter.app.FutterApplication"`');
}
}
for (final XmlElement metaData in document.findAllElements('meta-data')) {
......@@ -610,14 +619,14 @@ the v1 Android embedding will be removed in future versions of Flutter.
if (name == 'flutterEmbedding') {
final String? embeddingVersionString = metaData.getAttribute('android:value');
if (embeddingVersionString == '1') {
return AndroidEmbeddingVersion.v1;
return AndroidEmbeddingVersionResult(AndroidEmbeddingVersion.v1, '${appManifestFile.absolute.path} `<meta-data android:name="flutterEmbedding"` has value 1');
}
if (embeddingVersionString == '2') {
return AndroidEmbeddingVersion.v2;
return AndroidEmbeddingVersionResult(AndroidEmbeddingVersion.v2, '${appManifestFile.absolute.path} `<meta-data android:name="flutterEmbedding"` has value 2');
}
}
}
return AndroidEmbeddingVersion.v1;
return AndroidEmbeddingVersionResult(AndroidEmbeddingVersion.v1, 'No `<meta-data android:name="flutterEmbedding" android:value="2"/>` in ${appManifestFile.absolute.path}');
}
}
......@@ -629,6 +638,19 @@ enum AndroidEmbeddingVersion {
v2,
}
/// Data class that holds the results of checking for embedding version.
///
/// This class includes the reason why a particular embedding was selected.
class AndroidEmbeddingVersionResult {
AndroidEmbeddingVersionResult(this.version, this.reason);
/// The embedding version.
AndroidEmbeddingVersion version;
/// The reason why the embedding version was selected.
String reason;
}
// What the tool should do when encountering deprecated API in applications.
enum DeprecationBehavior {
// The command being run does not care about deprecation status.
......
......@@ -1632,6 +1632,11 @@ class FakeAndroidProject extends Fake implements AndroidProject {
AndroidEmbeddingVersion getEmbeddingVersion() {
return embeddingVersion;
}
@override
AndroidEmbeddingVersionResult computeEmbeddingVersion() {
return AndroidEmbeddingVersionResult(embeddingVersion, 'reasons for version');
}
}
class FakeWebProject extends Fake implements WebProject {
......
......@@ -196,6 +196,7 @@ void main() {
contains('Build failed due to use of deprecated Android v1 embedding.')
);
expect(testLogger.statusText, contains('https://flutter.dev/go/android-project-migration'));
expect(testLogger.statusText, contains('No `<meta-data android:name="flutterEmbedding" android:value="2"/>` in '));
});
_testInMemory('Android project not on v2 embedding ignore continues', () async {
final FlutterProject project = await someProject();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment