Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 79e9237

Browse files
committed
Update android_lint deps
1 parent 76310c4 commit 79e9237

File tree

2 files changed

+231
-218
lines changed

2 files changed

+231
-218
lines changed

tools/android_lint/bin/main.dart

Lines changed: 7 additions & 218 deletions
Original file line numberDiff line numberDiff line change
@@ -2,223 +2,12 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'dart:io';
5+
// @dart=2.9
66

7-
import 'package:args/args.dart';
8-
import 'package:path/path.dart' as path;
9-
import 'package:process/process.dart';
7+
import 'sound_main.dart' as m;
108

11-
const LocalProcessManager processManager = LocalProcessManager();
12-
13-
/// Runs the Android SDK Lint tool on flutter/shell/platform/android.
14-
///
15-
/// This script scans the flutter/shell/platform/android directory for Java
16-
/// files to build a `project.xml` file. This file is then passed to the lint
17-
/// tool. If an `--html` flag is also passed in, HTML output is reqeusted in the
18-
/// directory for the optional `--out` parameter, which defaults to
19-
/// `lint_report`. Otherwise the output is printed to STDOUT.
20-
///
21-
/// The `--in` parameter may be specified to force this script to scan a
22-
/// specific location for the engine repository, and expects to be given the
23-
/// `src` directory that contains both `third_party` and `flutter`.
24-
///
25-
/// At the time of this writing, the Android Lint tool doesn't work well with
26-
/// Java > 1.8. This script will print a warning if you are not running
27-
/// Java 1.8.
28-
Future<void> main(List<String> args) async {
29-
final ArgParser argParser = setupOptions();
30-
await checkJava1_8();
31-
final int exitCode = await runLint(argParser, argParser.parse(args));
32-
exit(exitCode);
33-
}
34-
35-
Future<int> runLint(ArgParser argParser, ArgResults argResults) async {
36-
final Directory androidDir = Directory(path.join(
37-
argResults['in'],
38-
'flutter',
39-
'shell',
40-
'platform',
41-
'android',
42-
));
43-
if (!androidDir.existsSync()) {
44-
print('This command must be run from the engine/src directory, '
45-
'or be passed that directory as the --in parameter.\n');
46-
print(argParser.usage);
47-
return -1;
48-
}
49-
50-
final Directory androidSdkDir = Directory(
51-
path.join(argResults['in'], 'third_party', 'android_tools', 'sdk'),
52-
);
53-
54-
if (!androidSdkDir.existsSync()) {
55-
print('The Android SDK for this engine is missing from the '
56-
'third_party/android_tools directory. Have you run gclient sync?\n');
57-
print(argParser.usage);
58-
return -1;
59-
}
60-
61-
if (argResults['rebaseline']) {
62-
print('Removing previous baseline.xml...');
63-
final File baselineXml = File(baselineXmlPath);
64-
if (baselineXml.existsSync()) {
65-
await baselineXml.delete();
66-
}
67-
}
68-
print('Preparing project.xml...');
69-
final IOSink projectXml = File(projectXmlPath).openWrite();
70-
projectXml.write(
71-
'''<!-- THIS FILE IS GENERATED. PLEASE USE THE INCLUDED DART PROGRAM WHICH -->
72-
<!-- WILL AUTOMATICALLY FIND ALL .java FILES AND INCLUDE THEM HERE -->
73-
<project>
74-
<sdk dir="${androidSdkDir.path}" />
75-
<module name="FlutterEngine" android="true" library="true" compile-sdk-version="android-P">
76-
<manifest file="${path.join(androidDir.path, 'AndroidManifest.xml')}" />
77-
''');
78-
for (final FileSystemEntity entity in androidDir.listSync(recursive: true)) {
79-
if (!entity.path.endsWith('.java')) {
80-
continue;
81-
}
82-
projectXml.writeln(' <src file="${entity.path}" />');
83-
}
84-
85-
projectXml.write(''' </module>
86-
</project>
87-
''');
88-
await projectXml.close();
89-
90-
print('Wrote project.xml, starting lint...');
91-
final List<String> lintArgs = <String>[
92-
path.join(androidSdkDir.path, 'tools', 'bin', 'lint'),
93-
'--project',
94-
projectXmlPath,
95-
'--showall',
96-
'--exitcode', // Set non-zero exit code on errors
97-
'-Wall',
98-
'-Werror',
99-
'--baseline',
100-
baselineXmlPath,
101-
];
102-
if (argResults['html']) {
103-
lintArgs.addAll(<String>['--html', argResults['out']]);
104-
}
105-
final String? javaHome = await getJavaHome();
106-
final Process lintProcess = await processManager.start(
107-
lintArgs,
108-
environment: javaHome != null
109-
? <String, String>{
110-
'JAVA_HOME': javaHome,
111-
}
112-
: null,
113-
);
114-
lintProcess.stdout.pipe(stdout);
115-
lintProcess.stderr.pipe(stderr);
116-
return await lintProcess.exitCode;
117-
}
118-
119-
/// Prepares an [ArgParser] for this script.
120-
ArgParser setupOptions() {
121-
final ArgParser argParser = ArgParser();
122-
argParser
123-
..addOption(
124-
'in',
125-
help: 'The path to `engine/src`.',
126-
defaultsTo: path.relative(
127-
path.join(
128-
projectDir,
129-
'..',
130-
'..',
131-
'..',
132-
),
133-
),
134-
)
135-
..addFlag(
136-
'help',
137-
help: 'Print usage of the command.',
138-
negatable: false,
139-
defaultsTo: false,
140-
)
141-
..addFlag(
142-
'rebaseline',
143-
help: 'Recalculates the baseline for errors and warnings '
144-
'in this project.',
145-
negatable: false,
146-
defaultsTo: false,
147-
)
148-
..addFlag(
149-
'html',
150-
help: 'Creates an HTML output for this report instead of printing '
151-
'command line output.',
152-
negatable: false,
153-
defaultsTo: false,
154-
)
155-
..addOption(
156-
'out',
157-
help: 'The path to write the generated HTML report. Ignored if '
158-
'--html is not also true.',
159-
defaultsTo: path.join(projectDir, 'lint_report'),
160-
);
161-
162-
return argParser;
163-
}
164-
165-
/// On macOS, we can try to find Java 1.8.
166-
///
167-
/// Otherwise, default to whatever JAVA_HOME is already.
168-
Future<String?> getJavaHome() async {
169-
if (Platform.isMacOS) {
170-
final ProcessResult result = await processManager.run(
171-
<String>['/usr/libexec/java_home', '-v', '1.8', '-F'],
172-
);
173-
if (result.exitCode == 0) {
174-
return result.stdout.trim();
175-
}
176-
}
177-
return Platform.environment['JAVA_HOME'];
178-
}
179-
180-
/// Checks that `java` points to Java 1.8.
181-
///
182-
/// The SDK lint tool may not work with Java > 1.8.
183-
Future<void> checkJava1_8() async {
184-
print('Checking Java version...');
185-
186-
if (Platform.isMacOS) {
187-
final ProcessResult result = await processManager.run(
188-
<String>['/usr/libexec/java_home', '-v', '1.8', '-F'],
189-
);
190-
if (result.exitCode != 0) {
191-
print('Java 1.8 not available - the linter may not work properly.');
192-
}
193-
return;
194-
}
195-
final ProcessResult javaResult = await processManager.run(
196-
<String>['java', '-version'],
197-
);
198-
if (javaResult.exitCode != 0) {
199-
print('Could not run "java -version". '
200-
'Ensure Java is installed and available on your path.');
201-
print(javaResult.stderr);
202-
}
203-
// `java -version` writes to stderr.
204-
final String javaVersionStdout = javaResult.stderr;
205-
if (!javaVersionStdout.contains('"1.8')) {
206-
print('The Android SDK tools may not work properly with your Java version. '
207-
'If this process fails, please retry using Java 1.8.');
208-
}
209-
}
210-
211-
/// The root directory of this project.
212-
String get projectDir => path.dirname(
213-
path.dirname(
214-
path.fromUri(Platform.script),
215-
),
216-
);
217-
218-
/// The path to use for project.xml, which tells the linter where to find source
219-
/// files.
220-
String get projectXmlPath => path.join(projectDir, 'project.xml');
221-
222-
/// The path to use for baseline.xml, which tells the linter what errors or
223-
/// warnings to ignore.
224-
String get baselineXmlPath => path.join(projectDir, 'baseline.xml');
9+
// TODO(#72542):
10+
// Migrate the deps in pubspec.yaml to null-safety versions.
11+
// In particular see the ongoing work on package:args here:
12+
// https://github.com/dart-lang/args/issues/153
13+
Future<void> main(List<String> args) => m.main(args);

0 commit comments

Comments
 (0)