mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

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>
179 lines
6.0 KiB
Dart
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());
|
|
}
|
|
});
|
|
}
|