Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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() |
| OLD | NEW |