19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Copyright 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Android Asset Packaging Tool main entry point. 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Main.h" 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Bundle.h" 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 93b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Log.h> 103b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/threads.h> 113b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/List.h> 123b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Errors.h> 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <getopt.h> 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h> 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* gProgName = "aapt"; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When running under Cygwin on Windows, this will convert slash-based 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paths into back-slash-based ones. Otherwise the ApptAssets file comparisons 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fail later as they use back-slash separators under Windows. 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This operates in-place on the path string. 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid convertPath(char *path) { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path != NULL && OS_PATH_SEPARATOR != '/') { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; *path; path++) { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*path == '/') { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *path = OS_PATH_SEPARATOR; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Print usage info. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid usage(void) 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "Android Asset Packaging Tool\n\n"); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "Usage:\n"); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " %s l[ist] [-v] [-a] file.{zip,jar,apk}\n" 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " List contents of Zip-compatible archive.\n\n", gProgName); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, 50e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn " %s d[ump] [--values] WHAT file.{apk} [asset [asset ...]]\n" 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " badging Print the label and icon for the app declared in APK.\n" 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " permissions Print the permissions from the APK.\n" 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " resources Print the resource table from the APK.\n" 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " configurations Print the configurations in the APK.\n" 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " xmltree Print the compiled xmls in the given assets.\n" 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " xmlstrings Print the strings of the given compiled xml assets.\n\n", gProgName); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " %s p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n" 5962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \\\n" 6062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n" 61ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " [--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \\\n" 62ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " [--rename-manifest-package PACKAGE] \\\n" 63ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " [--rename-instrumentation-target-package PACKAGE] \\\n" 64ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " [--utf16] [--auto-add-overlay] \\\n" 65c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick " [--max-res-version VAL] \\\n" 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " [-I base-package [-I base-package ...]] \\\n" 671553c82e084ac5763fb393857224145506771b99Joe Onorato " [-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] \\\n" 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " [-S resource-sources [-S resource-sources ...]] " 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " [-F apk-file] [-J R-file-dir] \\\n" 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " [raw-files-dir [raw-files-dir] ...]\n" 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "\n" 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " Package the android resources. It will read assets and resources that are\n" 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R\n" 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " options control which files are output.\n\n" 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , gProgName); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " %s r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]\n" 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " Delete specified files from Zip-compatible archive.\n\n", 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gProgName); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " %s a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]\n" 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " Add specified files to Zip-compatible archive.\n\n", gProgName); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " %s v[ersion]\n" 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " Print program version.\n\n", gProgName); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " Modifiers:\n" 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -a print Android-specific data (resources, manifest) when listing\n" 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -c specify which configurations to include. The default is all\n" 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " configurations. The value of the parameter should be a comma\n" 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " separated list of configuration values. Locales should be specified\n" 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " as either a language or language-region pair. Some examples:\n" 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " en\n" 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " port,en\n" 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " port,land,en_US\n" 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " If you put the special locale, zz_ZZ on the list, it will perform\n" 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " pseudolocalization on the default locale, modifying all of the\n" 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " strings so you can look for strings that missed the\n" 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " internationalization process. For example:\n" 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " port,land,zz_ZZ\n" 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -d one or more device assets to include, separated by commas\n" 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -f force overwrite of existing files\n" 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -g specify a pixel tolerance to force images to grayscale, default 0\n" 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -j specify a jar or zip file containing classes to include\n" 105dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker " -k junk path of file(s) added\n" 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -m make package directories under location specified by -J\n" 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -p pseudolocalize the default configuration\n" 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -u update existing packages (add new, replace older, remove deleted files)\n" 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -v verbose output\n" 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -x create extending (non-application) resource IDs\n" 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -z require localization of resource attributes marked with\n" 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " localization=\"suggested\"\n" 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -A additional directory in which to find raw asset files\n" 1161553c82e084ac5763fb393857224145506771b99Joe Onorato " -G A file to output proguard options into.\n" 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -F specify the apk file to output\n" 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -I add an existing package to base include set\n" 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -J specify where to output R.java resource constant definitions\n" 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -M specify full path to AndroidManifest.xml to include in zip\n" 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -P specify where to output public resource definitions\n" 12263459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet " -S directory in which to find resources. Multiple directories will be scanned\n" 12363459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet " and the first match found (left to right) will take precedence.\n" 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " -0 specifies an additional extension for which such files will not\n" 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " be stored compressed in the .apk. An empty string means to not\n" 12662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " compress any files at all.\n" 12762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " --min-sdk-version\n" 128745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root " inserts android:minSdkVersion in to manifest. If the version is 7 or\n" 129745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root " higher, the default encoding for resources will be in UTF-8.\n" 13062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " --target-sdk-version\n" 13162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " inserts android:targetSdkVersion in to manifest.\n" 132c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick " --max-res-version\n" 133c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick " ignores versioned resource directories above the given value.\n" 134e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn " --values\n" 135e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn " when used with \"dump resources\" also includes resource values.\n" 13662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " --version-code\n" 13762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " inserts android:versionCode in to manifest.\n" 13862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn " --version-name\n" 13963459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet " inserts android:versionName in to manifest.\n" 14063459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet " --custom-package\n" 141745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root " generates R.java into a different package.\n" 14299080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet " --auto-add-overlay\n" 14399080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet " Automatically add resources that are only in overlays.\n" 144ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " --rename-manifest-package\n" 145ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " Rewrite the manifest so that its package name is the package name\n" 146ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " given here. Relative class names (for example .Foo) will be\n" 147ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " changed to absolute names with the old package so that the code\n" 148ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " does not need to change.\n" 149ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " --rename-instrumentation-target-package\n" 150ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " Rewrite the manifest so that all of its instrumentation\n" 151ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " components target the given package. Useful when used in\n" 152ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " conjunction with --rename-manifest-package to fix tests against\n" 153ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn " a package that has been renamed.\n" 154745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root " --utf16\n" 155745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root " changes default encoding for resources to UTF-16. Only useful when API\n" 156745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root " level is set to 7 or higher where the default encoding is UTF-8.\n"); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dispatch the command. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint handleCommand(Bundle* bundle) 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("--- command %d (verbose=%d force=%d):\n", 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bundle->getCommand(), bundle->getVerbose(), bundle->getForce()); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //for (int i = 0; i < bundle->getFileSpecCount(); i++) 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // printf(" %d: '%s'\n", i, bundle->getFileSpecEntry(i)); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (bundle->getCommand()) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case kCommandVersion: return doVersion(bundle); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case kCommandList: return doList(bundle); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case kCommandDump: return doDump(bundle); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case kCommandAdd: return doAdd(bundle); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case kCommandRemove: return doRemove(bundle); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case kCommandPackage: return doPackage(bundle); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s: requested command not yet supported\n", gProgName); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parse args. 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint main(int argc, char* const argv[]) 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char *prog = argv[0]; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle bundle; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool wantUsage = false; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = 1; // pessimistically assume an error. 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tolerance = 0; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* default to compression */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setCompressionMethod(ZipEntry::kCompressDeflated); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (argc < 2) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (argv[1][0] == 'v') 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setCommand(kCommandVersion); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (argv[1][0] == 'd') 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setCommand(kCommandDump); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (argv[1][0] == 'l') 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setCommand(kCommandList); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (argv[1][0] == 'a') 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setCommand(kCommandAdd); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (argv[1][0] == 'r') 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setCommand(kCommandRemove); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (argv[1][0] == 'p') 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setCommand(kCommandPackage); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: Unknown command '%s'\n", argv[1]); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc -= 2; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv += 2; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pull out flags. We support "-fv" and "-f -v". 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (argc && argv[0][0] == '-') { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* flag(s) found */ 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* cp = argv[0] +1; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*cp != '\0') { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (*cp) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'v': 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setVerbose(true); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'a': 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setAndroidList(true); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'c': 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-c' option\n"); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.addConfigurations(argv[0]); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'f': 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setForce(true); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'g': 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-g' option\n"); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tolerance = atoi(argv[0]); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setGrayscaleTolerance(tolerance); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog, tolerance); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 261dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker case 'k': 262dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker bundle.setJunkPath(true); 263dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker break; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'm': 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setMakePackageDirs(true); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'p': 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setPseudolocalize(true); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'u': 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setUpdate(true); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'x': 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setExtending(true); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'z': 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setRequireLocalization(true); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'j': 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-j' option\n"); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertPath(argv[0]); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.addJarFile(argv[0]); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'A': 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-A' option\n"); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertPath(argv[0]); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setAssetSourceDir(argv[0]); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3031553c82e084ac5763fb393857224145506771b99Joe Onorato case 'G': 3041553c82e084ac5763fb393857224145506771b99Joe Onorato argc--; 3051553c82e084ac5763fb393857224145506771b99Joe Onorato argv++; 3061553c82e084ac5763fb393857224145506771b99Joe Onorato if (!argc) { 3071553c82e084ac5763fb393857224145506771b99Joe Onorato fprintf(stderr, "ERROR: No argument supplied for '-G' option\n"); 3081553c82e084ac5763fb393857224145506771b99Joe Onorato wantUsage = true; 3091553c82e084ac5763fb393857224145506771b99Joe Onorato goto bail; 3101553c82e084ac5763fb393857224145506771b99Joe Onorato } 3111553c82e084ac5763fb393857224145506771b99Joe Onorato convertPath(argv[0]); 3121553c82e084ac5763fb393857224145506771b99Joe Onorato bundle.setProguardFile(argv[0]); 3131553c82e084ac5763fb393857224145506771b99Joe Onorato break; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'I': 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-I' option\n"); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertPath(argv[0]); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.addPackageInclude(argv[0]); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'F': 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-F' option\n"); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertPath(argv[0]); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setOutputAPKFile(argv[0]); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'J': 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-J' option\n"); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertPath(argv[0]); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setRClassDir(argv[0]); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'M': 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-M' option\n"); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertPath(argv[0]); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setAndroidManifestFile(argv[0]); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'P': 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-P' option\n"); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertPath(argv[0]); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setPublicOutputFile(argv[0]); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 'S': 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-S' option\n"); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertPath(argv[0]); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.addResourceSourceDir(argv[0]); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case '0': 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!argc) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: No argument supplied for '-e' option\n"); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (argv[0][0] != 0) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.addNoCompressExtension(argv[0]); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setCompressionMethod(ZipEntry::kCompressStored); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 39462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn case '-': 39562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn if (strcmp(cp, "-min-sdk-version") == 0) { 39662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argc--; 39762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argv++; 39862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn if (!argc) { 39962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn fprintf(stderr, "ERROR: No argument supplied for '--min-sdk-version' option\n"); 40062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn wantUsage = true; 40162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn goto bail; 40262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } 40362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn bundle.setMinSdkVersion(argv[0]); 40462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } else if (strcmp(cp, "-target-sdk-version") == 0) { 40562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argc--; 40662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argv++; 40762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn if (!argc) { 40862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn fprintf(stderr, "ERROR: No argument supplied for '--target-sdk-version' option\n"); 40962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn wantUsage = true; 41062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn goto bail; 41162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } 41262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn bundle.setTargetSdkVersion(argv[0]); 41362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } else if (strcmp(cp, "-max-sdk-version") == 0) { 41462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argc--; 41562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argv++; 41662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn if (!argc) { 41762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn fprintf(stderr, "ERROR: No argument supplied for '--max-sdk-version' option\n"); 41862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn wantUsage = true; 41962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn goto bail; 42062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } 42162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn bundle.setMaxSdkVersion(argv[0]); 422c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick } else if (strcmp(cp, "-max-res-version") == 0) { 423c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick argc--; 424c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick argv++; 425c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick if (!argc) { 426c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick fprintf(stderr, "ERROR: No argument supplied for '--max-res-version' option\n"); 427c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick wantUsage = true; 428c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick goto bail; 429c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick } 430c08d62e54b72e2dfaf2d9cde1683ebf830731fccFicus Kirkpatrick bundle.setMaxResVersion(argv[0]); 43162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } else if (strcmp(cp, "-version-code") == 0) { 43262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argc--; 43362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argv++; 43462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn if (!argc) { 43562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn fprintf(stderr, "ERROR: No argument supplied for '--version-code' option\n"); 43662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn wantUsage = true; 43762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn goto bail; 43862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } 43962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn bundle.setVersionCode(argv[0]); 44062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } else if (strcmp(cp, "-version-name") == 0) { 44162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argc--; 44262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn argv++; 44362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn if (!argc) { 44462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn fprintf(stderr, "ERROR: No argument supplied for '--version-name' option\n"); 44562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn wantUsage = true; 44662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn goto bail; 44762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } 44862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn bundle.setVersionName(argv[0]); 449e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn } else if (strcmp(cp, "-values") == 0) { 450e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn bundle.setValues(true); 45163459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet } else if (strcmp(cp, "-custom-package") == 0) { 45263459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet argc--; 45363459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet argv++; 45463459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet if (!argc) { 45563459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet fprintf(stderr, "ERROR: No argument supplied for '--custom-package' option\n"); 45663459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet wantUsage = true; 45763459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet goto bail; 45863459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet } 45963459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet bundle.setCustomPackage(argv[0]); 460745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root } else if (strcmp(cp, "-utf16") == 0) { 4611741cd4904414b5b4e768953a8f1abb3f0ef0a0aKenny Root bundle.setWantUTF16(true); 4622fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton } else if (strcmp(cp, "-rename-manifest-package") == 0) { 4632fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton argc--; 4642fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton argv++; 4652fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton if (!argc) { 4662fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton fprintf(stderr, "ERROR: No argument supplied for '--rename-manifest-package' option\n"); 4672fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton wantUsage = true; 4682fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton goto bail; 4692fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton } 4702fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton bundle.setManifestPackageNameOverride(argv[0]); 471ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn } else if (strcmp(cp, "-rename-instrumentation-target-package") == 0) { 472ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn argc--; 473ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn argv++; 474ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn if (!argc) { 475ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn fprintf(stderr, "ERROR: No argument supplied for '--rename-instrumentation-target-package' option\n"); 476ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn wantUsage = true; 477ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn goto bail; 478ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn } 479ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn bundle.setInstrumentationPackageNameOverride(argv[0]); 48099080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet } else if (strcmp(cp, "-auto-add-overlay") == 0) { 48199080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet bundle.setAutoAddOverlay(true); 48262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } else { 48362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp); 48462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn wantUsage = true; 48562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn goto bail; 48662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn } 48762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn cp += strlen(cp) - 1; 48862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn break; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: Unknown flag '-%c'\n", *cp); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wantUsage = true; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cp++; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argc--; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project argv++; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We're past the flags. The rest all goes straight in. 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setFileSpec(argv, argc); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = handleCommand(&bundle); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wantUsage) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usage(); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = 2; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("--> returning %d\n", result); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 517