1# Copyright (c) 2012 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5# This file is meant to be included into a target to provide a rule 6# to build Android APKs in a consistent manner. 7# 8# To use this, create a gyp target with the following form: 9# { 10# 'target_name': 'my_package_apk', 11# 'type': 'none', 12# 'variables': { 13# 'apk_name': 'MyPackage', 14# 'java_in_dir': 'path/to/package/root', 15# 'resource_dir': 'path/to/package/root/res', 16# }, 17# 'includes': ['path/to/this/gypi/file'], 18# } 19# 20# Required variables: 21# apk_name - The final apk will be named <apk_name>.apk 22# java_in_dir - The top-level java directory. The src should be in 23# <(java_in_dir)/src. 24# Optional/automatic variables: 25# additional_input_paths - These paths will be included in the 'inputs' list to 26# ensure that this target is rebuilt when one of these paths changes. 27# additional_res_dirs - Additional directories containing Android resources. 28# additional_res_packages - Package names of the R.java files corresponding to 29# each directory in additional_res_dirs. 30# additional_src_dirs - Additional directories with .java files to be compiled 31# and included in the output of this target. 32# asset_location - The directory where assets are located. 33# generated_src_dirs - Same as additional_src_dirs except used for .java files 34# that are generated at build time. This should be set automatically by a 35# target's dependencies. The .java files in these directories are not 36# included in the 'inputs' list (unlike additional_src_dirs). 37# input_jars_paths - The path to jars to be included in the classpath. This 38# should be filled automatically by depending on the appropriate targets. 39# is_test_apk - Set to 1 if building a test apk. This prevents resources from 40# dependencies from being re-included. 41# native_lib_target - The target_name of the target which generates the final 42# shared library to be included in this apk. A stripped copy of the 43# library will be included in the apk. 44# resource_dir - The directory for resources. 45# R_package - A custom Java package to generate the resource file R.java in. 46# By default, the package given in AndroidManifest.xml will be used. 47# use_chromium_linker - Enable the content dynamic linker that allows sharing the 48# RELRO section of the native libraries between the different processes. 49# enable_chromium_linker_tests - Enable the content dynamic linker test support 50# code. This allows a test APK to inject a Linker.TestRunner instance at 51# runtime. Should only be used by the chromium_linker_test_apk target!! 52# never_lint - Set to 1 to not run lint on this target. 53{ 54 'variables': { 55 'tested_apk_obfuscated_jar_path%': '/', 56 'tested_apk_dex_path%': '/', 57 'additional_input_paths': [], 58 'input_jars_paths': [], 59 'library_dexed_jars_paths': [], 60 'additional_src_dirs': [], 61 'generated_src_dirs': [], 62 'app_manifest_version_name%': '<(android_app_version_name)', 63 'app_manifest_version_code%': '<(android_app_version_code)', 64 # aapt generates this proguard.txt. 65 'generated_proguard_file': '<(intermediate_dir)/proguard.txt', 66 'proguard_enabled%': 'false', 67 'proguard_flags_paths': ['<(generated_proguard_file)'], 68 'jar_name': 'chromium_apk_<(_target_name).jar', 69 'resource_dir%':'<(DEPTH)/build/android/ant/empty/res', 70 'R_package%':'', 71 'additional_R_text_files': [], 72 'dependencies_res_zip_paths': [], 73 'additional_res_packages': [], 74 'is_test_apk%': 0, 75 'extensions_to_not_compress%': '', 76 'resource_input_paths': [], 77 'intermediate_dir': '<(PRODUCT_DIR)/<(_target_name)', 78 'asset_location%': '<(intermediate_dir)/assets', 79 'codegen_stamp': '<(intermediate_dir)/codegen.stamp', 80 'package_input_paths': [], 81 'ordered_libraries_file': '<(intermediate_dir)/native_libraries.json', 82 'native_libraries_template': '<(DEPTH)/base/android/java/templates/NativeLibraries.template', 83 'native_libraries_java_dir': '<(intermediate_dir)/native_libraries_java/', 84 'native_libraries_java_file': '<(native_libraries_java_dir)/NativeLibraries.java', 85 'native_libraries_java_stamp': '<(intermediate_dir)/native_libraries_java.stamp', 86 'native_libraries_template_data_dir': '<(intermediate_dir)/native_libraries/', 87 'native_libraries_template_data_file': '<(native_libraries_template_data_dir)/native_libraries_array.h', 88 'native_libraries_template_version_file': '<(native_libraries_template_data_dir)/native_libraries_version.h', 89 'compile_stamp': '<(intermediate_dir)/compile.stamp', 90 'lint_stamp': '<(intermediate_dir)/lint.stamp', 91 'lint_result': '<(intermediate_dir)/lint_result.xml', 92 'lint_config': '<(intermediate_dir)/lint_config.xml', 93 'never_lint%': 0, 94 'instr_stamp': '<(intermediate_dir)/instr.stamp', 95 'jar_stamp': '<(intermediate_dir)/jar.stamp', 96 'obfuscate_stamp': '<(intermediate_dir)/obfuscate.stamp', 97 'strip_stamp': '<(intermediate_dir)/strip.stamp', 98 'classes_dir': '<(intermediate_dir)/classes', 99 'classes_final_dir': '<(intermediate_dir)/classes_instr', 100 'javac_includes': [], 101 'jar_excluded_classes': [], 102 'jar_path': '<(PRODUCT_DIR)/lib.java/<(jar_name)', 103 'obfuscated_jar_path': '<(intermediate_dir)/obfuscated.jar', 104 'test_jar_path': '<(PRODUCT_DIR)/test.lib.java/<(apk_name).jar', 105 'dex_path': '<(intermediate_dir)/classes.dex', 106 'emma_device_jar': '<(android_sdk_root)/tools/lib/emma_device.jar', 107 'android_manifest_path%': '<(java_in_dir)/AndroidManifest.xml', 108 'push_stamp': '<(intermediate_dir)/push.stamp', 109 'link_stamp': '<(intermediate_dir)/link.stamp', 110 'package_resources_stamp': '<(intermediate_dir)/package_resources.stamp', 111 'resource_zip_path': '<(intermediate_dir)/<(_target_name).resources.zip', 112 'resource_packaged_apk_name': '<(apk_name)-resources.ap_', 113 'resource_packaged_apk_path': '<(intermediate_dir)/<(resource_packaged_apk_name)', 114 'unsigned_apk_path': '<(intermediate_dir)/<(apk_name)-unsigned.apk', 115 'final_apk_path%': '<(PRODUCT_DIR)/apks/<(apk_name).apk', 116 'incomplete_apk_path': '<(intermediate_dir)/<(apk_name)-incomplete.apk', 117 'apk_install_record': '<(intermediate_dir)/apk_install.record.stamp', 118 'device_intermediate_dir': '/data/data/org.chromium.gyp_managed_install/<(_target_name)/<(CONFIGURATION_NAME)', 119 'symlink_script_host_path': '<(intermediate_dir)/create_symlinks.sh', 120 'symlink_script_device_path': '<(device_intermediate_dir)/create_symlinks.sh', 121 'create_standalone_apk%': 1, 122 'res_v14_verify_only%': 0, 123 'variables': { 124 'variables': { 125 'native_lib_target%': '', 126 'native_lib_version_name%': '', 127 'use_chromium_linker%' : 0, 128 'enable_chromium_linker_tests%': 0, 129 'is_test_apk%': 0, 130 }, 131 'conditions': [ 132 ['gyp_managed_install == 1 and native_lib_target != ""', { 133 'unsigned_standalone_apk_path': '<(intermediate_dir)/<(apk_name)-standalone-unsigned.apk', 134 }, { 135 'unsigned_standalone_apk_path': '<(unsigned_apk_path)', 136 }], 137 ['gyp_managed_install == 1', { 138 'apk_package_native_libs_dir': '<(intermediate_dir)/libs.managed', 139 }, { 140 'apk_package_native_libs_dir': '<(intermediate_dir)/libs', 141 }], 142 ['is_test_apk == 0 and emma_coverage != 0', { 143 'emma_instrument%': 1, 144 },{ 145 'emma_instrument%': 0, 146 }], 147 ], 148 }, 149 'native_lib_target%': '', 150 'native_lib_version_name%': '', 151 'use_chromium_linker%' : 0, 152 'enable_chromium_linker_tests%': 0, 153 'emma_instrument%': '<(emma_instrument)', 154 'apk_package_native_libs_dir': '<(apk_package_native_libs_dir)', 155 'unsigned_standalone_apk_path': '<(unsigned_standalone_apk_path)', 156 'extra_native_libs': [], 157 'apk_dex_input_paths': [ '>@(library_dexed_jars_paths)' ], 158 }, 159 # Pass the jar path to the apk's "fake" jar target. This would be better as 160 # direct_dependent_settings, but a variable set by a direct_dependent_settings 161 # cannot be lifted in a dependent to all_dependent_settings. 162 'all_dependent_settings': { 163 'conditions': [ 164 ['proguard_enabled == "true"', { 165 'variables': { 166 'proguard_enabled': 'true', 167 } 168 }], 169 ], 170 'variables': { 171 'apk_output_jar_path': '<(jar_path)', 172 'tested_apk_obfuscated_jar_path': '<(obfuscated_jar_path)', 173 'tested_apk_dex_path': '<(dex_path)', 174 }, 175 }, 176 'conditions': [ 177 ['resource_dir!=""', { 178 'variables': { 179 'resource_input_paths': [ '<!@(find <(resource_dir) -name "*")' ] 180 }, 181 }], 182 ['R_package != ""', { 183 'variables': { 184 # We generate R.java in package R_package (in addition to the package 185 # listed in the AndroidManifest.xml, which is unavoidable). 186 'additional_res_packages': ['<(R_package)'], 187 'additional_R_text_files': ['<(PRODUCT_DIR)/<(package_name)/R.txt'], 188 }, 189 }], 190 ['native_lib_target != "" and component == "shared_library"', { 191 'dependencies': [ 192 '<(DEPTH)/build/android/setup.gyp:copy_system_libraries', 193 ], 194 }], 195 ['use_chromium_linker == 1', { 196 'dependencies': [ 197 '<(DEPTH)/base/base.gyp:chromium_android_linker', 198 ], 199 }], 200 ['native_lib_target != ""', { 201 'variables': { 202 'generated_src_dirs': [ '<(native_libraries_java_dir)' ], 203 'native_libs_paths': [ 204 '<(SHARED_LIB_DIR)/<(native_lib_target).>(android_product_extension)' 205 ], 206 'package_input_paths': [ 207 '<(apk_package_native_libs_dir)/<(android_app_abi)/gdbserver', 208 ], 209 }, 210 'copies': [ 211 { 212 # gdbserver is always copied into the APK's native libs dir. The ant 213 # build scripts (apkbuilder task) will only include it in a debug 214 # build. 215 'destination': '<(apk_package_native_libs_dir)/<(android_app_abi)', 216 'files': [ 217 '<(android_gdbserver)', 218 ], 219 }, 220 ], 221 'actions': [ 222 { 223 'variables': { 224 'conditions': [ 225 ['use_chromium_linker == 1', { 226 'variables': { 227 'linker_input_libraries': [ 228 '<(SHARED_LIB_DIR)/libchromium_android_linker.>(android_product_extension)', 229 ], 230 } 231 }, { 232 'variables': { 233 'linker_input_libraries': [], 234 }, 235 }], 236 ], 237 'input_libraries': [ 238 '<@(native_libs_paths)', 239 '<@(extra_native_libs)', 240 '<@(linker_input_libraries)', 241 ], 242 }, 243 'includes': ['../build/android/write_ordered_libraries.gypi'], 244 }, 245 { 246 'action_name': 'native_libraries_template_data_<(_target_name)', 247 'message': 'Creating native_libraries_list.h for <(_target_name)', 248 'inputs': [ 249 '<(DEPTH)/build/android/gyp/util/build_utils.py', 250 '<(DEPTH)/build/android/gyp/create_native_libraries_header.py', 251 '<(ordered_libraries_file)', 252 ], 253 'outputs': [ 254 '<(native_libraries_template_data_file)', 255 '<(native_libraries_template_version_file)', 256 ], 257 'action': [ 258 'python', '<(DEPTH)/build/android/gyp/create_native_libraries_header.py', 259 '--ordered-libraries=<(ordered_libraries_file)', 260 '--version-name=<(native_lib_version_name)', 261 '--native-library-list=<(native_libraries_template_data_file)', 262 '--version-output=<(native_libraries_template_version_file)', 263 ], 264 }, 265 { 266 'action_name': 'native_libraries_<(_target_name)', 267 'variables': { 268 'conditions': [ 269 ['use_chromium_linker == 1', { 270 'variables': { 271 'linker_gcc_preprocess_defines': [ 272 '--defines', 'ENABLE_CHROMIUM_LINKER', 273 ], 274 } 275 }, { 276 'variables': { 277 'linker_gcc_preprocess_defines': [], 278 }, 279 }], 280 ['enable_chromium_linker_tests == 1', { 281 'variables': { 282 'linker_tests_gcc_preprocess_defines': [ 283 '--defines', 'ENABLE_CHROMIUM_LINKER_TESTS', 284 ], 285 } 286 }, { 287 'variables': { 288 'linker_tests_gcc_preprocess_defines': [], 289 }, 290 }], 291 ], 292 'gcc_preprocess_defines': [ 293 '<@(linker_gcc_preprocess_defines)', 294 '<@(linker_tests_gcc_preprocess_defines)', 295 ], 296 }, 297 'message': 'Creating NativeLibraries.java for <(_target_name)', 298 'inputs': [ 299 '<(DEPTH)/build/android/gyp/util/build_utils.py', 300 '<(DEPTH)/build/android/gyp/gcc_preprocess.py', 301 '<(native_libraries_template_data_file)', 302 '<(native_libraries_template_version_file)', 303 '<(native_libraries_template)', 304 ], 305 'outputs': [ 306 '<(native_libraries_java_stamp)', 307 ], 308 'action': [ 309 'python', '<(DEPTH)/build/android/gyp/gcc_preprocess.py', 310 '--include-path=<(native_libraries_template_data_dir)', 311 '--output=<(native_libraries_java_file)', 312 '--template=<(native_libraries_template)', 313 '--stamp=<(native_libraries_java_stamp)', 314 '<@(gcc_preprocess_defines)', 315 ], 316 }, 317 { 318 'action_name': 'strip_native_libraries', 319 'variables': { 320 'ordered_libraries_file%': '<(ordered_libraries_file)', 321 'stripped_libraries_dir': '<(libraries_source_dir)', 322 'input_paths': [ 323 '<@(native_libs_paths)', 324 '<@(extra_native_libs)', 325 ], 326 'stamp': '<(strip_stamp)' 327 }, 328 'includes': ['../build/android/strip_native_libraries.gypi'], 329 }, 330 ], 331 'conditions': [ 332 ['gyp_managed_install == 1', { 333 'variables': { 334 'libraries_top_dir': '<(intermediate_dir)/lib.stripped', 335 'libraries_source_dir': '<(libraries_top_dir)/lib/<(android_app_abi)', 336 'device_library_dir': '<(device_intermediate_dir)/lib.stripped', 337 'configuration_name': '<(CONFIGURATION_NAME)', 338 }, 339 'dependencies': [ 340 '<(DEPTH)/build/android/setup.gyp:get_build_device_configurations', 341 ], 342 'actions': [ 343 { 344 'includes': ['../build/android/push_libraries.gypi'], 345 }, 346 { 347 'action_name': 'create device library symlinks', 348 'message': 'Creating links on device for <(_target_name)', 349 'inputs': [ 350 '<(DEPTH)/build/android/gyp/util/build_utils.py', 351 '<(DEPTH)/build/android/gyp/create_device_library_links.py', 352 '<(apk_install_record)', 353 '<(build_device_config_path)', 354 '<(ordered_libraries_file)', 355 ], 356 'outputs': [ 357 '<(link_stamp)' 358 ], 359 'action': [ 360 'python', '<(DEPTH)/build/android/gyp/create_device_library_links.py', 361 '--build-device-configuration=<(build_device_config_path)', 362 '--libraries-json=<(ordered_libraries_file)', 363 '--script-host-path=<(symlink_script_host_path)', 364 '--script-device-path=<(symlink_script_device_path)', 365 '--target-dir=<(device_library_dir)', 366 '--apk=<(incomplete_apk_path)', 367 '--stamp=<(link_stamp)', 368 '--configuration-name=<(CONFIGURATION_NAME)', 369 ], 370 }, 371 ], 372 'conditions': [ 373 ['create_standalone_apk == 1', { 374 'actions': [ 375 { 376 'action_name': 'create standalone APK', 377 'variables': { 378 'inputs': [ 379 '<(ordered_libraries_file)', 380 '<(strip_stamp)', 381 ], 382 'input_apk_path': '<(unsigned_apk_path)', 383 'output_apk_path': '<(unsigned_standalone_apk_path)', 384 'libraries_top_dir%': '<(libraries_top_dir)', 385 }, 386 'includes': [ 'android/create_standalone_apk_action.gypi' ], 387 }, 388 ], 389 }], 390 ], 391 }, { 392 # gyp_managed_install != 1 393 'variables': { 394 'libraries_source_dir': '<(apk_package_native_libs_dir)/<(android_app_abi)', 395 'package_input_paths': [ '<(strip_stamp)' ], 396 }, 397 }], 398 ], 399 }], # native_lib_target != '' 400 ['gyp_managed_install == 0 or create_standalone_apk == 1', { 401 'actions': [ 402 { 403 'action_name': 'finalize standalone apk', 404 'variables': { 405 'input_apk_path': '<(unsigned_standalone_apk_path)', 406 'output_apk_path': '<(final_apk_path)', 407 }, 408 'includes': [ 'android/finalize_apk_action.gypi'] 409 }, 410 ], 411 }], 412 ['gyp_managed_install == 1', { 413 'actions': [ 414 { 415 'action_name': 'finalize incomplete apk', 416 'variables': { 417 'input_apk_path': '<(unsigned_apk_path)', 418 'output_apk_path': '<(incomplete_apk_path)', 419 }, 420 'includes': [ 'android/finalize_apk_action.gypi'] 421 }, 422 { 423 'action_name': 'apk_install_<(_target_name)', 424 'message': 'Installing <(apk_name).apk', 425 'inputs': [ 426 '<(DEPTH)/build/android/gyp/util/build_utils.py', 427 '<(DEPTH)/build/android/gyp/apk_install.py', 428 '<(build_device_config_path)', 429 '<(incomplete_apk_path)', 430 ], 431 'outputs': [ 432 '<(apk_install_record)', 433 ], 434 'action': [ 435 'python', '<(DEPTH)/build/android/gyp/apk_install.py', 436 '--apk-path=<(incomplete_apk_path)', 437 '--build-device-configuration=<(build_device_config_path)', 438 '--install-record=<(apk_install_record)', 439 '--configuration-name=<(CONFIGURATION_NAME)', 440 ], 441 }, 442 ], 443 }], 444 ['is_test_apk == 1', { 445 'dependencies': [ 446 '<(DEPTH)/tools/android/android_tools.gyp:android_tools', 447 ] 448 }], 449 ], 450 'dependencies': [ 451 '<(DEPTH)/tools/android/md5sum/md5sum.gyp:md5sum', 452 ], 453 'actions': [ 454 { 455 'action_name': 'process_resources', 456 'message': 'processing resources for <(_target_name)', 457 'variables': { 458 # Write the inputs list to a file, so that its mtime is updated when 459 # the list of inputs changes. 460 'inputs_list_file': '>|(apk_codegen.<(_target_name).gypcmd >@(additional_input_paths) >@(resource_input_paths))', 461 'process_resources_options': [], 462 'conditions': [ 463 ['is_test_apk == 1', { 464 'dependencies_res_zip_paths=': [], 465 'additional_res_packages=': [], 466 }], 467 ['res_v14_verify_only == 1', { 468 'process_resources_options': ['--v14-verify-only'] 469 }], 470 ], 471 }, 472 'inputs': [ 473 '<(DEPTH)/build/android/gyp/util/build_utils.py', 474 '<(DEPTH)/build/android/gyp/process_resources.py', 475 '<(android_manifest_path)', 476 '>@(additional_input_paths)', 477 '>@(resource_input_paths)', 478 '>@(dependencies_res_zip_paths)', 479 '>(inputs_list_file)', 480 ], 481 'outputs': [ 482 '<(resource_zip_path)', 483 '<(generated_proguard_file)', 484 '<(codegen_stamp)', 485 ], 486 'action': [ 487 'python', '<(DEPTH)/build/android/gyp/process_resources.py', 488 '--android-sdk', '<(android_sdk)', 489 '--android-sdk-tools', '<(android_sdk_tools)', 490 491 '--android-manifest', '<(android_manifest_path)', 492 '--dependencies-res-zips', '>(dependencies_res_zip_paths)', 493 494 '--extra-res-packages', '>(additional_res_packages)', 495 '--extra-r-text-files', '>(additional_R_text_files)', 496 497 '--proguard-file', '<(generated_proguard_file)', 498 499 '--resource-dirs', '<(resource_dir)', 500 '--resource-zip-out', '<(resource_zip_path)', 501 502 '--R-dir', '<(intermediate_dir)/gen', 503 504 '--stamp', '<(codegen_stamp)', 505 506 '<@(process_resources_options)', 507 ], 508 }, 509 { 510 'action_name': 'javac_<(_target_name)', 511 'message': 'Compiling java for <(_target_name)', 512 'variables': { 513 'gen_src_dirs': [ 514 '<(intermediate_dir)/gen', 515 '>@(generated_src_dirs)', 516 ], 517 # If there is a separate find for additional_src_dirs, it will find the 518 # wrong .java files when additional_src_dirs is empty. 519 # TODO(thakis): Gyp caches >! evaluation by command. Both java.gypi and 520 # java_apk.gypi evaluate the same command, and at the moment two targets 521 # set java_in_dir to "java". Add a dummy comment here to make sure 522 # that the two targets (one uses java.gypi, the other java_apk.gypi) 523 # get distinct source lists. Medium-term, make targets list all their 524 # Java files instead of using find. (As is, this will be broken if two 525 # targets use the same java_in_dir and both use java_apk.gypi or 526 # both use java.gypi.) 527 'java_sources': ['>!@(find >(java_in_dir)/src >(additional_src_dirs) -name "*.java" # apk)'], 528 529 }, 530 'inputs': [ 531 '<(DEPTH)/build/android/gyp/util/build_utils.py', 532 '<(DEPTH)/build/android/gyp/javac.py', 533 '>@(java_sources)', 534 '>@(input_jars_paths)', 535 '<(codegen_stamp)', 536 ], 537 'conditions': [ 538 ['native_lib_target != ""', { 539 'inputs': [ '<(native_libraries_java_stamp)' ], 540 }], 541 ], 542 'outputs': [ 543 '<(compile_stamp)', 544 ], 545 'action': [ 546 'python', '<(DEPTH)/build/android/gyp/javac.py', 547 '--output-dir=<(classes_dir)', 548 '--classpath=>(input_jars_paths) <(android_sdk_jar)', 549 '--src-gendirs=>(gen_src_dirs)', 550 '--javac-includes=<(javac_includes)', 551 '--chromium-code=<(chromium_code)', 552 '--stamp=<(compile_stamp)', 553 '>@(java_sources)', 554 ], 555 }, 556 { 557 'variables': { 558 'src_dirs': [ 559 '<(java_in_dir)/src', 560 '>@(additional_src_dirs)', 561 ], 562 'stamp_path': '<(lint_stamp)', 563 'result_path': '<(lint_result)', 564 'config_path': '<(lint_config)', 565 }, 566 'inputs': [ 567 '<(compile_stamp)', 568 ], 569 'outputs': [ 570 '<(lint_stamp)', 571 ], 572 'includes': [ 'android/lint_action.gypi' ], 573 }, 574 { 575 'action_name': 'instr_classes_<(_target_name)', 576 'message': 'Instrumenting <(_target_name) classes', 577 'variables': { 578 'input_path': '<(classes_dir)', 579 'output_path': '<(classes_final_dir)', 580 'stamp_path': '<(instr_stamp)', 581 'instr_type': 'classes', 582 }, 583 'inputs': [ 584 '<(compile_stamp)', 585 ], 586 'outputs': [ 587 '<(instr_stamp)', 588 ], 589 'includes': [ 'android/instr_action.gypi' ], 590 }, 591 { 592 'action_name': 'jar_<(_target_name)', 593 'message': 'Creating <(_target_name) jar', 594 'inputs': [ 595 '<(DEPTH)/build/android/gyp/util/build_utils.py', 596 '<(DEPTH)/build/android/gyp/util/md5_check.py', 597 '<(DEPTH)/build/android/gyp/jar.py', 598 '<(instr_stamp)', 599 ], 600 'outputs': [ 601 '<(jar_stamp)', 602 '<(jar_path)', 603 ], 604 'action': [ 605 'python', '<(DEPTH)/build/android/gyp/jar.py', 606 '--classes-dir=<(classes_final_dir)', 607 '--jar-path=<(jar_path)', 608 '--excluded-classes=<(jar_excluded_classes)', 609 '--stamp=<(jar_stamp)', 610 ] 611 }, 612 { 613 'action_name': 'obfuscate_<(_target_name)', 614 'message': 'Obfuscating <(_target_name)', 615 'variables': { 616 'additional_obfuscate_options': [], 617 'additional_obfuscate_input_paths': [], 618 'proguard_out_dir': '<(intermediate_dir)/proguard', 619 'proguard_input_jar_paths': [ 620 '>@(input_jars_paths)', 621 '<(jar_path)', 622 ], 623 'target_conditions': [ 624 ['is_test_apk == 1', { 625 'additional_obfuscate_options': [ 626 '--testapp', 627 ], 628 }], 629 ['is_test_apk == 1 and tested_apk_obfuscated_jar_path != "/"', { 630 'additional_obfuscate_options': [ 631 '--tested-apk-obfuscated-jar-path', '>(tested_apk_obfuscated_jar_path)', 632 ], 633 'additional_obfuscate_input_paths': [ 634 '>(tested_apk_obfuscated_jar_path).info', 635 ], 636 }], 637 ['proguard_enabled == "true"', { 638 'additional_obfuscate_options': [ 639 '--proguard-enabled', 640 ], 641 }], 642 ], 643 'obfuscate_input_jars_paths': [ 644 '>@(input_jars_paths)', 645 '<(jar_path)', 646 ], 647 }, 648 'conditions': [ 649 ['is_test_apk == 1', { 650 'outputs': [ 651 '<(test_jar_path)', 652 ], 653 }], 654 ], 655 'inputs': [ 656 '<(DEPTH)/build/android/gyp/apk_obfuscate.py', 657 '<(DEPTH)/build/android/gyp/util/build_utils.py', 658 '>@(proguard_flags_paths)', 659 '>@(obfuscate_input_jars_paths)', 660 '>@(additional_obfuscate_input_paths)', 661 '<(instr_stamp)', 662 ], 663 'outputs': [ 664 '<(obfuscate_stamp)', 665 666 # In non-Release builds, these paths will all be empty files. 667 '<(obfuscated_jar_path)', 668 '<(obfuscated_jar_path).info', 669 '<(obfuscated_jar_path).dump', 670 '<(obfuscated_jar_path).seeds', 671 '<(obfuscated_jar_path).mapping', 672 '<(obfuscated_jar_path).usage', 673 ], 674 'action': [ 675 'python', '<(DEPTH)/build/android/gyp/apk_obfuscate.py', 676 677 '--configuration-name', '<(CONFIGURATION_NAME)', 678 679 '--android-sdk', '<(android_sdk)', 680 '--android-sdk-tools', '<(android_sdk_tools)', 681 '--android-sdk-jar', '<(android_sdk_jar)', 682 683 '--input-jars-paths=>(proguard_input_jar_paths)', 684 '--proguard-configs=>(proguard_flags_paths)', 685 686 687 '--test-jar-path', '<(test_jar_path)', 688 '--obfuscated-jar-path', '<(obfuscated_jar_path)', 689 690 '--proguard-jar-path', '<(android_sdk_root)/tools/proguard/lib/proguard.jar', 691 692 '--stamp', '<(obfuscate_stamp)', 693 694 '>@(additional_obfuscate_options)', 695 ], 696 }, 697 { 698 'action_name': 'dex_<(_target_name)', 699 'variables': { 700 'output_path': '<(dex_path)', 701 'dex_input_paths': [ 702 '>@(apk_dex_input_paths)', 703 '<(jar_path)', 704 ], 705 'proguard_enabled_input_path': '<(obfuscated_jar_path)', 706 }, 707 'target_conditions': [ 708 ['emma_instrument != 0', { 709 'dex_no_locals': 1, 710 'dex_input_paths': [ 711 '<(emma_device_jar)' 712 ], 713 }], 714 ['is_test_apk == 1 and tested_apk_dex_path != "/"', { 715 'variables': { 716 'dex_additional_options': [ 717 '--excluded-paths-file', '>(tested_apk_dex_path).inputs' 718 ], 719 }, 720 'inputs': [ 721 '>(tested_apk_dex_path).inputs', 722 ], 723 }], 724 ['proguard_enabled == "true"', { 725 'inputs': [ '<(obfuscate_stamp)' ] 726 }, { 727 'inputs': [ '<(instr_stamp)' ] 728 }], 729 ], 730 'includes': [ 'android/dex_action.gypi' ], 731 }, 732 { 733 'action_name': 'package_resources', 734 'message': 'packaging resources for <(_target_name)', 735 'variables': { 736 'package_resource_zip_input_paths': [ 737 '<(resource_zip_path)', 738 '>@(dependencies_res_zip_paths)', 739 ], 740 }, 741 'conditions': [ 742 ['is_test_apk == 1', { 743 'variables': { 744 'dependencies_res_zip_paths=': [], 745 'additional_res_packages=': [], 746 } 747 }], 748 ], 749 'inputs': [ 750 # TODO: This isn't always rerun correctly, http://crbug.com/351928 751 '<(DEPTH)/build/android/gyp/util/build_utils.py', 752 '<(DEPTH)/build/android/gyp/package_resources.py', 753 '<(android_manifest_path)', 754 755 '>@(package_resource_zip_input_paths)', 756 757 '<(codegen_stamp)', 758 ], 759 'outputs': [ 760 '<(resource_packaged_apk_path)', 761 ], 762 'action': [ 763 'python', '<(DEPTH)/build/android/gyp/package_resources.py', 764 '--android-sdk', '<(android_sdk)', 765 '--android-sdk-tools', '<(android_sdk_tools)', 766 767 '--configuration-name', '<(CONFIGURATION_NAME)', 768 769 '--android-manifest', '<(android_manifest_path)', 770 '--version-code', '<(app_manifest_version_code)', 771 '--version-name', '<(app_manifest_version_name)', 772 773 '--asset-dir', '<(asset_location)', 774 '--resource-zips', '>(package_resource_zip_input_paths)', 775 776 '--no-compress', '<(extensions_to_not_compress)', 777 778 '--apk-path', '<(resource_packaged_apk_path)', 779 ], 780 }, 781 { 782 'action_name': 'ant_package_<(_target_name)', 783 'message': 'Packaging <(_target_name)', 784 'variables': { 785 # Write the inputs list to a file, so that its mtime is updated when 786 # the list of inputs changes. 787 'inputs_list_file': '>|(apk_package.<(_target_name).gypcmd >@(package_input_paths))' 788 }, 789 'inputs': [ 790 '<(DEPTH)/build/android/ant/apk-package.xml', 791 '<(DEPTH)/build/android/gyp/util/build_utils.py', 792 '<(DEPTH)/build/android/gyp/ant.py', 793 '<(dex_path)', 794 '<(codegen_stamp)', 795 '<(obfuscate_stamp)', 796 '<(resource_packaged_apk_path)', 797 '>@(package_input_paths)', 798 '>(inputs_list_file)', 799 ], 800 'outputs': [ 801 '<(unsigned_apk_path)', 802 ], 803 'action': [ 804 'python', '<(DEPTH)/build/android/gyp/ant.py', 805 '-quiet', 806 '-DANDROID_SDK_ROOT=<(android_sdk_root)', 807 '-DANDROID_SDK_TOOLS=<(android_sdk_tools)', 808 '-DRESOURCE_PACKAGED_APK_NAME=<(resource_packaged_apk_name)', 809 '-DAPK_NAME=<(apk_name)', 810 '-DCONFIGURATION_NAME=<(CONFIGURATION_NAME)', 811 '-DNATIVE_LIBS_DIR=<(apk_package_native_libs_dir)', 812 '-DOUT_DIR=<(intermediate_dir)', 813 '-DUNSIGNED_APK_PATH=<(unsigned_apk_path)', 814 '-DEMMA_INSTRUMENT=<(emma_instrument)', 815 '-DEMMA_DEVICE_JAR=<(emma_device_jar)', 816 817 '-Dbasedir=.', 818 '-buildfile', 819 '<(DEPTH)/build/android/ant/apk-package.xml', 820 ] 821 }, 822 ], 823} 824