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"
606487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet        "        [--debug-mode] [--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"
65588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus 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"
68e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "        [-S resource-sources [-S resource-sources ...]] \\\n"
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "        [-F apk-file] [-J R-file-dir] \\\n"
7090964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer        "        [--product product1,product2,...] \\\n"
71e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "        [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n"
72f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet        "        [raw-files-dir [raw-files-dir] ...] \\\n"
73f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet        "        [--output-text-symbols DIR]\n"
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "\n"
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Package the android resources.  It will read assets and resources that are\n"
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   supplied with the -M -A -S or raw-files-dir arguments.  The -J -P -F and -R\n"
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   options control which files are output.\n\n"
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        , gProgName);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " %s r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]\n"
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Delete specified files from Zip-compatible archive.\n\n",
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gProgName);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " %s a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]\n"
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Add specified files to Zip-compatible archive.\n\n", gProgName);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
878a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin        " %s c[runch] [-v] -S resource-sources ... -C output-folder ...\n"
888a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin        "   Do PNG preprocessing and store the results in output folder.\n\n", gProgName);
898a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    fprintf(stderr,
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " %s v[ersion]\n"
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Print program version.\n\n", gProgName);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " Modifiers:\n"
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -a  print Android-specific data (resources, manifest) when listing\n"
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -c  specify which configurations to include.  The default is all\n"
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       configurations.  The value of the parameter should be a comma\n"
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       separated list of configuration values.  Locales should be specified\n"
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       as either a language or language-region pair.  Some examples:\n"
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            en\n"
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,en\n"
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,land,en_US\n"
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       If you put the special locale, zz_ZZ on the list, it will perform\n"
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       pseudolocalization on the default locale, modifying all of the\n"
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       strings so you can look for strings that missed the\n"
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       internationalization process.  For example:\n"
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,land,zz_ZZ\n"
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -d  one or more device assets to include, separated by commas\n"
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -f  force overwrite of existing files\n"
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -g  specify a pixel tolerance to force images to grayscale, default 0\n"
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -j  specify a jar or zip file containing classes to include\n"
111dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker        "   -k  junk path of file(s) added\n"
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -m  make package directories under location specified by -J\n"
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -p  pseudolocalize the default configuration\n"
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -u  update existing packages (add new, replace older, remove deleted files)\n"
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -v  verbose output\n"
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -x  create extending (non-application) resource IDs\n"
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -z  require localization of resource attributes marked with\n"
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       localization=\"suggested\"\n"
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -A  additional directory in which to find raw asset files\n"
1221553c82e084ac5763fb393857224145506771b99Joe Onorato        "   -G  A file to output proguard options into.\n"
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -F  specify the apk file to output\n"
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -I  add an existing package to base include set\n"
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -J  specify where to output R.java resource constant definitions\n"
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -M  specify full path to AndroidManifest.xml to include in zip\n"
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -P  specify where to output public resource definitions\n"
12863459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "   -S  directory in which to find resources.  Multiple directories will be scanned\n"
12963459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "       and the first match found (left to right) will take precedence.\n"
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -0  specifies an additional extension for which such files will not\n"
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       be stored compressed in the .apk.  An empty string means to not\n"
13262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       compress any files at all.\n"
1336487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet        "   --debug-mode\n"
1346487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet        "       inserts android:debuggable=\"true\" in to the application node of the\n"
1356487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet        "       manifest, making the application debuggable even on production devices.\n"
13662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --min-sdk-version\n"
137745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       inserts android:minSdkVersion in to manifest.  If the version is 7 or\n"
138745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       higher, the default encoding for resources will be in UTF-8.\n"
13962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --target-sdk-version\n"
14062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       inserts android:targetSdkVersion in to manifest.\n"
141588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick        "   --max-res-version\n"
142588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick        "       ignores versioned resource directories above the given value.\n"
143e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn        "   --values\n"
144e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn        "       when used with \"dump resources\" also includes resource values.\n"
14562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --version-code\n"
14662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       inserts android:versionCode in to manifest.\n"
14762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --version-name\n"
14863459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "       inserts android:versionName in to manifest.\n"
14963459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "   --custom-package\n"
150745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       generates R.java into a different package.\n"
151ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin        "   --extra-packages\n"
1529bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin        "       generate R.java for libraries. Separate libraries with ':'.\n"
1539bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin        "   --generate-dependencies\n"
15403589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin        "       generate dependency files in the same directories for R.java and resource package\n"
15599080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet        "   --auto-add-overlay\n"
15699080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet        "       Automatically add resources that are only in overlays.\n"
157e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "   --preferred-configurations\n"
158e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "       Like the -c option for filtering out unneeded configurations, but\n"
159e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "       only expresses a preference.  If there is no resource available with\n"
160e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "       the preferred configuration then it will not be stripped.\n"
161ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "   --rename-manifest-package\n"
162ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       Rewrite the manifest so that its package name is the package name\n"
163ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       given here.  Relative class names (for example .Foo) will be\n"
164ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       changed to absolute names with the old package so that the code\n"
165ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       does not need to change.\n"
166ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "   --rename-instrumentation-target-package\n"
167ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       Rewrite the manifest so that all of its instrumentation\n"
168ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       components target the given package.  Useful when used in\n"
169ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       conjunction with --rename-manifest-package to fix tests against\n"
170ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       a package that has been renamed.\n"
17190964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer        "   --product\n"
17290964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer        "       Specifies which variant to choose for strings that have\n"
17390964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer        "       product variants\n"
174745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "   --utf16\n"
175745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       changes default encoding for resources to UTF-16.  Only useful when API\n"
176d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet        "       level is set to 7 or higher where the default encoding is UTF-8.\n"
177d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet        "   --non-constant-id\n"
178d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet        "       Make the resources ID non constant. This is required to make an R java class\n"
179d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet        "       that does not contain the final value but is used to make reusable compiled\n"
18090897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        "       libraries that need to access resources.\n"
1817714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "   --error-on-failed-insert\n"
1827714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "       Forces aapt to return an error if it fails to insert values into the manifest\n"
1837714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "       with --debug-mode, --min-sdk-version, --target-sdk-version --version-code\n"
1847714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "       and --version-name.\n"
1857714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "       Insertion typically fails if the manifest already defines the attribute.\n"
186f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet        "   --output-text-symbols\n"
187f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet        "       Generates a text file containing the resource symbols of the R class in the\n"
188f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet        "       specified folder.\n"
18990897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        "   --ignore-assets\n"
19090897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        "       Assets to be ignored. Default pattern is:\n"
19190897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        "       %s\n",
19290897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        gDefaultIgnoreAssets);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dispatch the command.
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint handleCommand(Bundle* bundle)
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("--- command %d (verbose=%d force=%d):\n",
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    bundle->getCommand(), bundle->getVerbose(), bundle->getForce());
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //for (int i = 0; i < bundle->getFileSpecCount(); i++)
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    printf("  %d: '%s'\n", i, bundle->getFileSpecEntry(i));
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (bundle->getCommand()) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandVersion:   return doVersion(bundle);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandList:      return doList(bundle);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandDump:      return doDump(bundle);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandAdd:       return doAdd(bundle);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandRemove:    return doRemove(bundle);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandPackage:   return doPackage(bundle);
2128a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    case kCommandCrunch:    return doCrunch(bundle);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "%s: requested command not yet supported\n", gProgName);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parse args.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint main(int argc, char* const argv[])
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char *prog = argv[0];
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Bundle bundle;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool wantUsage = false;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result = 1;    // pessimistically assume an error.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int tolerance = 0;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* default to compression */
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bundle.setCompressionMethod(ZipEntry::kCompressDeflated);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (argc < 2) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wantUsage = true;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (argv[1][0] == 'v')
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandVersion);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'd')
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandDump);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'l')
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandList);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'a')
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandAdd);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'r')
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandRemove);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'p')
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandPackage);
2508a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    else if (argv[1][0] == 'c')
2518a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin        bundle.setCommand(kCommandCrunch);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "ERROR: Unknown command '%s'\n", argv[1]);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wantUsage = true;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    argc -= 2;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    argv += 2;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pull out flags.  We support "-fv" and "-f -v".
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (argc && argv[0][0] == '-') {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* flag(s) found */
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* cp = argv[0] +1;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (*cp != '\0') {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (*cp) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'v':
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setVerbose(true);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'a':
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAndroidList(true);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'c':
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-c' option\n");
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addConfigurations(argv[0]);
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'f':
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setForce(true);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'g':
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-g' option\n");
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tolerance = atoi(argv[0]);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setGrayscaleTolerance(tolerance);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog, tolerance);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
300dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker            case 'k':
301dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker                bundle.setJunkPath(true);
302dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker                break;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'm':
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setMakePackageDirs(true);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'p':
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setPseudolocalize(true);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'u':
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setUpdate(true);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'x':
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setExtending(true);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'z':
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setRequireLocalization(true);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'j':
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-j' option\n");
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addJarFile(argv[0]);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'A':
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-A' option\n");
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAssetSourceDir(argv[0]);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3421553c82e084ac5763fb393857224145506771b99Joe Onorato            case 'G':
3431553c82e084ac5763fb393857224145506771b99Joe Onorato                argc--;
3441553c82e084ac5763fb393857224145506771b99Joe Onorato                argv++;
3451553c82e084ac5763fb393857224145506771b99Joe Onorato                if (!argc) {
3461553c82e084ac5763fb393857224145506771b99Joe Onorato                    fprintf(stderr, "ERROR: No argument supplied for '-G' option\n");
3471553c82e084ac5763fb393857224145506771b99Joe Onorato                    wantUsage = true;
3481553c82e084ac5763fb393857224145506771b99Joe Onorato                    goto bail;
3491553c82e084ac5763fb393857224145506771b99Joe Onorato                }
3501553c82e084ac5763fb393857224145506771b99Joe Onorato                convertPath(argv[0]);
3511553c82e084ac5763fb393857224145506771b99Joe Onorato                bundle.setProguardFile(argv[0]);
3521553c82e084ac5763fb393857224145506771b99Joe Onorato                break;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'I':
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-I' option\n");
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addPackageInclude(argv[0]);
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'F':
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-F' option\n");
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setOutputAPKFile(argv[0]);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'J':
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-J' option\n");
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setRClassDir(argv[0]);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'M':
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-M' option\n");
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAndroidManifestFile(argv[0]);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'P':
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-P' option\n");
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setPublicOutputFile(argv[0]);
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'S':
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-S' option\n");
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addResourceSourceDir(argv[0]);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4198a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin            case 'C':
4208a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                argc--;
4218a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                argv++;
4228a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                if (!argc) {
4238a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                    fprintf(stderr, "ERROR: No argument supplied for '-C' option\n");
4248a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                    wantUsage = true;
4258a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                    goto bail;
4268a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                }
4278a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                convertPath(argv[0]);
4288a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                bundle.setCrunchedOutputDir(argv[0]);
4298a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                break;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '0':
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-e' option\n");
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (argv[0][0] != 0) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bundle.addNoCompressExtension(argv[0]);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bundle.setCompressionMethod(ZipEntry::kCompressStored);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
44462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn            case '-':
4456487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet                if (strcmp(cp, "-debug-mode") == 0) {
4466487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet                    bundle.setDebugMode(true);
4476487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet                } else if (strcmp(cp, "-min-sdk-version") == 0) {
44862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
44962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
45062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
45162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--min-sdk-version' option\n");
45262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
45362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
45462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
45562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setMinSdkVersion(argv[0]);
45662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-target-sdk-version") == 0) {
45762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
45862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
45962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
46062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--target-sdk-version' option\n");
46162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
46262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
46362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
46462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setTargetSdkVersion(argv[0]);
46562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-max-sdk-version") == 0) {
46662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
46762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
46862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
46962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--max-sdk-version' option\n");
47062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
47162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
47262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
47362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setMaxSdkVersion(argv[0]);
474588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                } else if (strcmp(cp, "-max-res-version") == 0) {
475588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    argc--;
476588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    argv++;
477588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    if (!argc) {
478588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                        fprintf(stderr, "ERROR: No argument supplied for '--max-res-version' option\n");
479588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                        wantUsage = true;
480588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                        goto bail;
481588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    }
482588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    bundle.setMaxResVersion(argv[0]);
48362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-version-code") == 0) {
48462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
48562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
48662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
48762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--version-code' option\n");
48862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
48962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
49062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
49162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setVersionCode(argv[0]);
49262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-version-name") == 0) {
49362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
49462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
49562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
49662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--version-name' option\n");
49762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
49862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
49962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
50062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setVersionName(argv[0]);
501e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn                } else if (strcmp(cp, "-values") == 0) {
502e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn                    bundle.setValues(true);
50363459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                } else if (strcmp(cp, "-custom-package") == 0) {
50463459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    argc--;
50563459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    argv++;
50663459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    if (!argc) {
50763459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        fprintf(stderr, "ERROR: No argument supplied for '--custom-package' option\n");
50863459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        wantUsage = true;
50963459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        goto bail;
51063459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    }
51163459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    bundle.setCustomPackage(argv[0]);
512ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                } else if (strcmp(cp, "-extra-packages") == 0) {
513ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    argc--;
514ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    argv++;
515ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    if (!argc) {
516ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                        fprintf(stderr, "ERROR: No argument supplied for '--extra-packages' option\n");
517ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                        wantUsage = true;
518ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                        goto bail;
519ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    }
520ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    bundle.setExtraPackages(argv[0]);
5219bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                } else if (strcmp(cp, "-generate-dependencies") == 0) {
5229bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                    bundle.setGenDependencies(true);
523745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root                } else if (strcmp(cp, "-utf16") == 0) {
5241741cd4904414b5b4e768953a8f1abb3f0ef0a0aKenny Root                    bundle.setWantUTF16(true);
525e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                } else if (strcmp(cp, "-preferred-configurations") == 0) {
526e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    argc--;
527e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    argv++;
528e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (!argc) {
529e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--preferred-configurations' option\n");
530e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        wantUsage = true;
531e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        goto bail;
532e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
533e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    bundle.addPreferredConfigurations(argv[0]);
5342fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                } else if (strcmp(cp, "-rename-manifest-package") == 0) {
5352fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    argc--;
5362fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    argv++;
5372fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    if (!argc) {
5382fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        fprintf(stderr, "ERROR: No argument supplied for '--rename-manifest-package' option\n");
5392fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        wantUsage = true;
5402fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        goto bail;
5412fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    }
5422fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    bundle.setManifestPackageNameOverride(argv[0]);
543ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                } else if (strcmp(cp, "-rename-instrumentation-target-package") == 0) {
544ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    argc--;
545ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    argv++;
546ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    if (!argc) {
547ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--rename-instrumentation-target-package' option\n");
548ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        wantUsage = true;
549ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        goto bail;
550ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    }
551ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    bundle.setInstrumentationPackageNameOverride(argv[0]);
55299080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                } else if (strcmp(cp, "-auto-add-overlay") == 0) {
55399080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                    bundle.setAutoAddOverlay(true);
5547714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet                } else if (strcmp(cp, "-error-on-failed-insert") == 0) {
5557714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet                    bundle.setErrorOnFailedInsert(true);
556f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                } else if (strcmp(cp, "-output-text-symbols") == 0) {
557f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    argc--;
558f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    argv++;
559f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    if (!argc) {
560f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                        fprintf(stderr, "ERROR: No argument supplied for '-output-text-symbols' option\n");
561f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                        wantUsage = true;
562f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                        goto bail;
563f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    }
564f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    bundle.setOutputTextSymbols(argv[0]);
56590964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                } else if (strcmp(cp, "-product") == 0) {
56690964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    argc--;
56790964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    argv++;
56890964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    if (!argc) {
56990964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                        fprintf(stderr, "ERROR: No argument supplied for '--product' option\n");
57090964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                        wantUsage = true;
57190964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                        goto bail;
57290964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    }
57390964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    bundle.setProduct(argv[0]);
574d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet                } else if (strcmp(cp, "-non-constant-id") == 0) {
575d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet                    bundle.setNonConstantId(true);
5768a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                } else if (strcmp(cp, "-no-crunch") == 0) {
5778a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                    bundle.setUseCrunchCache(true);
57890897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                } else if (strcmp(cp, "-ignore-assets") == 0) {
57990897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    argc--;
58090897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    argv++;
58190897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    if (!argc) {
58290897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                        fprintf(stderr, "ERROR: No argument supplied for '--ignore-assets' option\n");
58390897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                        wantUsage = true;
58490897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                        goto bail;
58590897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    }
58690897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    gUserIgnoreAssets = argv[0];
58790897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                } else {
58862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp);
58962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    wantUsage = true;
59062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    goto bail;
59162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                }
59262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                cp += strlen(cp) - 1;
59362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                break;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: Unknown flag '-%c'\n", *cp);
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wantUsage = true;
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                goto bail;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cp++;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        argc--;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        argv++;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We're past the flags.  The rest all goes straight in.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bundle.setFileSpec(argv, argc);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = handleCommand(&bundle);
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (wantUsage) {
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        usage();
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result = 2;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("--> returning %d\n", result);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
622