Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1844)

Unified Diff: build/android/gradle/generate_gradle.py

Issue 2812133003: Android: Add pseudo module for Android Studio (Closed)
Patch Set: Update docs and switch to sorted Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: build/android/gradle/generate_gradle.py
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py
index d57dfa9fb14485f73ee4503ff31369107f672f49..a1b0504b6806a42b4c335a53202be87dbb07e1e0 100755
--- a/build/android/gradle/generate_gradle.py
+++ b/build/android/gradle/generate_gradle.py
@@ -35,6 +35,9 @@ _SRCJARS_SUBDIR = 'extracted-srcjars'
_JNI_LIBS_SUBDIR = 'symlinked-libs'
_ARMEABI_SUBDIR = 'armeabi'
_RES_SUBDIR = 'extracted-res'
+_GRADLE_BUILD_FILE = 'build.gradle'
+# This needs to come first alphabetically among all modules.
+_MODULE_ALL = '_all'
_DEFAULT_TARGETS = [
# TODO(agrieve): .build_config seem not quite right for this target
@@ -245,6 +248,8 @@ class _ProjectContextGenerator(object):
self.use_gradle_process_resources = use_gradle_process_resources
self.jinja_processor = jinja_processor
self.split_projects = split_projects
+ self.processed_java_dirs = set()
+ self.processed_prebuilts = set()
def _GenJniLibs(self, root_entry):
libraries = []
@@ -334,24 +339,23 @@ class _ProjectContextGenerator(object):
# things up at all.
variables = {}
java_dirs, excludes = self._GenJavaDirs(root_entry)
+ java_dirs.append(
+ os.path.join(self.EntryOutputDir(root_entry), _SRCJARS_SUBDIR))
+ self.processed_java_dirs.update(java_dirs)
java_dirs.sort()
variables['java_dirs'] = self._Relativize(root_entry, java_dirs)
- variables['java_dirs'].append(_SRCJARS_SUBDIR)
variables['java_excludes'] = excludes
variables['jni_libs'] = self._Relativize(
root_entry, set(self._GenJniLibs(root_entry)))
- variables['prebuilts'] = [
- p for e in self._GetEntries(root_entry) for p in e.PrebuiltJars()]
- variables['res_dirs'] = [
- p for e in self._GetEntries(root_entry) for p in e.ResDirs()]
- for entry in self._GetEntries(root_entry):
- variables['prebuilts'] += entry.PrebuiltJars()
- variables['res_dirs'] += entry.ResDirs()
- variables['prebuilts'] = self._Relativize(
- root_entry, set(variables['prebuilts']))
- variables['res_dirs'] = self._Relativize(
- root_entry, set(variables['res_dirs']))
- variables['res_dirs'].append(_RES_SUBDIR)
+ prebuilts = set(
+ p for e in self._GetEntries(root_entry) for p in e.PrebuiltJars())
+ self.processed_prebuilts.update(prebuilts)
+ variables['prebuilts'] = self._Relativize(root_entry, prebuilts)
+ res_dirs = set(
+ p for e in self._GetEntries(root_entry) for p in e.ResDirs())
+ res_dirs.add(
+ os.path.join(self.EntryOutputDir(root_entry), _RES_SUBDIR))
+ variables['res_dirs'] = self._Relativize(root_entry, res_dirs)
android_manifest = root_entry.Gradle().get('android_manifest')
if not android_manifest:
android_manifest = self._GenCustomManifest(root_entry)
@@ -482,15 +486,26 @@ def _GenerateLocalProperties(sdk_dir):
''])
-def _GenerateGradleFile(entry, generator, build_vars, jinja_processor):
- """Returns the data for a project's build.gradle."""
- deps_info = entry.DepsInfo()
- gradle = entry.Gradle()
-
+def _GenerateBaseVars(generator, build_vars, source_properties):
variables = {
'sourceSetName': 'main',
'depCompileName': 'compile',
}
+ variables['build_tools_version'] = source_properties['Pkg.Revision']
+ variables['compile_sdk_version'] = (
+ 'android-%s' % build_vars['android_sdk_version'])
+ variables['use_gradle_process_resources'] = (
+ generator.use_gradle_process_resources)
+ return variables
+
+
+def _GenerateGradleFile(entry, generator, build_vars, source_properties,
+ jinja_processor):
+ """Returns the data for a project's build.gradle."""
+ deps_info = entry.DepsInfo()
+ gradle = entry.Gradle()
+
+ variables = _GenerateBaseVars(generator, build_vars, source_properties)
if deps_info['type'] == 'android_apk':
target_type = 'android_apk'
elif deps_info['type'] == 'java_library':
@@ -513,14 +528,6 @@ def _GenerateGradleFile(entry, generator, build_vars, jinja_processor):
variables['target_name'] = os.path.splitext(deps_info['name'])[0]
variables['template_type'] = target_type
- variables['use_gradle_process_resources'] = (
- generator.use_gradle_process_resources)
- source_properties = _ReadPropertiesFile(
- _RebasePath(os.path.join(build_vars['android_sdk_build_tools'],
- 'source.properties')))
- variables['build_tools_version'] = source_properties['Pkg.Revision']
- variables['compile_sdk_version'] = (
- 'android-%s' % build_vars['android_sdk_version'])
variables['main'] = generator.Generate(entry)
bootclasspath = gradle.get('bootclasspath')
if bootclasspath:
@@ -531,13 +538,38 @@ def _GenerateGradleFile(entry, generator, build_vars, jinja_processor):
entry.android_test_entry)
for key, value in variables['android_test'].iteritems():
if isinstance(value, list):
- variables['android_test'][key] = list(
+ variables['android_test'][key] = sorted(
set(value) - set(variables['main'][key]))
return jinja_processor.Render(
_TemplatePath(target_type.split('_')[0]), variables)
+def _GenerateModuleAll(gradle_output_dir, generator, build_vars,
+ source_properties, jinja_processor):
+ """Returns the data for a pseudo build.gradle of all dirs.
+
+ See //docs/android_studio.md for more details."""
+ variables = _GenerateBaseVars(generator, build_vars, source_properties)
+ target_type = 'android_apk'
+ variables['target_name'] = _MODULE_ALL
+ variables['template_type'] = target_type
+ java_dirs = sorted(generator.processed_java_dirs)
+ prebuilts = sorted(generator.processed_prebuilts)
+ def Relativize(paths):
+ return _RebasePath(paths, os.path.join(gradle_output_dir, _MODULE_ALL))
+ variables['main'] = {
+ 'android_manifest': Relativize(_DEFAULT_ANDROID_MANIFEST_PATH),
+ 'java_dirs': Relativize(java_dirs),
+ 'prebuilts': Relativize(prebuilts),
+ 'java_excludes': ['**/*.java'],
+ }
+ data = jinja_processor.Render(
+ _TemplatePath(target_type.split('_')[0]), variables)
+ _WriteFile(
+ os.path.join(gradle_output_dir, _MODULE_ALL, _GRADLE_BUILD_FILE), data)
+
+
def _GenerateRootGradle(jinja_processor):
"""Returns the data for the root project's build.gradle."""
return jinja_processor.Render(_TemplatePath('root'))
@@ -552,6 +584,10 @@ def _GenerateSettingsGradle(project_entries):
lines.append('rootProject.projectDir = settingsDir')
lines.append('')
+ lines.append('include ":{0}"'.format(_MODULE_ALL))
+ lines.append(
+ 'project(":{0}").projectDir = new File(settingsDir, "{0}")'.format(
+ _MODULE_ALL))
for entry in project_entries:
# Example target: android_webview:android_webview_java__build_config
lines.append('include ":%s"' % entry.ProjectName())
@@ -662,14 +698,17 @@ def main():
run_tests_helper.SetLogLevel(args.verbose_count)
# TODO(wnwen): Fix packaging so that gradle resources work in this case.
- if args.use_gradle_process_resources:
- assert args.split_projects, (
- 'Gradle resources does not yet work without --split-projects.')
+ if args.split_projects:
+ assert not args.use_gradle_process_resources, (
sakal-chromium 2017/05/04 09:11:00 Why did the meaning of this check change? Now it a
Peter Wen 2017/05/04 10:19:58 Yes, you are correct, it's a bug. I'll fix it in a
+ 'Gradle resources does not work without --split-projects.')
_gradle_output_dir = os.path.abspath(
args.project_dir.replace('$CHROMIUM_OUTPUT_DIR', output_dir))
jinja_processor = jinja_template.JinjaProcessor(_FILE_DIR)
build_vars = _ReadPropertiesFile(os.path.join(output_dir, 'build_vars.txt'))
+ source_properties = _ReadPropertiesFile(
+ _RebasePath(os.path.join(build_vars['android_sdk_build_tools'],
+ 'source.properties')))
generator = _ProjectContextGenerator(_gradle_output_dir, build_vars,
args.use_gradle_process_resources, jinja_processor, args.split_projects)
logging.warning('Creating project at: %s', generator.project_dir)
@@ -696,7 +735,10 @@ def main():
# There are many unused libraries, so restrict to those that are actually used
# when using --all.
if args.all:
- main_entries = [e for e in main_entries if e.GetType() == 'android_apk']
+ main_entries = [e for e in main_entries if (
+ e.GetType() == 'android_apk' or
+ e.GnTarget().endswith('_test_apk__apk') or
+ e.GnTarget().endswith('_junit_tests__java_binary'))]
if args.split_projects:
main_entries = _FindAllProjectEntries(main_entries)
@@ -712,7 +754,8 @@ def main():
if entry.GetType() not in ('android_apk', 'java_library', 'java_binary'):
continue
- data = _GenerateGradleFile(entry, generator, build_vars, jinja_processor)
+ data = _GenerateGradleFile(entry, generator, build_vars, source_properties,
+ jinja_processor)
if data:
project_entries.append(entry)
# Build all paths references by .gradle that exist within output_dir.
@@ -724,9 +767,13 @@ def main():
(s, os.path.join(generator.EntryOutputDir(entry), _RES_SUBDIR))
for s in generator.AllResZips(entry))
_WriteFile(
- os.path.join(generator.EntryOutputDir(entry), 'build.gradle'), data)
+ os.path.join(generator.EntryOutputDir(entry), _GRADLE_BUILD_FILE),
+ data)
+
+ _GenerateModuleAll(_gradle_output_dir, generator, build_vars,
+ source_properties, jinja_processor)
- _WriteFile(os.path.join(generator.project_dir, 'build.gradle'),
+ _WriteFile(os.path.join(generator.project_dir, _GRADLE_BUILD_FILE),
_GenerateRootGradle(jinja_processor))
_WriteFile(os.path.join(generator.project_dir, 'settings.gradle'),

Powered by Google App Engine
This is Rietveld 408576698