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