OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright 2014 The Chromium Authors. All rights reserved. | 3 # Copyright 2014 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """Writes a build_config file. | 7 """Writes a build_config file. |
8 | 8 |
9 The build_config file for a target is a json file containing information about | 9 The build_config file for a target is a json file containing information about |
10 how to build that target based on the target's dependencies. This includes | 10 how to build that target based on the target's dependencies. This includes |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 # android library options | 185 # android library options |
186 parser.add_option('--dex-path', help='Path to target\'s dex output.') | 186 parser.add_option('--dex-path', help='Path to target\'s dex output.') |
187 | 187 |
188 # native library options | 188 # native library options |
189 parser.add_option('--native-libs', help='List of top-level native libs.') | 189 parser.add_option('--native-libs', help='List of top-level native libs.') |
190 parser.add_option('--readelf-path', help='Path to toolchain\'s readelf.') | 190 parser.add_option('--readelf-path', help='Path to toolchain\'s readelf.') |
191 | 191 |
192 parser.add_option('--tested-apk-config', | 192 parser.add_option('--tested-apk-config', |
193 help='Path to the build config of the tested apk (for an instrumentation ' | 193 help='Path to the build config of the tested apk (for an instrumentation ' |
194 'test apk).') | 194 'test apk).') |
| 195 parser.add_option('--proguard-enabled', action='store_true', |
| 196 help='Whether proguard is enabled for this apk.') |
| 197 parser.add_option('--proguard-info', |
| 198 help='Path to the proguard .info output for this apk.') |
195 | 199 |
196 options, args = parser.parse_args(argv) | 200 options, args = parser.parse_args(argv) |
197 | 201 |
198 if args: | 202 if args: |
199 parser.error('No positional arguments should be given.') | 203 parser.error('No positional arguments should be given.') |
200 | 204 |
201 required_options_map = { | 205 required_options_map = { |
202 'java_library': ['build_config', 'jar_path'], | 206 'java_library': ['build_config', 'jar_path'], |
203 'android_assets': ['build_config'], | 207 'android_assets': ['build_config'], |
204 'android_resources': ['build_config', 'resources_zip'], | 208 'android_resources': ['build_config', 'resources_zip'], |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 | 348 |
345 if options.type == 'android_apk' or options.type == 'resource_rewriter': | 349 if options.type == 'android_apk' or options.type == 'resource_rewriter': |
346 config['resources']['extra_package_names'] = [ | 350 config['resources']['extra_package_names'] = [ |
347 c['package_name'] for c in all_resources_deps if 'package_name' in c] | 351 c['package_name'] for c in all_resources_deps if 'package_name' in c] |
348 config['resources']['extra_r_text_files'] = [ | 352 config['resources']['extra_r_text_files'] = [ |
349 c['r_text'] for c in all_resources_deps if 'r_text' in c] | 353 c['r_text'] for c in all_resources_deps if 'r_text' in c] |
350 | 354 |
351 if options.type in ['android_apk', 'deps_dex']: | 355 if options.type in ['android_apk', 'deps_dex']: |
352 deps_dex_files = [c['dex_path'] for c in all_library_deps] | 356 deps_dex_files = [c['dex_path'] for c in all_library_deps] |
353 | 357 |
| 358 proguard_enabled = options.proguard_enabled |
| 359 if options.type == 'android_apk': |
| 360 deps_info['proguard_enabled'] = proguard_enabled |
| 361 |
| 362 if proguard_enabled: |
| 363 deps_info['proguard_info'] = options.proguard_info |
| 364 config['proguard'] = {} |
| 365 proguard_config = config['proguard'] |
| 366 proguard_config['input_paths'] = [options.jar_path] + java_full_classpath |
| 367 proguard_config['tested_apk_info'] = '' |
| 368 |
354 # An instrumentation test apk should exclude the dex files that are in the apk | 369 # An instrumentation test apk should exclude the dex files that are in the apk |
355 # under test. | 370 # under test. |
356 if options.type == 'android_apk' and options.tested_apk_config: | 371 if options.type == 'android_apk' and options.tested_apk_config: |
357 tested_apk_deps = Deps([options.tested_apk_config]) | 372 tested_apk_deps = Deps([options.tested_apk_config]) |
358 tested_apk_library_deps = tested_apk_deps.All('java_library') | 373 tested_apk_library_deps = tested_apk_deps.All('java_library') |
359 tested_apk_deps_dex_files = [c['dex_path'] for c in tested_apk_library_deps] | 374 tested_apk_deps_dex_files = [c['dex_path'] for c in tested_apk_library_deps] |
360 deps_dex_files = [ | 375 deps_dex_files = [ |
361 p for p in deps_dex_files if not p in tested_apk_deps_dex_files] | 376 p for p in deps_dex_files if not p in tested_apk_deps_dex_files] |
362 | 377 |
363 tested_apk_config = GetDepConfig(options.tested_apk_config) | 378 tested_apk_config = GetDepConfig(options.tested_apk_config) |
364 expected_tested_package = tested_apk_config['package_name'] | 379 expected_tested_package = tested_apk_config['package_name'] |
365 AndroidManifest(options.android_manifest).CheckInstrumentation( | 380 AndroidManifest(options.android_manifest).CheckInstrumentation( |
366 expected_tested_package) | 381 expected_tested_package) |
| 382 if tested_apk_config['proguard_enabled']: |
| 383 assert proguard_enabled, ('proguard must be enabled for instrumentation' |
| 384 ' apks if it\'s enabled for the tested apk') |
| 385 proguard_config['tested_apk_info'] = tested_apk_config['proguard_info'] |
367 | 386 |
368 # Dependencies for the final dex file of an apk or a 'deps_dex'. | 387 # Dependencies for the final dex file of an apk or a 'deps_dex'. |
369 if options.type in ['android_apk', 'deps_dex']: | 388 if options.type in ['android_apk', 'deps_dex']: |
370 config['final_dex'] = {} | 389 config['final_dex'] = {} |
371 dex_config = config['final_dex'] | 390 dex_config = config['final_dex'] |
372 # TODO(cjhopman): proguard version | 391 if proguard_enabled: |
| 392 # When proguard is enabled, the proguarded jar contains the code for all |
| 393 # of the dependencies. |
| 394 deps_dex_files = [] |
373 dex_config['dependency_dex_files'] = deps_dex_files | 395 dex_config['dependency_dex_files'] = deps_dex_files |
374 | 396 |
375 if options.type == 'android_apk': | 397 if options.type == 'android_apk': |
376 config['dist_jar'] = { | 398 config['dist_jar'] = { |
377 'dependency_jars': [ | 399 'dependency_jars': [ |
378 c['jar_path'] for c in all_library_deps | 400 c['jar_path'] for c in all_library_deps |
379 ] | 401 ] |
380 } | 402 } |
381 manifest = AndroidManifest(options.android_manifest) | 403 manifest = AndroidManifest(options.android_manifest) |
382 deps_info['package_name'] = manifest.GetPackageName() | 404 deps_info['package_name'] = manifest.GetPackageName() |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 build_utils.WriteJson(config, options.build_config, only_if_changed=True) | 447 build_utils.WriteJson(config, options.build_config, only_if_changed=True) |
426 | 448 |
427 if options.depfile: | 449 if options.depfile: |
428 build_utils.WriteDepfile( | 450 build_utils.WriteDepfile( |
429 options.depfile, | 451 options.depfile, |
430 deps.AllConfigPaths() + build_utils.GetPythonDependencies()) | 452 deps.AllConfigPaths() + build_utils.GetPythonDependencies()) |
431 | 453 |
432 | 454 |
433 if __name__ == '__main__': | 455 if __name__ == '__main__': |
434 sys.exit(main(sys.argv[1:])) | 456 sys.exit(main(sys.argv[1:])) |
OLD | NEW |