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"
8822d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet        "   Do PNG preprocessing on one or several resource folders\n"
8922d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet        "   and store the results in the output folder.\n\n", gProgName);
9022d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    fprintf(stderr,
9122d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet        " %s s[ingleCrunch] [-v] -i input-file -o outputfile\n"
9222d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet        "   Do PNG preprocessing on a single file.\n\n", gProgName);
938a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    fprintf(stderr,
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " %s v[ersion]\n"
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Print program version.\n\n", gProgName);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " Modifiers:\n"
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -a  print Android-specific data (resources, manifest) when listing\n"
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -c  specify which configurations to include.  The default is all\n"
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       configurations.  The value of the parameter should be a comma\n"
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       separated list of configuration values.  Locales should be specified\n"
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       as either a language or language-region pair.  Some examples:\n"
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            en\n"
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,en\n"
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,land,en_US\n"
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       If you put the special locale, zz_ZZ on the list, it will perform\n"
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       pseudolocalization on the default locale, modifying all of the\n"
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       strings so you can look for strings that missed the\n"
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       internationalization process.  For example:\n"
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,land,zz_ZZ\n"
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -d  one or more device assets to include, separated by commas\n"
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -f  force overwrite of existing files\n"
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -g  specify a pixel tolerance to force images to grayscale, default 0\n"
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -j  specify a jar or zip file containing classes to include\n"
115dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker        "   -k  junk path of file(s) added\n"
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -m  make package directories under location specified by -J\n"
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -p  pseudolocalize the default configuration\n"
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -u  update existing packages (add new, replace older, remove deleted files)\n"
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -v  verbose output\n"
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -x  create extending (non-application) resource IDs\n"
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -z  require localization of resource attributes marked with\n"
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       localization=\"suggested\"\n"
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -A  additional directory in which to find raw asset files\n"
1261553c82e084ac5763fb393857224145506771b99Joe Onorato        "   -G  A file to output proguard options into.\n"
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -F  specify the apk file to output\n"
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -I  add an existing package to base include set\n"
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -J  specify where to output R.java resource constant definitions\n"
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -M  specify full path to AndroidManifest.xml to include in zip\n"
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -P  specify where to output public resource definitions\n"
13263459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "   -S  directory in which to find resources.  Multiple directories will be scanned\n"
13363459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "       and the first match found (left to right) will take precedence.\n"
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -0  specifies an additional extension for which such files will not\n"
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       be stored compressed in the .apk.  An empty string means to not\n"
13662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       compress any files at all.\n"
1376487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet        "   --debug-mode\n"
1386487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet        "       inserts android:debuggable=\"true\" in to the application node of the\n"
1396487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet        "       manifest, making the application debuggable even on production devices.\n"
14062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --min-sdk-version\n"
141745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       inserts android:minSdkVersion in to manifest.  If the version is 7 or\n"
142745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       higher, the default encoding for resources will be in UTF-8.\n"
14362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --target-sdk-version\n"
14462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       inserts android:targetSdkVersion in to manifest.\n"
145588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick        "   --max-res-version\n"
146588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick        "       ignores versioned resource directories above the given value.\n"
147e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn        "   --values\n"
148e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn        "       when used with \"dump resources\" also includes resource values.\n"
14962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --version-code\n"
15062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       inserts android:versionCode in to manifest.\n"
15162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --version-name\n"
15263459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "       inserts android:versionName in to manifest.\n"
15363459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "   --custom-package\n"
154745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       generates R.java into a different package.\n"
155ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin        "   --extra-packages\n"
1569bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin        "       generate R.java for libraries. Separate libraries with ':'.\n"
1579bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin        "   --generate-dependencies\n"
15803589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin        "       generate dependency files in the same directories for R.java and resource package\n"
15999080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet        "   --auto-add-overlay\n"
16099080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet        "       Automatically add resources that are only in overlays.\n"
161e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "   --preferred-configurations\n"
162e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "       Like the -c option for filtering out unneeded configurations, but\n"
163e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "       only expresses a preference.  If there is no resource available with\n"
164e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        "       the preferred configuration then it will not be stripped.\n"
165ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "   --rename-manifest-package\n"
166ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       Rewrite the manifest so that its package name is the package name\n"
167ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       given here.  Relative class names (for example .Foo) will be\n"
168ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       changed to absolute names with the old package so that the code\n"
169ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       does not need to change.\n"
170ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "   --rename-instrumentation-target-package\n"
171ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       Rewrite the manifest so that all of its instrumentation\n"
172ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       components target the given package.  Useful when used in\n"
173ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       conjunction with --rename-manifest-package to fix tests against\n"
174ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       a package that has been renamed.\n"
17590964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer        "   --product\n"
17690964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer        "       Specifies which variant to choose for strings that have\n"
17790964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer        "       product variants\n"
178745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "   --utf16\n"
179745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       changes default encoding for resources to UTF-16.  Only useful when API\n"
180d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet        "       level is set to 7 or higher where the default encoding is UTF-8.\n"
181d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet        "   --non-constant-id\n"
182d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet        "       Make the resources ID non constant. This is required to make an R java class\n"
183d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet        "       that does not contain the final value but is used to make reusable compiled\n"
18490897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        "       libraries that need to access resources.\n"
1857714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "   --error-on-failed-insert\n"
1867714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "       Forces aapt to return an error if it fails to insert values into the manifest\n"
1877714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "       with --debug-mode, --min-sdk-version, --target-sdk-version --version-code\n"
1887714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "       and --version-name.\n"
1897714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet        "       Insertion typically fails if the manifest already defines the attribute.\n"
190f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet        "   --output-text-symbols\n"
191f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet        "       Generates a text file containing the resource symbols of the R class in the\n"
192f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet        "       specified folder.\n"
19390897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        "   --ignore-assets\n"
19490897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        "       Assets to be ignored. Default pattern is:\n"
19590897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        "       %s\n",
19690897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll        gDefaultIgnoreAssets);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dispatch the command.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint handleCommand(Bundle* bundle)
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("--- command %d (verbose=%d force=%d):\n",
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    bundle->getCommand(), bundle->getVerbose(), bundle->getForce());
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //for (int i = 0; i < bundle->getFileSpecCount(); i++)
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    printf("  %d: '%s'\n", i, bundle->getFileSpecEntry(i));
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (bundle->getCommand()) {
21022d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    case kCommandVersion:      return doVersion(bundle);
21122d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    case kCommandList:         return doList(bundle);
21222d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    case kCommandDump:         return doDump(bundle);
21322d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    case kCommandAdd:          return doAdd(bundle);
21422d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    case kCommandRemove:       return doRemove(bundle);
21522d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    case kCommandPackage:      return doPackage(bundle);
21622d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    case kCommandCrunch:       return doCrunch(bundle);
21722d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    case kCommandSingleCrunch: return doSingleCrunch(bundle);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "%s: requested command not yet supported\n", gProgName);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parse args.
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint main(int argc, char* const argv[])
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char *prog = argv[0];
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Bundle bundle;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool wantUsage = false;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result = 1;    // pessimistically assume an error.
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int tolerance = 0;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* default to compression */
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bundle.setCompressionMethod(ZipEntry::kCompressDeflated);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (argc < 2) {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wantUsage = true;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (argv[1][0] == 'v')
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandVersion);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'd')
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandDump);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'l')
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandList);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'a')
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandAdd);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'r')
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandRemove);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'p')
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandPackage);
2558a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    else if (argv[1][0] == 'c')
2568a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin        bundle.setCommand(kCommandCrunch);
25722d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet    else if (argv[1][0] == 's')
25822d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet        bundle.setCommand(kCommandSingleCrunch);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "ERROR: Unknown command '%s'\n", argv[1]);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wantUsage = true;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    argc -= 2;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    argv += 2;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pull out flags.  We support "-fv" and "-f -v".
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (argc && argv[0][0] == '-') {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* flag(s) found */
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* cp = argv[0] +1;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (*cp != '\0') {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (*cp) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'v':
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setVerbose(true);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'a':
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAndroidList(true);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'c':
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-c' option\n");
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addConfigurations(argv[0]);
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'f':
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setForce(true);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'g':
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-g' option\n");
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tolerance = atoi(argv[0]);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setGrayscaleTolerance(tolerance);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog, tolerance);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
307dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker            case 'k':
308dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker                bundle.setJunkPath(true);
309dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker                break;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'm':
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setMakePackageDirs(true);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'p':
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setPseudolocalize(true);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'u':
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setUpdate(true);
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'x':
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setExtending(true);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'z':
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setRequireLocalization(true);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'j':
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-j' option\n");
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addJarFile(argv[0]);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'A':
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-A' option\n");
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAssetSourceDir(argv[0]);
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3491553c82e084ac5763fb393857224145506771b99Joe Onorato            case 'G':
3501553c82e084ac5763fb393857224145506771b99Joe Onorato                argc--;
3511553c82e084ac5763fb393857224145506771b99Joe Onorato                argv++;
3521553c82e084ac5763fb393857224145506771b99Joe Onorato                if (!argc) {
3531553c82e084ac5763fb393857224145506771b99Joe Onorato                    fprintf(stderr, "ERROR: No argument supplied for '-G' option\n");
3541553c82e084ac5763fb393857224145506771b99Joe Onorato                    wantUsage = true;
3551553c82e084ac5763fb393857224145506771b99Joe Onorato                    goto bail;
3561553c82e084ac5763fb393857224145506771b99Joe Onorato                }
3571553c82e084ac5763fb393857224145506771b99Joe Onorato                convertPath(argv[0]);
3581553c82e084ac5763fb393857224145506771b99Joe Onorato                bundle.setProguardFile(argv[0]);
3591553c82e084ac5763fb393857224145506771b99Joe Onorato                break;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'I':
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-I' option\n");
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addPackageInclude(argv[0]);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'F':
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-F' option\n");
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setOutputAPKFile(argv[0]);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'J':
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-J' option\n");
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setRClassDir(argv[0]);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'M':
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-M' option\n");
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAndroidManifestFile(argv[0]);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'P':
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-P' option\n");
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setPublicOutputFile(argv[0]);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'S':
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-S' option\n");
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addResourceSourceDir(argv[0]);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4268a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin            case 'C':
4278a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                argc--;
4288a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                argv++;
4298a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                if (!argc) {
4308a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                    fprintf(stderr, "ERROR: No argument supplied for '-C' option\n");
4318a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                    wantUsage = true;
4328a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                    goto bail;
4338a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                }
4348a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                convertPath(argv[0]);
4358a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                bundle.setCrunchedOutputDir(argv[0]);
4368a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                break;
43722d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet            case 'i':
43822d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                argc--;
43922d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                argv++;
44022d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                if (!argc) {
44122d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                    fprintf(stderr, "ERROR: No argument supplied for '-i' option\n");
44222d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                    wantUsage = true;
44322d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                    goto bail;
44422d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                }
44522d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                convertPath(argv[0]);
44622d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                bundle.setSingleCrunchInputFile(argv[0]);
44722d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                break;
44822d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet            case 'o':
44922d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                argc--;
45022d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                argv++;
45122d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                if (!argc) {
45222d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                    fprintf(stderr, "ERROR: No argument supplied for '-o' option\n");
45322d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                    wantUsage = true;
45422d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                    goto bail;
45522d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                }
45622d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                convertPath(argv[0]);
45722d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                bundle.setSingleCrunchOutputFile(argv[0]);
45822d7cf239d8a9b009ea7adf86d8826a8a8116d03Xavier Ducrohet                break;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '0':
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-e' option\n");
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (argv[0][0] != 0) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bundle.addNoCompressExtension(argv[0]);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bundle.setCompressionMethod(ZipEntry::kCompressStored);
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
47362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn            case '-':
4746487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet                if (strcmp(cp, "-debug-mode") == 0) {
4756487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet                    bundle.setDebugMode(true);
4766487b099231b1e5d36ae37a921399b028b3b3ad9Xavier Ducrohet                } else if (strcmp(cp, "-min-sdk-version") == 0) {
47762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
47862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
47962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
48062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--min-sdk-version' option\n");
48162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
48262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
48362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
48462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setMinSdkVersion(argv[0]);
48562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-target-sdk-version") == 0) {
48662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
48762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
48862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
48962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--target-sdk-version' option\n");
49062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
49162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
49262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
49362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setTargetSdkVersion(argv[0]);
49462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-max-sdk-version") == 0) {
49562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
49662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
49762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
49862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--max-sdk-version' option\n");
49962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
50062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
50162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
50262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setMaxSdkVersion(argv[0]);
503588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                } else if (strcmp(cp, "-max-res-version") == 0) {
504588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    argc--;
505588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    argv++;
506588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    if (!argc) {
507588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                        fprintf(stderr, "ERROR: No argument supplied for '--max-res-version' option\n");
508588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                        wantUsage = true;
509588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                        goto bail;
510588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    }
511588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick                    bundle.setMaxResVersion(argv[0]);
51262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-version-code") == 0) {
51362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
51462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
51562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
51662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--version-code' option\n");
51762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
51862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
51962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
52062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setVersionCode(argv[0]);
52162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-version-name") == 0) {
52262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
52362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
52462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
52562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--version-name' option\n");
52662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
52762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
52862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
52962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setVersionName(argv[0]);
530e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn                } else if (strcmp(cp, "-values") == 0) {
531e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn                    bundle.setValues(true);
53263459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                } else if (strcmp(cp, "-custom-package") == 0) {
53363459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    argc--;
53463459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    argv++;
53563459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    if (!argc) {
53663459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        fprintf(stderr, "ERROR: No argument supplied for '--custom-package' option\n");
53763459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        wantUsage = true;
53863459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        goto bail;
53963459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    }
54063459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    bundle.setCustomPackage(argv[0]);
541ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                } else if (strcmp(cp, "-extra-packages") == 0) {
542ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    argc--;
543ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    argv++;
544ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    if (!argc) {
545ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                        fprintf(stderr, "ERROR: No argument supplied for '--extra-packages' option\n");
546ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                        wantUsage = true;
547ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                        goto bail;
548ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    }
549ce89f1531ed8b96b8b790b3f8b18dd4cf483f7f0Josiah Gaskin                    bundle.setExtraPackages(argv[0]);
5509bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                } else if (strcmp(cp, "-generate-dependencies") == 0) {
5519bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                    bundle.setGenDependencies(true);
552745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root                } else if (strcmp(cp, "-utf16") == 0) {
5531741cd4904414b5b4e768953a8f1abb3f0ef0a0aKenny Root                    bundle.setWantUTF16(true);
554e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                } else if (strcmp(cp, "-preferred-configurations") == 0) {
555e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    argc--;
556e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    argv++;
557e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (!argc) {
558e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--preferred-configurations' option\n");
559e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        wantUsage = true;
560e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        goto bail;
561e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
562e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    bundle.addPreferredConfigurations(argv[0]);
5632fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                } else if (strcmp(cp, "-rename-manifest-package") == 0) {
5642fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    argc--;
5652fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    argv++;
5662fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    if (!argc) {
5672fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        fprintf(stderr, "ERROR: No argument supplied for '--rename-manifest-package' option\n");
5682fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        wantUsage = true;
5692fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        goto bail;
5702fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    }
5712fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    bundle.setManifestPackageNameOverride(argv[0]);
572ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                } else if (strcmp(cp, "-rename-instrumentation-target-package") == 0) {
573ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    argc--;
574ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    argv++;
575ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    if (!argc) {
576ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--rename-instrumentation-target-package' option\n");
577ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        wantUsage = true;
578ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        goto bail;
579ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    }
580ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    bundle.setInstrumentationPackageNameOverride(argv[0]);
58199080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                } else if (strcmp(cp, "-auto-add-overlay") == 0) {
58299080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                    bundle.setAutoAddOverlay(true);
5837714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet                } else if (strcmp(cp, "-error-on-failed-insert") == 0) {
5847714a2429b192c88e134ff67b969121bbaeb5457Xavier Ducrohet                    bundle.setErrorOnFailedInsert(true);
585f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                } else if (strcmp(cp, "-output-text-symbols") == 0) {
586f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    argc--;
587f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    argv++;
588f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    if (!argc) {
589f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                        fprintf(stderr, "ERROR: No argument supplied for '-output-text-symbols' option\n");
590f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                        wantUsage = true;
591f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                        goto bail;
592f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    }
593f5de650ff1e161ea135c828e43515895343d2c0fXavier Ducrohet                    bundle.setOutputTextSymbols(argv[0]);
59490964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                } else if (strcmp(cp, "-product") == 0) {
59590964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    argc--;
59690964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    argv++;
59790964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    if (!argc) {
59890964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                        fprintf(stderr, "ERROR: No argument supplied for '--product' option\n");
59990964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                        wantUsage = true;
60090964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                        goto bail;
60190964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    }
60290964040cabfc67f92a7c3322a02401bb6f8ae82Eric Fischer                    bundle.setProduct(argv[0]);
603d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet                } else if (strcmp(cp, "-non-constant-id") == 0) {
604d06c1afbb920111d6bb77381560faa1fac5f2d69Xavier Ducrohet                    bundle.setNonConstantId(true);
6058a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                } else if (strcmp(cp, "-no-crunch") == 0) {
6068a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                    bundle.setUseCrunchCache(true);
60790897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                } else if (strcmp(cp, "-ignore-assets") == 0) {
60890897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    argc--;
60990897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    argv++;
61090897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    if (!argc) {
61190897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                        fprintf(stderr, "ERROR: No argument supplied for '--ignore-assets' option\n");
61290897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                        wantUsage = true;
61390897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                        goto bail;
61490897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    }
61590897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                    gUserIgnoreAssets = argv[0];
61690897ed87bce639bf6bb2ccf15fbabb59b131babRaphael Moll                } else {
61762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp);
61862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    wantUsage = true;
61962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    goto bail;
62062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                }
62162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                cp += strlen(cp) - 1;
62262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                break;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: Unknown flag '-%c'\n", *cp);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wantUsage = true;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                goto bail;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cp++;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        argc--;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        argv++;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We're past the flags.  The rest all goes straight in.
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bundle.setFileSpec(argv, argc);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = handleCommand(&bundle);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (wantUsage) {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        usage();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result = 2;
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("--> returning %d\n", result);
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
651