Index: build/android/gradle/generate_gradle.py |
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py |
index fb30872a9fb933d86c4da038343775ac483358b8..2b529f0b6e30206e53bff013ffc1ac2b97945b84 100755 |
--- a/build/android/gradle/generate_gradle.py |
+++ b/build/android/gradle/generate_gradle.py |
@@ -175,6 +175,9 @@ class _ProjectEntry(object): |
def Gradle(self): |
return self.BuildConfig()['gradle'] |
+ def Javac(self): |
+ return self.BuildConfig()['javac'] |
+ |
def GetType(self): |
"""Returns the target type from its .build_config.""" |
return self.DepsInfo()['type'] |
@@ -195,9 +198,12 @@ class _ProjectEntry(object): |
class _ProjectContextGenerator(object): |
"""Helper class to generate gradle build files""" |
- def __init__(self, project_dir, use_gradle_process_resources): |
+ def __init__(self, project_dir, build_vars, use_gradle_process_resources, |
+ jinja_processor): |
self.project_dir = project_dir |
+ self.build_vars = build_vars |
self.use_gradle_process_resources = use_gradle_process_resources |
+ self.jinja_processor = jinja_processor |
def _GenJniLibs(self, entry): |
native_section = entry.BuildConfig().get('native') |
@@ -223,6 +229,31 @@ class _ProjectContextGenerator(object): |
res_dirs.append(os.path.join(self.EntryOutputDir(entry), _RES_SUBDIR)) |
return res_dirs |
+ def _GenCustomManifest(self, entry): |
+ """Returns the path to the generated AndroidManifest.xml.""" |
+ javac = entry.Javac() |
+ resource_packages = javac['resource_packages'] |
+ output_file = os.path.join( |
+ self.EntryOutputDir(entry), 'AndroidManifest.xml') |
+ |
+ if not resource_packages: |
+ logging.error('Target ' + entry.GnTarget() + ' includes resources from ' |
+ 'unknown package. Unable to process with gradle.') |
+ return _DEFAULT_ANDROID_MANIFEST_PATH |
+ elif len(resource_packages) > 1: |
+ logging.error('Target ' + entry.GnTarget() + ' includes resources from ' |
+ 'multiple packages. Unable to process with gradle.') |
+ return _DEFAULT_ANDROID_MANIFEST_PATH |
+ |
+ variables = {} |
+ variables['compile_sdk_version'] = self.build_vars['android_sdk_version'] |
+ variables['package'] = resource_packages[0] |
+ |
+ data = self.jinja_processor.Render(_TemplatePath('manifest'), variables) |
+ _WriteFile(output_file, data) |
+ |
+ return output_file |
+ |
def _Relativize(self, entry, paths): |
return _RebasePath(paths, self.EntryOutputDir(entry)) |
@@ -246,15 +277,22 @@ class _ProjectContextGenerator(object): |
def Generate(self, entry): |
variables = {} |
- android_test_manifest = entry.Gradle().get( |
- 'android_manifest', _DEFAULT_ANDROID_MANIFEST_PATH) |
- variables['android_manifest'] = self._Relativize( |
- entry, android_test_manifest) |
java_dirs, excludes = self._GenJavaDirs(entry) |
variables['java_dirs'] = self._Relativize(entry, java_dirs) |
variables['java_excludes'] = excludes |
variables['jni_libs'] = self._Relativize(entry, self._GenJniLibs(entry)) |
variables['res_dirs'] = self._Relativize(entry, self._GenResDirs(entry)) |
+ android_manifest = entry.Gradle().get('android_manifest') |
+ if not android_manifest: |
+ # Gradle uses package id from manifest when generating R.class. So, we |
+ # need to generate a custom manifest if we let gradle process resources. |
+ # We cannot simply set android.defaultConfig.applicationId because it is |
+ # not supported for library targets. |
+ if variables['res_dirs']: |
+ android_manifest = self._GenCustomManifest(entry) |
+ else: |
+ android_manifest = _DEFAULT_ANDROID_MANIFEST_PATH |
+ variables['android_manifest'] = self._Relativize(entry, android_manifest) |
deps = [_ProjectEntry.FromBuildConfigPath(p) |
for p in entry.Gradle()['dependent_android_projects']] |
variables['android_project_deps'] = [d.ProjectName() for d in deps] |
@@ -544,8 +582,10 @@ def main(): |
_gradle_output_dir = os.path.abspath( |
args.project_dir.replace('$CHROMIUM_OUTPUT_DIR', output_dir)) |
- generator = _ProjectContextGenerator( |
- _gradle_output_dir, args.use_gradle_process_resources) |
+ jinja_processor = jinja_template.JinjaProcessor(_FILE_DIR) |
+ build_vars = _ReadBuildVars(output_dir) |
+ generator = _ProjectContextGenerator(_gradle_output_dir, build_vars, |
+ args.use_gradle_process_resources, jinja_processor) |
logging.warning('Creating project at: %s', generator.project_dir) |
if args.all: |
@@ -576,8 +616,6 @@ def main(): |
logging.info('Creating %d projects for targets.', len(entries)) |
logging.warning('Writing .gradle files...') |
- jinja_processor = jinja_template.JinjaProcessor(_FILE_DIR) |
- build_vars = _ReadBuildVars(output_dir) |
project_entries = [] |
zip_tuples = [] |
generated_inputs = [] |