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

Side by Side Diff: build/android/gradle/generate_gradle.py

Issue 2691353005: Generate custom manifests when letting gradle process resources. (Closed)
Patch Set: Generate custom manifests when letting gradle process resources. Created 3 years, 10 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 unified diff | Download patch
« no previous file with comments | « no previous file | build/android/gradle/manifest.jinja » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2016 The Chromium Authors. All rights reserved. 2 # Copyright 2016 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Generates an Android Studio project from a GN target.""" 6 """Generates an Android Studio project from a GN target."""
7 7
8 import argparse 8 import argparse
9 import codecs 9 import codecs
10 import glob 10 import glob
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 path = os.path.join('gen', self.GradleSubdir() + '.build_config') 168 path = os.path.join('gen', self.GradleSubdir() + '.build_config')
169 self._build_config = build_utils.ReadJson(_RebasePath(path)) 169 self._build_config = build_utils.ReadJson(_RebasePath(path))
170 return self._build_config 170 return self._build_config
171 171
172 def DepsInfo(self): 172 def DepsInfo(self):
173 return self.BuildConfig()['deps_info'] 173 return self.BuildConfig()['deps_info']
174 174
175 def Gradle(self): 175 def Gradle(self):
176 return self.BuildConfig()['gradle'] 176 return self.BuildConfig()['gradle']
177 177
178 def Javac(self):
179 return self.BuildConfig()['javac']
180
178 def GetType(self): 181 def GetType(self):
179 """Returns the target type from its .build_config.""" 182 """Returns the target type from its .build_config."""
180 return self.DepsInfo()['type'] 183 return self.DepsInfo()['type']
181 184
182 def ResZips(self): 185 def ResZips(self):
183 return self.DepsInfo().get('owned_resources_zips') 186 return self.DepsInfo().get('owned_resources_zips')
184 187
185 def JavaFiles(self): 188 def JavaFiles(self):
186 if self._java_files is None: 189 if self._java_files is None:
187 java_sources_file = self.Gradle().get('java_sources_file') 190 java_sources_file = self.Gradle().get('java_sources_file')
(...skipping 28 matching lines...) Expand all
216 java_dirs.append( 219 java_dirs.append(
217 os.path.join(self.EntryOutputDir(entry), _SRCJARS_SUBDIR)) 220 os.path.join(self.EntryOutputDir(entry), _SRCJARS_SUBDIR))
218 return java_dirs, excludes 221 return java_dirs, excludes
219 222
220 def _GenResDirs(self, entry): 223 def _GenResDirs(self, entry):
221 res_dirs = list(entry.DepsInfo().get('owned_resources_dirs', [])) 224 res_dirs = list(entry.DepsInfo().get('owned_resources_dirs', []))
222 if entry.ResZips(): 225 if entry.ResZips():
223 res_dirs.append(os.path.join(self.EntryOutputDir(entry), _RES_SUBDIR)) 226 res_dirs.append(os.path.join(self.EntryOutputDir(entry), _RES_SUBDIR))
224 return res_dirs 227 return res_dirs
225 228
229 def _GenCustomManifest(self, entry, jinja_processor):
230 """Returns the path to the generated AndroidManifest.xml."""
231 javac = entry.Javac()
232 resource_packages = javac['resource_packages']
233 output_file = os.path.join(
234 self.EntryOutputDir(entry), 'AndroidManifest.xml')
235
236 if not resource_packages:
237 logging.error('Target ' + entry.GnTarget() + ' includes resources from '
238 'unknown package. Unable to process with gradle.')
239 return _DEFAULT_ANDROID_MANIFEST_PATH
240 elif len(resource_packages) > 1:
241 logging.error('Target ' + entry.GnTarget() + ' includes resources from '
242 'multiple packages. Unable to process with gradle.')
243 return _DEFAULT_ANDROID_MANIFEST_PATH
244
245 variables = {}
246 variables['package'] = resource_packages[0]
247
248 data = jinja_processor.Render(_TemplatePath('manifest'), variables)
249 _WriteFile(output_file, data)
250
251 return output_file
252
226 def _Relativize(self, entry, paths): 253 def _Relativize(self, entry, paths):
227 return _RebasePath(paths, self.EntryOutputDir(entry)) 254 return _RebasePath(paths, self.EntryOutputDir(entry))
228 255
229 def EntryOutputDir(self, entry): 256 def EntryOutputDir(self, entry):
230 return os.path.join(self.project_dir, entry.GradleSubdir()) 257 return os.path.join(self.project_dir, entry.GradleSubdir())
231 258
232 def Srcjars(self, entry): 259 def Srcjars(self, entry):
233 srcjars = _RebasePath(entry.Gradle().get('bundled_srcjars', [])) 260 srcjars = _RebasePath(entry.Gradle().get('bundled_srcjars', []))
234 if not self.use_gradle_process_resources: 261 if not self.use_gradle_process_resources:
235 srcjars += _RebasePath(entry.BuildConfig()['javac']['srcjars']) 262 srcjars += _RebasePath(entry.BuildConfig()['javac']['srcjars'])
236 return srcjars 263 return srcjars
237 264
238 def GeneratedInputs(self, entry): 265 def GeneratedInputs(self, entry):
239 generated_inputs = [] 266 generated_inputs = []
240 generated_inputs.extend(self.Srcjars(entry)) 267 generated_inputs.extend(self.Srcjars(entry))
241 generated_inputs.extend(_RebasePath(entry.ResZips())) 268 generated_inputs.extend(_RebasePath(entry.ResZips()))
242 generated_inputs.extend( 269 generated_inputs.extend(
243 p for p in entry.JavaFiles() if not p.startswith('..')) 270 p for p in entry.JavaFiles() if not p.startswith('..'))
244 generated_inputs.extend(entry.Gradle()['dependent_prebuilt_jars']) 271 generated_inputs.extend(entry.Gradle()['dependent_prebuilt_jars'])
245 return generated_inputs 272 return generated_inputs
246 273
247 def Generate(self, entry): 274 def Generate(self, entry, jinja_processor):
Peter Wen 2017/02/16 14:21:15 Rather than passing this in, can you pull it out t
sakal-chromium 2017/02/16 14:31:35 Done.
248 variables = {} 275 variables = {}
249 android_test_manifest = entry.Gradle().get(
250 'android_manifest', _DEFAULT_ANDROID_MANIFEST_PATH)
251 variables['android_manifest'] = self._Relativize(
252 entry, android_test_manifest)
253 java_dirs, excludes = self._GenJavaDirs(entry) 276 java_dirs, excludes = self._GenJavaDirs(entry)
254 variables['java_dirs'] = self._Relativize(entry, java_dirs) 277 variables['java_dirs'] = self._Relativize(entry, java_dirs)
255 variables['java_excludes'] = excludes 278 variables['java_excludes'] = excludes
256 variables['jni_libs'] = self._Relativize(entry, self._GenJniLibs(entry)) 279 variables['jni_libs'] = self._Relativize(entry, self._GenJniLibs(entry))
257 variables['res_dirs'] = self._Relativize(entry, self._GenResDirs(entry)) 280 variables['res_dirs'] = self._Relativize(entry, self._GenResDirs(entry))
281 android_manifest = entry.Gradle().get('android_manifest', None)
Peter Wen 2017/02/16 14:21:15 None is default, no need to specify it
sakal-chromium 2017/02/16 14:31:35 Done.
282 if not android_manifest:
283 # Gradle uses package id from manifest when generating R.class. So, we
284 # need to generate a custom manifest if we let gradle process resources.
285 if self.use_gradle_process_resources and variables['res_dirs']:
286 android_manifest = self._GenCustomManifest(entry, jinja_processor)
287 else:
288 android_manifest = _DEFAULT_ANDROID_MANIFEST_PATH
289 variables['android_manifest'] = self._Relativize(entry, android_manifest)
258 deps = [_ProjectEntry.FromBuildConfigPath(p) 290 deps = [_ProjectEntry.FromBuildConfigPath(p)
259 for p in entry.Gradle()['dependent_android_projects']] 291 for p in entry.Gradle()['dependent_android_projects']]
260 variables['android_project_deps'] = [d.ProjectName() for d in deps] 292 variables['android_project_deps'] = [d.ProjectName() for d in deps]
261 # TODO(agrieve): Add an option to use interface jars and see if that speeds 293 # TODO(agrieve): Add an option to use interface jars and see if that speeds
262 # things up at all. 294 # things up at all.
263 variables['prebuilts'] = self._Relativize( 295 variables['prebuilts'] = self._Relativize(
264 entry, entry.Gradle()['dependent_prebuilt_jars']) 296 entry, entry.Gradle()['dependent_prebuilt_jars'])
265 deps = [_ProjectEntry.FromBuildConfigPath(p) 297 deps = [_ProjectEntry.FromBuildConfigPath(p)
266 for p in entry.Gradle()['dependent_java_projects']] 298 for p in entry.Gradle()['dependent_java_projects']]
267 variables['java_project_deps'] = [d.ProjectName() for d in deps] 299 variables['java_project_deps'] = [d.ProjectName() for d in deps]
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 else: 444 else:
413 return None 445 return None
414 446
415 variables['target_name'] = os.path.splitext(deps_info['name'])[0] 447 variables['target_name'] = os.path.splitext(deps_info['name'])[0]
416 variables['template_type'] = target_type 448 variables['template_type'] = target_type
417 variables['use_gradle_process_resources'] = ( 449 variables['use_gradle_process_resources'] = (
418 generator.use_gradle_process_resources) 450 generator.use_gradle_process_resources)
419 variables['build_tools_version'] = ( 451 variables['build_tools_version'] = (
420 build_vars['android_sdk_build_tools_version']) 452 build_vars['android_sdk_build_tools_version'])
421 variables['compile_sdk_version'] = build_vars['android_sdk_version'] 453 variables['compile_sdk_version'] = build_vars['android_sdk_version']
422 variables['main'] = generator.Generate(entry) 454 variables['main'] = generator.Generate(entry, jinja_processor)
423 if entry.android_test_entry: 455 if entry.android_test_entry:
424 variables['android_test'] = generator.Generate( 456 variables['android_test'] = generator.Generate(
425 entry.android_test_entry) 457 entry.android_test_entry, jinja_processor)
426 458
427 return jinja_processor.Render( 459 return jinja_processor.Render(
428 _TemplatePath(target_type.split('_')[0]), variables) 460 _TemplatePath(target_type.split('_')[0]), variables)
429 461
430 462
431 def _GenerateRootGradle(jinja_processor): 463 def _GenerateRootGradle(jinja_processor):
432 """Returns the data for the root project's build.gradle.""" 464 """Returns the data for the root project's build.gradle."""
433 return jinja_processor.Render(_TemplatePath('root')) 465 return jinja_processor.Render(_TemplatePath('root'))
434 466
435 467
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 _ExtractZips(generator.project_dir, zip_tuples) 650 _ExtractZips(generator.project_dir, zip_tuples)
619 651
620 logging.warning('Project created! (%d subprojects)', len(project_entries)) 652 logging.warning('Project created! (%d subprojects)', len(project_entries))
621 logging.warning('Generated projects work best with Android Studio 2.2') 653 logging.warning('Generated projects work best with Android Studio 2.2')
622 logging.warning('For more tips: https://chromium.googlesource.com/chromium' 654 logging.warning('For more tips: https://chromium.googlesource.com/chromium'
623 '/src.git/+/master/docs/android_studio.md') 655 '/src.git/+/master/docs/android_studio.md')
624 656
625 657
626 if __name__ == '__main__': 658 if __name__ == '__main__':
627 main() 659 main()
OLDNEW
« no previous file with comments | « no previous file | build/android/gradle/manifest.jinja » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698