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

Commit a2246c1

Browse files
authored
Start of linting Android embedding (#8023)
* Add a tool for running Android SDK lint on Android embedding
1 parent 48bf480 commit a2246c1

File tree

5 files changed

+236
-1
lines changed

5 files changed

+236
-1
lines changed

shell/platform/android/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
-->
66
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.flutter.app" android:versionCode="1" android:versionName="0.0.1">
77

8-
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
8+
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21" />
99
<uses-permission android:name="android.permission.INTERNET" />
1010
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1111
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />

tools/android_lint/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lint_report/

tools/android_lint/bin/main.dart

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'dart:io';
6+
7+
import 'package:args/args.dart';
8+
import 'package:path/path.dart' as path;
9+
import 'package:process/process.dart';
10+
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 and HTML output is reqeusted in the directory for the `--out`
18+
/// parameter, which defaults to `lint_report`.
19+
///
20+
/// The `--in` parameter may be specified to force this script to scan a
21+
/// specific location for the engine repository, and expects to be given the
22+
/// `src` directory that contains both `third_party` and `flutter`.
23+
///
24+
/// At the time of this writing, the Android Lint tool doesn't work well with
25+
/// Java > 1.8. This script will print a warning if you are not running
26+
/// Java 1.8.
27+
Future<void> main(List<String> args) async {
28+
final ArgParser argParser = setupOptions();
29+
await checkJava1_8();
30+
final int exitCode = await runLint(argParser, argParser.parse(args));
31+
exit(exitCode);
32+
}
33+
34+
Future<int> runLint(ArgParser argParser, ArgResults argResults) async {
35+
final Directory androidDir = Directory(path.join(
36+
argResults['in'],
37+
'flutter',
38+
'shell',
39+
'platform',
40+
'android',
41+
));
42+
if (!androidDir.existsSync()) {
43+
print('This command must be run from the engine/src directory, '
44+
'or be passed that directory as the --in parameter.\n');
45+
print(argParser.usage);
46+
return -1;
47+
}
48+
49+
final Directory androidSdkDir = Directory(
50+
path.join(argResults['in'], 'third_party', 'android_tools', 'sdk'),
51+
);
52+
53+
if (!androidSdkDir.existsSync()) {
54+
print('The Android SDK for this engine is missing from the '
55+
'third_party/android_tools directory. Have you run gclient sync?\n');
56+
print(argParser.usage);
57+
return -1;
58+
}
59+
60+
final IOSink projectXml = File('./project.xml').openWrite();
61+
projectXml.write(
62+
'''<!-- THIS FILE IS GENERATED. PLEASE USE THE INCLUDED DART PROGRAM WHICH -->
63+
<!-- WILL AUTOMATICALLY FIND ALL .java FILES AND INCLUDE THEM HERE -->
64+
<project>
65+
<sdk dir="${androidSdkDir.path}" />
66+
<module name="FlutterEngine" android="true" library="true" compile-sdk-version="android-P">
67+
<manifest file="${path.join(androidDir.path, 'AndroidManifest.xml')}" />
68+
''');
69+
for (final FileSystemEntity entity in androidDir.listSync(recursive: true)) {
70+
if (!entity.path.endsWith('.java')) {
71+
continue;
72+
}
73+
projectXml.writeln(' <src file="${entity.path}" />');
74+
}
75+
76+
projectXml.write(''' </module>
77+
</project>
78+
''');
79+
await projectXml.close();
80+
81+
print('Wrote project.xml, starting lint...');
82+
final ProcessResult result = await processManager.run(
83+
<String>[
84+
path.join(androidSdkDir.path, 'tools', 'bin', 'lint'),
85+
'--project',
86+
'./project.xml',
87+
'--html',
88+
argResults['out'],
89+
'--showall',
90+
'--exitcode', // Set non-zero exit code on errors
91+
'-Wall',
92+
'-Werror',
93+
],
94+
);
95+
if (result.stderr != null) {
96+
print('Lint tool had internal errors:');
97+
print(result.stderr);
98+
}
99+
print(result.stdout);
100+
return result.exitCode;
101+
}
102+
103+
ArgParser setupOptions() {
104+
final ArgParser argParser = ArgParser();
105+
argParser.addOption(
106+
'in',
107+
help: 'The path to `engine/src`.',
108+
defaultsTo: path.relative(
109+
path.join(
110+
path.dirname(
111+
path.dirname(path.dirname(path.fromUri(Platform.script))),
112+
),
113+
'..',
114+
'..',
115+
),
116+
),
117+
);
118+
argParser.addOption(
119+
'out',
120+
help: 'The path to write the generated the HTML report to.',
121+
defaultsTo: 'lint_report',
122+
);
123+
argParser.addFlag(
124+
'help',
125+
help: 'Print usage of the command.',
126+
negatable: false,
127+
defaultsTo: false,
128+
);
129+
130+
return argParser;
131+
}
132+
133+
Future<void> checkJava1_8() async {
134+
print('Checking Java version...');
135+
final ProcessResult javaResult = await processManager.run(
136+
<String>['java', '-version'],
137+
);
138+
if (javaResult.exitCode != 0) {
139+
print('Could not run "java -version". '
140+
'Ensure Java is installed and available on your path.');
141+
print(javaResult.stderr);
142+
}
143+
final String javaVersionStdout = javaResult.stdout;
144+
if (javaVersionStdout.contains('"1.8')) {
145+
print('The Android SDK tools may not work properly with your Java version. '
146+
'If this process fails, please retry using Java 1.8.');
147+
}
148+
}

tools/android_lint/project.xml

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<!-- THIS FILE IS GENERATED. PLEASE USE THE INCLUDED DART PROGRAM WHICH -->
2+
<!-- WILL AUTOMATICALLY FIND ALL .java FILES AND INCLUDE THEM HERE -->
3+
<project>
4+
<sdk dir="../../../third_party/android_tools/sdk" />
5+
<module name="FlutterEngine" android="true" library="true" compile-sdk-version="android-P">
6+
<manifest file="../../../flutter/shell/platform/android/AndroidManifest.xml" />
7+
<src file="../../../flutter/shell/platform/android/io/flutter/app/FlutterPluginRegistry.java" />
8+
<src file="../../../flutter/shell/platform/android/io/flutter/app/FlutterFragmentActivity.java" />
9+
<src file="../../../flutter/shell/platform/android/io/flutter/app/FlutterActivity.java" />
10+
<src file="../../../flutter/shell/platform/android/io/flutter/app/FlutterActivityEvents.java" />
11+
<src file="../../../flutter/shell/platform/android/io/flutter/app/FlutterApplication.java" />
12+
<src file="../../../flutter/shell/platform/android/io/flutter/app/FlutterActivityDelegate.java" />
13+
<src file="../../../flutter/shell/platform/android/io/flutter/util/Preconditions.java" />
14+
<src file="../../../flutter/shell/platform/android/io/flutter/util/Predicate.java" />
15+
<src file="../../../flutter/shell/platform/android/io/flutter/util/PathUtils.java" />
16+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java" />
17+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/renderer/OnFirstFrameRenderedListener.java" />
18+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/dart/DartExecutor.java" />
19+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/dart/PlatformMessageHandler.java" />
20+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/dart/DartMessenger.java" />
21+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/FlutterShellArgs.java" />
22+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java" />
23+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/SettingsChannel.java" />
24+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/NavigationChannel.java" />
25+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/LocalizationChannel.java" />
26+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java" />
27+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java" />
28+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/KeyEventChannel.java" />
29+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java" />
30+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/SystemChannel.java" />
31+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/systemchannels/LifecycleChannel.java" />
32+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/android/AndroidTouchProcessor.java" />
33+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/android/FlutterActivity.java" />
34+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/android/FlutterView.java" />
35+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/android/FlutterTextureView.java" />
36+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/android/FlutterFragment.java" />
37+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/android/FlutterSurfaceView.java" />
38+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/android/AndroidKeyProcessor.java" />
39+
<src file="../../../flutter/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java" />
40+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java" />
41+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/platform/PlatformViewRegistry.java" />
42+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java" />
43+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/platform/PlatformViewRegistryImpl.java" />
44+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/platform/SingleViewPresentation.java" />
45+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/platform/PlatformViewFactory.java" />
46+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/platform/PlatformView.java" />
47+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java" />
48+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java" />
49+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/JSONMethodCodec.java" />
50+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/JSONUtil.java" />
51+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/PluginRegistry.java" />
52+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/MessageCodec.java" />
53+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/ErrorLogResult.java" />
54+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/JSONMessageCodec.java" />
55+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/ActivityLifecycleListener.java" />
56+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/BinaryCodec.java" />
57+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/FlutterException.java" />
58+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/StringCodec.java" />
59+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/StandardMessageCodec.java" />
60+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/StandardMethodCodec.java" />
61+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/MethodCodec.java" />
62+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/BinaryMessenger.java" />
63+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/MethodCall.java" />
64+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/EventChannel.java" />
65+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/common/MethodChannel.java" />
66+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java" />
67+
<src file="../../../flutter/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java" />
68+
<src file="../../../flutter/shell/platform/android/io/flutter/view/FlutterNativeView.java" />
69+
<src file="../../../flutter/shell/platform/android/io/flutter/view/ResourceUpdater.java" />
70+
<src file="../../../flutter/shell/platform/android/io/flutter/view/FlutterCallbackInformation.java" />
71+
<src file="../../../flutter/shell/platform/android/io/flutter/view/VsyncWaiter.java" />
72+
<src file="../../../flutter/shell/platform/android/io/flutter/view/FlutterView.java" />
73+
<src file="../../../flutter/shell/platform/android/io/flutter/view/FlutterMain.java" />
74+
<src file="../../../flutter/shell/platform/android/io/flutter/view/ResourceExtractor.java" />
75+
<src file="../../../flutter/shell/platform/android/io/flutter/view/TextureRegistry.java" />
76+
<src file="../../../flutter/shell/platform/android/io/flutter/view/ResourcePaths.java" />
77+
<src file="../../../flutter/shell/platform/android/io/flutter/view/ResourceCleaner.java" />
78+
<src file="../../../flutter/shell/platform/android/io/flutter/view/FlutterRunArguments.java" />
79+
<src file="../../../flutter/shell/platform/android/io/flutter/view/AccessibilityBridge.java" />
80+
</module>
81+
</project>

tools/android_lint/pubspec.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: android_lint
2+
dependencies:
3+
args: 1.5.0
4+
path: ^1.6.2
5+
process: ^3.0.9

0 commit comments

Comments
 (0)