flutter/dev/devicelab/bin/tasks/gradle_plugin_fat_apk_test.dart
Gray Mackall e2dea95082
Fix warnings in FGP (#166727)
Fixes/suppresses all warnings:

1. Fixes https://github.com/flutter/flutter/issues/162695
2. Suppresses warnings about the various `*Variant*` imports that we use
being deprecated, with comments linking to
https://github.com/flutter/flutter/issues/166550 to migrate to the
variant api.
3. Fixes some unused elvis operators and unneeded types provided for
declarations that AGP complains about, e.g. `val fooString: String = "a
string"`, and use of deprecated string related methods.
4. Follows up on https://github.com/flutter/flutter/pull/166277, as we
were getting a warning mentioned in this comment
https://github.com/flutter/flutter/pull/166277#issuecomment-2780184486.
5. Suppresses some warnings about unused code where the analysis
couldn't properly detect it being used (i.e., it isn't unused)

(4) is more opinionated, let me know if you think it should be done in a
follow up.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md

---------

Co-authored-by: Gray Mackall <mackall@google.com>
2025-04-08 18:37:14 +00:00

179 lines
6.0 KiB
Dart

// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter_devicelab/framework/apk_utils.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/task_result.dart';
import 'package:flutter_devicelab/framework/utils.dart';
import 'package:path/path.dart' as path;
Future<void> main() async {
await task(() async {
try {
await runPluginProjectTest((FlutterPluginProject pluginProject) async {
section('APK content for task assembleDebug without explicit target platform');
await inDirectory(pluginProject.exampleAndroidPath, () {
return flutter('build', options: <String>['apk', '--debug']);
});
Iterable<String> apkFiles = await getFilesInApk(pluginProject.debugApkPath);
checkCollectionContains<String>(<String>[
...flutterAssets,
...debugAssets,
...baseApkFiles,
'lib/armeabi-v7a/libflutter.so',
'lib/arm64-v8a/libflutter.so',
// Debug mode intentionally includes `x86` and `x86_64`.
'lib/x86/libflutter.so',
'lib/x86_64/libflutter.so',
], apkFiles);
checkCollectionDoesNotContain<String>(<String>[
'lib/arm64-v8a/libapp.so',
'lib/armeabi-v7a/libapp.so',
'lib/x86/libapp.so',
'lib/x86_64/libapp.so',
], apkFiles);
section('APK content for task assembleRelease without explicit target platform');
await inDirectory(pluginProject.exampleAndroidPath, () {
return flutter('build', options: <String>['apk', '--release']);
});
apkFiles = await getFilesInApk(pluginProject.releaseApkPath);
checkCollectionContains<String>(<String>[
...flutterAssets,
...baseApkFiles,
'lib/armeabi-v7a/libflutter.so',
'lib/armeabi-v7a/libapp.so',
'lib/arm64-v8a/libflutter.so',
'lib/arm64-v8a/libapp.so',
'lib/x86_64/libflutter.so',
'lib/x86_64/libapp.so',
], apkFiles);
checkCollectionDoesNotContain<String>(debugAssets, apkFiles);
section(
'APK content for task assembleRelease with target platform = android-arm, android-arm64',
);
await inDirectory(pluginProject.exampleAndroidPath, () {
return flutter(
'build',
options: <String>['apk', '--release', '--target-platform=android-arm,android-arm64'],
);
});
apkFiles = await getFilesInApk(pluginProject.releaseApkPath);
checkCollectionContains<String>(<String>[
...flutterAssets,
...baseApkFiles,
'lib/armeabi-v7a/libflutter.so',
'lib/armeabi-v7a/libapp.so',
'lib/arm64-v8a/libflutter.so',
'lib/arm64-v8a/libapp.so',
], apkFiles);
checkCollectionDoesNotContain<String>(debugAssets, apkFiles);
section(
'APK content for task assembleRelease with '
'target platform = android-arm, android-arm64 and split per ABI',
);
await inDirectory(pluginProject.exampleAndroidPath, () {
return flutter(
'build',
options: <String>[
'apk',
'--release',
'--split-per-abi',
'--target-platform=android-arm,android-arm64',
],
);
});
final Iterable<String> armApkFiles = await getFilesInApk(pluginProject.releaseArmApkPath);
checkCollectionContains<String>(<String>[
...flutterAssets,
...baseApkFiles,
'lib/armeabi-v7a/libflutter.so',
'lib/armeabi-v7a/libapp.so',
], armApkFiles);
checkCollectionDoesNotContain<String>(debugAssets, armApkFiles);
final Iterable<String> arm64ApkFiles = await getFilesInApk(
pluginProject.releaseArm64ApkPath,
);
checkCollectionContains<String>(<String>[
...flutterAssets,
...baseApkFiles,
'lib/arm64-v8a/libflutter.so',
'lib/arm64-v8a/libapp.so',
], arm64ApkFiles);
checkCollectionDoesNotContain<String>(debugAssets, arm64ApkFiles);
});
await runProjectTest((FlutterProject project) async {
section('gradlew assembleRelease');
await inDirectory(project.rootPath, () {
return flutter('build', options: <String>['apk', '--release']);
});
// When the platform-target isn't specified, we generate the snapshots
// for arm and arm64.
final List<String> targetPlatforms = <String>['arm64-v8a', 'armeabi-v7a'];
for (final String targetPlatform in targetPlatforms) {
final String androidArmSnapshotPath = path.join(
project.rootPath,
'build',
'app',
'intermediates',
'flutter',
'release',
targetPlatform,
);
final String sharedLibrary = path.join(androidArmSnapshotPath, 'app.so');
if (!File(sharedLibrary).existsSync()) {
throw TaskResult.failure("Shared library doesn't exist");
}
}
section('AGP cxx build artifacts');
final String defaultPath = path.join(project.rootPath, 'android', 'app', '.cxx');
final String modifiedPath = path.join(project.rootPath, 'build', '.cxx');
if (Directory(defaultPath).existsSync()) {
throw TaskResult.failure('Producing unexpected build artifacts in $defaultPath');
}
if (!Directory(modifiedPath).existsSync()) {
throw TaskResult.failure(
'Not producing external native build output directory in $modifiedPath',
);
}
});
return TaskResult.success(null);
} on TaskResult catch (taskResult) {
return taskResult;
} catch (e) {
return TaskResult.failure(e.toString());
}
});
}