summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfrankf@chromium.org <frankf@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-11 03:02:10 +0000
committerfrankf@chromium.org <frankf@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-11 03:02:10 +0000
commit2286035b42707f5a63048b1ab3bd288b1e67a4f7 (patch)
treea9361d68220dc2db8a26616e52225bfeba153241
parent7a66545cf647e46e6cfd924af0582e9d5af3a55a (diff)
downloadchromium_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.xml13
-rwxr-xr-xbuild/android/buildbot/bb_run_bot.py2
-rwxr-xr-xbuild/android/gyp/lint.py158
-rwxr-xr-xbuild/android/lint/suppress.py115
-rw-r--r--build/android/lint/suppressions.xml141
-rw-r--r--build/android/lint_action.gypi39
-rw-r--r--build/common.gypi5
-rw-r--r--build/java.gypi23
-rw-r--r--build/java_apk.gypi29
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' ],
},
{