diff options
author | frankf@chromium.org <frankf@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-11 03:02:10 +0000 |
---|---|---|
committer | frankf@chromium.org <frankf@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-11 03:02:10 +0000 |
commit | 2286035b42707f5a63048b1ab3bd288b1e67a4f7 (patch) | |
tree | a9361d68220dc2db8a26616e52225bfeba153241 | |
parent | 7a66545cf647e46e6cfd924af0582e9d5af3a55a (diff) | |
download | chromium_src-2286035b42707f5a63048b1ab3bd288b1e67a4f7.zip chromium_src-2286035b42707f5a63048b1ab3bd288b1e67a4f7.tar.gz chromium_src-2286035b42707f5a63048b1ab3bd288b1e67a4f7.tar.bz2 |
[Android] Add lint as a gyp action.
- Run lint on all java/apk targets using a dummy AndroidManifest.xml
- Add build/android/lint/suppress.py for suppressing generated
errors
- Enable lint on FYI builders as a first step
BUG=None
R=cjhopman@chromium.org, newt@chromium.org
TBR=navabi@chromium.org
Review URL: https://codereview.chromium.org/86313004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@239984 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | build/android/AndroidManifest.xml | 13 | ||||
-rwxr-xr-x | build/android/buildbot/bb_run_bot.py | 2 | ||||
-rwxr-xr-x | build/android/gyp/lint.py | 158 | ||||
-rwxr-xr-x | build/android/lint/suppress.py | 115 | ||||
-rw-r--r-- | build/android/lint/suppressions.xml | 141 | ||||
-rw-r--r-- | build/android/lint_action.gypi | 39 | ||||
-rw-r--r-- | build/common.gypi | 5 | ||||
-rw-r--r-- | build/java.gypi | 23 | ||||
-rw-r--r-- | build/java_apk.gypi | 29 |
9 files changed, 517 insertions, 8 deletions
diff --git a/build/android/AndroidManifest.xml b/build/android/AndroidManifest.xml index 0822e36..cd26552 100644 --- a/build/android/AndroidManifest.xml +++ b/build/android/AndroidManifest.xml @@ -6,8 +6,15 @@ --> <!-- - This dummy manifest is passed to aapt when generating R.java in java.gypi. - Nothing in the manifest is used, but it is still required by aapt. + This is a dummy manifest which is required by: + 1. aapt when generating R.java in java.gypi: + Nothing in the manifest is used, but it is still required by aapt. + 2. lint: [min|target]SdkVersion are required by lint and should + be kept up-to-date. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="dummy.package" /> + package="dummy.package"> + + <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> + +</manifest> diff --git a/build/android/buildbot/bb_run_bot.py b/build/android/buildbot/bb_run_bot.py index 71b782a..d26e262 100755 --- a/build/android/buildbot/bb_run_bot.py +++ b/build/android/buildbot/bb_run_bot.py @@ -150,7 +150,7 @@ def GetBotStepMap(): H(compile_step + std_host_tests, experimental, target_arch='x86')), B('fyi-builder-dbg', H(std_build_steps + std_host_tests, experimental, - extra_gyp='emma_coverage=1')), + extra_gyp='emma_coverage=1 android_lint=1')), B('x86-builder-dbg', H(compile_step + std_host_tests, target_arch='x86')), B('fyi-builder-rel', H(std_build_steps, experimental)), diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py new file mode 100755 index 0000000..631ceaf --- /dev/null +++ b/build/android/gyp/lint.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python +# +# Copyright (c) 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Runs Android's lint tool.""" + + +import optparse +import os +import sys +from xml.dom import minidom + +from util import build_utils + + +_SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), + '..', '..', '..')) + + +def _RunLint(lint_path, config_path, processed_config_path, manifest_path, + result_path, product_dir, src_dirs, classes_dir): + + def _RelativizePath(path): + """Returns relative path to top-level src dir. + + Args: + path: A path relative to cwd. + """ + return os.path.relpath(os.path.abspath(path), _SRC_ROOT) + + def _ProcessConfigFile(): + if not build_utils.IsTimeStale(processed_config_path, [config_path]): + return + + with open(config_path, 'rb') as f: + content = f.read().replace( + 'PRODUCT_DIR', _RelativizePath(product_dir)) + + with open(processed_config_path, 'wb') as f: + f.write(content) + + def _ProcessResultFile(): + with open(result_path, 'rb') as f: + content = f.read().replace( + _RelativizePath(product_dir), 'PRODUCT_DIR') + + with open(result_path, 'wb') as f: + f.write(content) + + def _ParseAndShowResultFile(): + dom = minidom.parse(result_path) + issues = dom.getElementsByTagName('issue') + print >> sys.stderr + for issue in issues: + issue_id = issue.attributes['id'].value + severity = issue.attributes['severity'].value + message = issue.attributes['message'].value + location_elem = issue.getElementsByTagName('location')[0] + path = location_elem.attributes['file'].value + line = location_elem.getAttribute('line') + if line: + error = '%s:%s %s: %s [%s]' % (path, line, severity, message, + issue_id) + else: + # Issues in class files don't have a line number. + error = '%s %s: %s [%s]' % (path, severity, message, issue_id) + print >> sys.stderr, error + for attr in ['errorLine1', 'errorLine2']: + error_line = issue.getAttribute(attr) + if error_line: + print >> sys.stderr, error_line + return len(issues) + + _ProcessConfigFile() + + cmd = [ + lint_path, '-Werror', '--exitcode', '--showall', + '--config', _RelativizePath(processed_config_path), + '--classpath', _RelativizePath(classes_dir), + '--xml', _RelativizePath(result_path), + ] + for src in src_dirs: + cmd.extend(['--sources', _RelativizePath(src)]) + cmd.append(_RelativizePath(os.path.join(manifest_path, os.pardir))) + + if os.path.exists(result_path): + os.remove(result_path) + + try: + build_utils.CheckOutput(cmd, cwd=_SRC_ROOT) + except build_utils.CalledProcessError: + # There is a problem with lint usage + if not os.path.exists(result_path): + raise + # There are actual lint issues + else: + num_issues = _ParseAndShowResultFile() + _ProcessResultFile() + msg = ('\nLint found %d new issues.\n' + ' - For full explanation refer to %s\n' + ' - Wanna suppress these issues?\n' + ' 1. Read comment in %s\n' + ' 2. Run "python %s %s"\n' % + (num_issues, + _RelativizePath(result_path), + _RelativizePath(config_path), + _RelativizePath(os.path.join(_SRC_ROOT, 'build', 'android', + 'lint', 'suppress.py')), + _RelativizePath(result_path))) + print >> sys.stderr, msg + return 1 + + return 0 + + +def main(argv): + parser = optparse.OptionParser() + parser.add_option('--lint-path', help='Path to lint executable.') + parser.add_option('--config-path', help='Path to lint suppressions file.') + parser.add_option('--processed-config-path', + help='Path to processed lint suppressions file.') + parser.add_option('--manifest-path', help='Path to AndroidManifest.xml') + parser.add_option('--result-path', help='Path to XML lint result file.') + parser.add_option('--product-dir', help='Path to product dir.') + parser.add_option('--src-dirs', help='Directories containing java files.') + parser.add_option('--classes-dir', help='Directory containing class files.') + parser.add_option('--stamp', help='Path to touch on success.') + parser.add_option('--enable', action='store_true', + help='Run lint instead of just touching stamp.') + + options, _ = parser.parse_args() + + build_utils.CheckOptions( + options, parser, required=['lint_path', 'config_path', + 'processed_config_path', 'manifest_path', + 'result_path', 'product_dir', 'src_dirs', + 'classes_dir']) + + src_dirs = build_utils.ParseGypList(options.src_dirs) + + rc = 0 + + if options.enable: + rc = _RunLint(options.lint_path, options.config_path, + options.processed_config_path, + options.manifest_path, options.result_path, + options.product_dir, src_dirs, options.classes_dir) + + if options.stamp and not rc: + build_utils.Touch(options.stamp) + + return rc + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/build/android/lint/suppress.py b/build/android/lint/suppress.py new file mode 100755 index 0000000..9664ffd --- /dev/null +++ b/build/android/lint/suppress.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python +# +# Copyright (c) 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Add all generated lint_result.xml files to suppressions.xml""" + + +import collections +import optparse +import os +import sys +from xml.dom import minidom + +_BUILD_ANDROID_DIR = os.path.join(os.path.dirname(__file__), '..') +sys.path.append(_BUILD_ANDROID_DIR) + +from pylib import constants + + +_THIS_FILE = os.path.abspath(__file__) +_CONFIG_PATH = os.path.join(os.path.dirname(_THIS_FILE), 'suppressions.xml') +_DOC = ( + '\nSTOP! It looks like you want to suppress some lint errors:\n' + '- Have you tried identifing the offending patch?\n' + ' Ask the author for a fix and/or revert the patch.\n' + '- It is preferred to add suppressions in the code instead of\n' + ' sweeping it under the rug here. See:\n\n' + ' http://developer.android.com/tools/debugging/improving-w-lint.html\n' + '\n' + 'Still reading?\n' + '- You can edit this file manually to suppress an issue\n' + ' globally if it is not applicable to the project.\n' + '- You can also automatically add issues found so for in the\n' + ' build process by running:\n\n' + ' ' + os.path.relpath(_THIS_FILE, constants.DIR_SOURCE_ROOT) + '\n\n' + ' which will generate this file (Comments are not preserved).\n' + ' Note: PRODUCT_DIR will be substituted at run-time with actual\n' + ' directory path (e.g. out/Debug)\n' +) + + +_Issue = collections.namedtuple('Issue', ['severity', 'paths']) + + +def _ParseConfigFile(config_path): + print 'Parsing %s' % config_path + issues_dict = {} + dom = minidom.parse(config_path) + for issue in dom.getElementsByTagName('issue'): + issue_id = issue.attributes['id'].value + severity = issue.getAttribute('severity') + paths = set( + [p.attributes['path'].value for p in + issue.getElementsByTagName('ignore')]) + issues_dict[issue_id] = _Issue(severity, paths) + return issues_dict + + +def _ParseAndMergeResultFile(result_path, issues_dict): + print 'Parsing and merging %s' % result_path + dom = minidom.parse(result_path) + for issue in dom.getElementsByTagName('issue'): + issue_id = issue.attributes['id'].value + severity = issue.attributes['severity'].value + path = issue.getElementsByTagName('location')[0].attributes['file'].value + if issue_id not in issues_dict: + issues_dict[issue_id] = _Issue(severity, set()) + issues_dict[issue_id].paths.add(path) + + +def _WriteConfigFile(config_path, issues_dict): + new_dom = minidom.getDOMImplementation().createDocument(None, 'lint', None) + top_element = new_dom.documentElement + top_element.appendChild(new_dom.createComment(_DOC)) + for issue_id in sorted(issues_dict.keys()): + severity = issues_dict[issue_id].severity + paths = issues_dict[issue_id].paths + issue = new_dom.createElement('issue') + issue.attributes['id'] = issue_id + if severity: + issue.attributes['severity'] = severity + if severity == 'ignore': + print 'Warning: [%s] is suppressed globally.' % issue_id + else: + for path in sorted(paths): + ignore = new_dom.createElement('ignore') + ignore.attributes['path'] = path + issue.appendChild(ignore) + top_element.appendChild(issue) + + with open(config_path, 'w') as f: + f.write(new_dom.toprettyxml(indent=' ', encoding='utf-8')) + print 'Updated %s' % config_path + + +def _Suppress(config_path, result_path): + issues_dict = _ParseConfigFile(config_path) + _ParseAndMergeResultFile(result_path, issues_dict) + _WriteConfigFile(config_path, issues_dict) + + +def main(argv): + parser = optparse.OptionParser(usage='%prog RESULT-FILE') + _, args = parser.parse_args() + + if len(args) != 1 or not os.path.exists(args[0]): + parser.error('Must provide RESULT-FILE') + + _Suppress(_CONFIG_PATH, args[0]) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml new file mode 100644 index 0000000..3980f97 --- /dev/null +++ b/build/android/lint/suppressions.xml @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="utf-8"?> +<lint> + <!-- +STOP! It looks like you want to suppress some lint errors: +- Have you tried identifing the offending patch? + Ask the author for a fix and/or revert the patch. +- It is preferred to add suppressions in the code instead of + sweeping it under the rug here. See: + + http://developer.android.com/tools/debugging/improving-w-lint.html + +Still reading? +- You can edit this file manually to suppress an issue + globally if it is not applicable to the project. +- You can also automatically add issues found so for in the + build process by running: + + build/android/lint/suppress.py + + which will generate this file (Comments are not preserved). + Note: PRODUCT_DIR will be substituted at run-time with actual + directory path (e.g. out/Debug) +--> + <issue id="AllowBackup"> + <ignore path="AndroidManifest.xml"/> + </issue> + <issue id="CommitPrefEdits"> + <ignore path="third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/channel/AndroidChannelPreferences.java"/> + </issue> + <issue id="DefaultLocale"> + <ignore path="PRODUCT_DIR/content_shell_test_apk/classes/org/chromium/content/browser/ViewportTest.class"/> + <ignore path="android_webview/javatests/src/org/chromium/android_webview/test/AwViewportTest.java"/> + <ignore path="android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java"/> + <ignore path="chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java"/> + <ignore path="chrome/android/testshell/javatests/src/org/chromium/chrome/testshell/ChromiumTestShellUrlTest.java"/> + <ignore path="chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/sync/SyncTestUtil.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/app/Linker.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/LoadUrlParams.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/accessibility/JellyBeanAccessibilityInjector.java"/> + <ignore path="content/public/android/javatests/src/org/chromium/content/browser/ViewportTest.java"/> + <ignore path="third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/contrib/AndroidListenerState.java"/> + </issue> + <issue id="DrawAllocation"> + <ignore path="content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/PopupZoomer.java"/> + </issue> + <issue id="ExportedContentProvider"> + <ignore path="AndroidManifest.xml"/> + </issue> + <issue id="HandlerLeak"> + <ignore path="content/public/android/java/src/org/chromium/content/browser/LongPressDetector.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/third_party/GestureDetector.java"/> + <ignore path="remoting/android/java/src/org/chromium/chromoting/TapGestureDetector.java"/> + </issue> + <issue id="InlinedApi"> + <ignore path="base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java"/> + <ignore path="base/android/java/src/org/chromium/base/MemoryPressureListener.java"/> + <ignore path="chrome/android/java/src/org/chromium/chrome/browser/printing/PrintingControllerFactory.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/DeviceUtils.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/accessibility/JellyBeanAccessibilityInjector.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/MediaCodecBridge.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/MediaDrmBridge.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java"/> + <ignore path="net/android/java/src/org/chromium/net/X509Util.java"/> + <ignore path="printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java"/> + <ignore path="ui/android/java/src/org/chromium/ui/base/LocalizationUtils.java"/> + </issue> + <issue id="MissingRegistered" severity="ignore"/> + <issue id="MissingSuperCall"> + <ignore path="android_webview/java/src/org/chromium/android_webview/AwContents.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java"/> + </issue> + <issue id="MissingVersion"> + <ignore path="AndroidManifest.xml"/> + </issue> + <issue id="NewApi"> + <ignore path="PRODUCT_DIR/android_webview_apk/classes/org/chromium/android_webview/test/AwTestContainerView.class"/> + <ignore path="PRODUCT_DIR/chromium_testshell_test_apk/classes/org/chromium/printing/PrintingControllerTest$6.class"/> + <ignore path="PRODUCT_DIR/chromium_testshell_test_apk/classes/org/chromium/printing/PrintingControllerTest.class"/> + <ignore path="PRODUCT_DIR/content_shell_test_apk/classes/org/chromium/content/browser/ClipboardTest.class"/> + <ignore path="android_webview/java/src/org/chromium/android_webview/AwPdfExporter.java"/> + <ignore path="android_webview/java/src/org/chromium/android_webview/AwPrintDocumentAdapter.java"/> + <ignore path="android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java"/> + <ignore path="android_webview/test/shell/src/org/chromium/android_webview/test/AwTestContainerView.java"/> + <ignore path="base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java"/> + <ignore path="chrome/android/java/src/org/chromium/chrome/browser/BookmarkUtils.java"/> + <ignore path="chrome/android/java/src/org/chromium/chrome/browser/TtsPlatformImpl.java"/> + <ignore path="chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java"/> + <ignore path="chrome/android/java/src/org/chromium/chrome/browser/infobar/AnimationHelper.java"/> + <ignore path="chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java"/> + <ignore path="chrome/test/chromedriver/test/webview_shell/java/src/org/chromium/chromedriver_webview_shell/Main.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/GenericTouchGesture.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/VSyncMonitor.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/accessibility/JellyBeanAccessibilityInjector.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/accessibility/JellyBeanBrowserAccessibilityManager.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/accessibility/KitKatBrowserAccessibilityManager.java"/> + <ignore path="content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java"/> + <ignore path="content/public/android/javatests/src/org/chromium/content/browser/ClipboardTest.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/MediaCodecBridge.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/MediaDrmBridge.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/VideoCapture.java"/> + <ignore path="media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java"/> + <ignore path="printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java"/> + <ignore path="printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java"/> + <ignore path="printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java"/> + <ignore path="tools/android/memconsumer/java/src/org/chromium/memconsumer/ResidentService.java"/> + <ignore path="ui/android/java/src/org/chromium/ui/ColorPickerAdvancedComponent.java"/> + <ignore path="ui/android/java/src/org/chromium/ui/base/Clipboard.java"/> + <ignore path="ui/android/java/src/org/chromium/ui/base/LocalizationUtils.java"/> + <ignore path="ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java"/> + </issue> + <issue id="OldTargetApi"> + <ignore path="AndroidManifest.xml"/> + </issue> + <issue id="Recycle" severity="Error"> + <ignore path="PRODUCT_DIR/content_shell_test_apk/classes/org/chromium/content/browser/ContentViewGestureHandlerTest.class"/> + <ignore path="android_webview/javatests/src/org/chromium/android_webview/test/WebKitHitTestTest.java"/> + <ignore path="android_webview/javatests/src/org/chromium/android_webview/test/util/AwTestTouchUtils.java"/> + <ignore path="chrome/android/javatests/src/org/chromium/chrome/browser/test/ProviderBookmarkNodeTest.java"/> + <ignore path="content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestTouchUtils.java"/> + <ignore path="content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TouchCommon.java"/> + </issue> + <issue id="Registered" severity="ignore"/> + <issue id="SdCardPath"> + <ignore path="content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java"/> + </issue> + <issue id="SetJavaScriptEnabled" severity="ignore"/> + <issue id="UseSparseArrays"> + <ignore path="android_webview/java/src/org/chromium/android_webview/AwQuotaManagerBridge.java"/> + <ignore path="android_webview/java/src/org/chromium/android_webview/AwResource.java"/> + <ignore path="remoting/android/java/src/org/chromium/chromoting/TapGestureDetector.java"/> + <ignore path="ui/android/java/src/org/chromium/ui/base/WindowAndroid.java"/> + </issue> + <issue id="ViewConstructor" severity="ignore"/> + <issue id="WrongCall" severity="ignore"/> +</lint> diff --git a/build/android/lint_action.gypi b/build/android/lint_action.gypi new file mode 100644 index 0000000..dd0bbd2 --- /dev/null +++ b/build/android/lint_action.gypi @@ -0,0 +1,39 @@ +# Copyright 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This file is meant to be included into an action to provide a rule to +# run lint on java/class files. + +{ + 'action_name': 'lint_<(_target_name)', + 'message': 'Linting <(_target_name)', + 'variables': { + 'conditions': [ + ['chromium_code != 0 and android_lint != 0 and never_lint == 0', { + 'is_enabled': '--enable', + }, { + 'is_enabled': '', + }] + ] + }, + 'inputs': [ + '<(DEPTH)/build/android/gyp/util/build_utils.py', + '<(DEPTH)/build/android/gyp/lint.py', + '<(DEPTH)/build/android/lint/suppressions.xml', + '<(DEPTH)/build/android/AndroidManifest.xml', + ], + 'action': [ + 'python', '<(DEPTH)/build/android/gyp/lint.py', + '--lint-path=<(android_sdk_root)/tools/lint', + '--config-path=<(DEPTH)/build/android/lint/suppressions.xml', + '--processed-config-path=<(config_path)', + '--manifest-path=<(DEPTH)/build/android/AndroidManifest.xml', + '--result-path=<(result_path)', + '--product-dir=<(PRODUCT_DIR)', + '--src-dirs=>(src_dirs)', + '--classes-dir=<(classes_dir)', + '--stamp=<(stamp_path)', + '<(is_enabled)', + ], +} diff --git a/build/common.gypi b/build/common.gypi index 445cd64..99b336a 100644 --- a/build/common.gypi +++ b/build/common.gypi @@ -1027,6 +1027,9 @@ # 'emma_coverage=1'. 'emma_filter%': '', + # Set to 1 to enable running Android lint on java/class files. + 'android_lint%': 0, + # Set to 1 to force Visual C++ to use legacy debug information format /Z7. # This is useful for parallel compilation tools which can't support /Zi. # Only used on Windows. @@ -1479,7 +1482,7 @@ ['(branding=="Chrome" and buildtype=="Official")', { 'mac_strip_release%': 1, }], - ], + ], }], # OS=="mac" ['OS=="mac" or OS=="ios"', { 'variables': { diff --git a/build/java.gypi b/build/java.gypi index 2e03bab..b3daebb 100644 --- a/build/java.gypi +++ b/build/java.gypi @@ -44,6 +44,7 @@ # res_extra_dirs - A list of extra directories containing Android resources. # These directories may be generated at build time. # res_extra_files - A list of the files in res_extra_dirs. +# never_lint - Set to 1 to not run lint on this target. { 'dependencies': [ @@ -73,6 +74,10 @@ 'intermediate_dir': '<(SHARED_INTERMEDIATE_DIR)/<(_target_name)', 'classes_dir': '<(intermediate_dir)/classes', 'compile_stamp': '<(intermediate_dir)/compile.stamp', + 'lint_stamp': '<(intermediate_dir)/lint.stamp', + 'lint_result': '<(intermediate_dir)/lint_result.xml', + 'lint_config': '<(intermediate_dir)/lint_config.xml', + 'never_lint%': 0, 'proguard_config%': '', 'proguard_preprocess%': '0', 'variables': { @@ -308,6 +313,24 @@ ] }, { + 'variables': { + 'src_dirs': [ + '<(java_in_dir)/src', + '>@(additional_src_dirs)', + ], + 'stamp_path': '<(lint_stamp)', + 'result_path': '<(lint_result)', + 'config_path': '<(lint_config)', + }, + 'inputs': [ + '<(compile_stamp)', + ], + 'outputs': [ + '<(lint_stamp)', + ], + 'includes': [ 'android/lint_action.gypi' ], + }, + { 'action_name': 'jar_<(_target_name)', 'message': 'Creating <(_target_name) jar', 'inputs': [ diff --git a/build/java_apk.gypi b/build/java_apk.gypi index 979f449..5ca61e379 100644 --- a/build/java_apk.gypi +++ b/build/java_apk.gypi @@ -53,6 +53,7 @@ # enable_content_linker_tests - Enable the content dynamic linker test support # code. This allows a test APK to inject a Linker.TestRunner instance at # runtime. Should only be used by the content_linker_test_apk target!! +# never_lint - Set to 1 to not run lint on this target. { 'variables': { 'additional_input_paths': [], @@ -91,6 +92,10 @@ 'native_libraries_template_data_file': '<(native_libraries_template_data_dir)/native_libraries_array.h', 'native_libraries_template_version_file': '<(native_libraries_template_data_dir)/native_libraries_version.h', 'compile_stamp': '<(intermediate_dir)/compile.stamp', + 'lint_stamp': '<(intermediate_dir)/lint.stamp', + 'lint_result': '<(intermediate_dir)/lint_result.xml', + 'lint_config': '<(intermediate_dir)/lint_config.xml', + 'never_lint%': 0, 'instr_stamp': '<(intermediate_dir)/instr.stamp', 'jar_stamp': '<(intermediate_dir)/jar.stamp', 'obfuscate_stamp': '<(intermediate_dir)/obfuscate.stamp', @@ -552,6 +557,24 @@ ], }, { + 'variables': { + 'src_dirs': [ + '<(java_in_dir)/src', + '>@(additional_src_dirs)', + ], + 'stamp_path': '<(lint_stamp)', + 'result_path': '<(lint_result)', + 'config_path': '<(lint_config)', + }, + 'inputs': [ + '<(compile_stamp)', + ], + 'outputs': [ + '<(lint_stamp)', + ], + 'includes': [ 'android/lint_action.gypi' ], + }, + { 'action_name': 'instr_classes_<(_target_name)', 'message': 'Instrumenting <(_target_name) classes', 'variables': { @@ -560,12 +583,12 @@ 'stamp_path': '<(instr_stamp)', 'instr_type': 'classes', }, - 'outputs': [ - '<(instr_stamp)', - ], 'inputs': [ '<(compile_stamp)', ], + 'outputs': [ + '<(instr_stamp)', + ], 'includes': [ 'android/instr_action.gypi' ], }, { |