Main.cpp revision ef05e076ced1a32c5c0aaee28403779834adb2ba
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"
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "        [-I base-package [-I base-package ...]] \\\n"
661553c82e084ac5763fb393857224145506771b99Joe Onorato        "        [-A asset-source-dir]  [-G class-list-file] [-P public-definitions-file] \\\n"
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "        [-S resource-sources [-S resource-sources ...]] "
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "        [-F apk-file] [-J R-file-dir] \\\n"
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "        [raw-files-dir [raw-files-dir] ...]\n"
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "\n"
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Package the android resources.  It will read assets and resources that are\n"
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   supplied with the -M -A -S or raw-files-dir arguments.  The -J -P -F and -R\n"
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   options control which files are output.\n\n"
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        , gProgName);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " %s r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]\n"
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Delete specified files from Zip-compatible archive.\n\n",
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gProgName);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " %s a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]\n"
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Add specified files to Zip-compatible archive.\n\n", gProgName);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " %s v[ersion]\n"
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   Print program version.\n\n", gProgName);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        " Modifiers:\n"
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -a  print Android-specific data (resources, manifest) when listing\n"
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -c  specify which configurations to include.  The default is all\n"
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       configurations.  The value of the parameter should be a comma\n"
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       separated list of configuration values.  Locales should be specified\n"
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       as either a language or language-region pair.  Some examples:\n"
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            en\n"
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,en\n"
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,land,en_US\n"
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       If you put the special locale, zz_ZZ on the list, it will perform\n"
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       pseudolocalization on the default locale, modifying all of the\n"
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       strings so you can look for strings that missed the\n"
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       internationalization process.  For example:\n"
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "            port,land,zz_ZZ\n"
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -d  one or more device assets to include, separated by commas\n"
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -f  force overwrite of existing files\n"
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -g  specify a pixel tolerance to force images to grayscale, default 0\n"
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -j  specify a jar or zip file containing classes to include\n"
104dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker        "   -k  junk path of file(s) added\n"
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -m  make package directories under location specified by -J\n"
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -p  pseudolocalize the default configuration\n"
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -u  update existing packages (add new, replace older, remove deleted files)\n"
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -v  verbose output\n"
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -x  create extending (non-application) resource IDs\n"
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -z  require localization of resource attributes marked with\n"
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       localization=\"suggested\"\n"
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -A  additional directory in which to find raw asset files\n"
1151553c82e084ac5763fb393857224145506771b99Joe Onorato        "   -G  A file to output proguard options into.\n"
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -F  specify the apk file to output\n"
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -I  add an existing package to base include set\n"
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -J  specify where to output R.java resource constant definitions\n"
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -M  specify full path to AndroidManifest.xml to include in zip\n"
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -P  specify where to output public resource definitions\n"
12163459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "   -S  directory in which to find resources.  Multiple directories will be scanned\n"
12263459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "       and the first match found (left to right) will take precedence.\n"
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "   -0  specifies an additional extension for which such files will not\n"
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "       be stored compressed in the .apk.  An empty string means to not\n"
12562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       compress any files at all.\n"
12662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --min-sdk-version\n"
127745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       inserts android:minSdkVersion in to manifest.  If the version is 7 or\n"
128745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       higher, the default encoding for resources will be in UTF-8.\n"
12962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --target-sdk-version\n"
13062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       inserts android:targetSdkVersion in to manifest.\n"
131e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn        "   --values\n"
132e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn        "       when used with \"dump resources\" also includes resource values.\n"
13362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --version-code\n"
13462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "       inserts android:versionCode in to manifest.\n"
13562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn        "   --version-name\n"
13663459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "       inserts android:versionName in to manifest.\n"
13763459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet        "   --custom-package\n"
138745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       generates R.java into a different package.\n"
13999080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet        "   --auto-add-overlay\n"
14099080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet        "       Automatically add resources that are only in overlays.\n"
141ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "   --rename-manifest-package\n"
142ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       Rewrite the manifest so that its package name is the package name\n"
143ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       given here.  Relative class names (for example .Foo) will be\n"
144ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       changed to absolute names with the old package so that the code\n"
145ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       does not need to change.\n"
146ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "   --rename-instrumentation-target-package\n"
147ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       Rewrite the manifest so that all of its instrumentation\n"
148ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       components target the given package.  Useful when used in\n"
149ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       conjunction with --rename-manifest-package to fix tests against\n"
150ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        "       a package that has been renamed.\n"
151745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "   --utf16\n"
152745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       changes default encoding for resources to UTF-16.  Only useful when API\n"
153745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root        "       level is set to 7 or higher where the default encoding is UTF-8.\n");
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dispatch the command.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint handleCommand(Bundle* bundle)
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("--- command %d (verbose=%d force=%d):\n",
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    bundle->getCommand(), bundle->getVerbose(), bundle->getForce());
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //for (int i = 0; i < bundle->getFileSpecCount(); i++)
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    printf("  %d: '%s'\n", i, bundle->getFileSpecEntry(i));
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (bundle->getCommand()) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandVersion:   return doVersion(bundle);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandList:      return doList(bundle);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandDump:      return doDump(bundle);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandAdd:       return doAdd(bundle);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandRemove:    return doRemove(bundle);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case kCommandPackage:   return doPackage(bundle);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "%s: requested command not yet supported\n", gProgName);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parse args.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint main(int argc, char* const argv[])
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char *prog = argv[0];
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Bundle bundle;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool wantUsage = false;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result = 1;    // pessimistically assume an error.
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int tolerance = 0;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* default to compression */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bundle.setCompressionMethod(ZipEntry::kCompressDeflated);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (argc < 2) {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wantUsage = true;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (argv[1][0] == 'v')
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandVersion);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'd')
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandDump);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'l')
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandList);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'a')
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandAdd);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'r')
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandRemove);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (argv[1][0] == 'p')
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.setCommand(kCommandPackage);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "ERROR: Unknown command '%s'\n", argv[1]);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wantUsage = true;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    argc -= 2;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    argv += 2;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pull out flags.  We support "-fv" and "-f -v".
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (argc && argv[0][0] == '-') {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* flag(s) found */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* cp = argv[0] +1;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (*cp != '\0') {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (*cp) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'v':
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setVerbose(true);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'a':
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAndroidList(true);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'c':
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-c' option\n");
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addConfigurations(argv[0]);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'f':
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setForce(true);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'g':
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-g' option\n");
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tolerance = atoi(argv[0]);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setGrayscaleTolerance(tolerance);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog, tolerance);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
258dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker            case 'k':
259dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker                bundle.setJunkPath(true);
260dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker                break;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'm':
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setMakePackageDirs(true);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'p':
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setPseudolocalize(true);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'u':
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setUpdate(true);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'x':
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setExtending(true);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'z':
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setRequireLocalization(true);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'j':
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-j' option\n");
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addJarFile(argv[0]);
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'A':
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-A' option\n");
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAssetSourceDir(argv[0]);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3001553c82e084ac5763fb393857224145506771b99Joe Onorato            case 'G':
3011553c82e084ac5763fb393857224145506771b99Joe Onorato                argc--;
3021553c82e084ac5763fb393857224145506771b99Joe Onorato                argv++;
3031553c82e084ac5763fb393857224145506771b99Joe Onorato                if (!argc) {
3041553c82e084ac5763fb393857224145506771b99Joe Onorato                    fprintf(stderr, "ERROR: No argument supplied for '-G' option\n");
3051553c82e084ac5763fb393857224145506771b99Joe Onorato                    wantUsage = true;
3061553c82e084ac5763fb393857224145506771b99Joe Onorato                    goto bail;
3071553c82e084ac5763fb393857224145506771b99Joe Onorato                }
3081553c82e084ac5763fb393857224145506771b99Joe Onorato                convertPath(argv[0]);
3091553c82e084ac5763fb393857224145506771b99Joe Onorato                bundle.setProguardFile(argv[0]);
3101553c82e084ac5763fb393857224145506771b99Joe Onorato                break;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'I':
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-I' option\n");
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addPackageInclude(argv[0]);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'F':
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-F' option\n");
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setOutputAPKFile(argv[0]);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'J':
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-J' option\n");
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setRClassDir(argv[0]);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'M':
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-M' option\n");
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setAndroidManifestFile(argv[0]);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'P':
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-P' option\n");
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.setPublicOutputFile(argv[0]);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 'S':
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-S' option\n");
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertPath(argv[0]);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bundle.addResourceSourceDir(argv[0]);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '0':
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argc--;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argv++;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!argc) {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fprintf(stderr, "ERROR: No argument supplied for '-e' option\n");
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wantUsage = true;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (argv[0][0] != 0) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bundle.addNoCompressExtension(argv[0]);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bundle.setCompressionMethod(ZipEntry::kCompressStored);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
39162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn            case '-':
39262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                if (strcmp(cp, "-min-sdk-version") == 0) {
39362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
39462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
39562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
39662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--min-sdk-version' option\n");
39762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
39862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
39962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
40062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setMinSdkVersion(argv[0]);
40162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-target-sdk-version") == 0) {
40262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
40362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
40462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
40562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--target-sdk-version' option\n");
40662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
40762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
40862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
40962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setTargetSdkVersion(argv[0]);
41062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-max-sdk-version") == 0) {
41162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
41262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
41362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
41462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--max-sdk-version' option\n");
41562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
41662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
41762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
41862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setMaxSdkVersion(argv[0]);
41962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-version-code") == 0) {
42062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
42162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
42262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
42362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--version-code' option\n");
42462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
42562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
42662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
42762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setVersionCode(argv[0]);
42862da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else if (strcmp(cp, "-version-name") == 0) {
42962da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argc--;
43062da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    argv++;
43162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    if (!argc) {
43262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--version-name' option\n");
43362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        wantUsage = true;
43462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                        goto bail;
43562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    }
43662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    bundle.setVersionName(argv[0]);
437e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn                } else if (strcmp(cp, "-values") == 0) {
438e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn                    bundle.setValues(true);
43963459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                } else if (strcmp(cp, "-custom-package") == 0) {
44063459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    argc--;
44163459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    argv++;
44263459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    if (!argc) {
44363459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        fprintf(stderr, "ERROR: No argument supplied for '--custom-package' option\n");
44463459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        wantUsage = true;
44563459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                        goto bail;
44663459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    }
44763459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet                    bundle.setCustomPackage(argv[0]);
448745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root                } else if (strcmp(cp, "-utf16") == 0) {
449745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root                    bundle.setEncodingSpecified(true);
450745e17a07c77aa6b347d9e75c99eb3fcb381bc5dKenny Root                    bundle.setUTF8(false);
4512fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                } else if (strcmp(cp, "-rename-manifest-package") == 0) {
4522fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    argc--;
4532fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    argv++;
4542fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    if (!argc) {
4552fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        fprintf(stderr, "ERROR: No argument supplied for '--rename-manifest-package' option\n");
4562fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        wantUsage = true;
4572fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                        goto bail;
4582fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    }
4592fee0ed6eb99b211efa06f095a41268a2021214aJeff Hamilton                    bundle.setManifestPackageNameOverride(argv[0]);
460ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                } else if (strcmp(cp, "-rename-instrumentation-target-package") == 0) {
461ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    argc--;
462ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    argv++;
463ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    if (!argc) {
464ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        fprintf(stderr, "ERROR: No argument supplied for '--rename-instrumentation-target-package' option\n");
465ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        wantUsage = true;
466ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                        goto bail;
467ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    }
468ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                    bundle.setInstrumentationPackageNameOverride(argv[0]);
46999080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                } else if (strcmp(cp, "-auto-add-overlay") == 0) {
47099080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                    bundle.setAutoAddOverlay(true);
47162da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                } else {
47262da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp);
47362da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    wantUsage = true;
47462da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                    goto bail;
47562da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                }
47662da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                cp += strlen(cp) - 1;
47762da8461ed5317fe78ae5e3793662694e7fc99a3Dianne Hackborn                break;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: Unknown flag '-%c'\n", *cp);
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wantUsage = true;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                goto bail;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cp++;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        argc--;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        argv++;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We're past the flags.  The rest all goes straight in.
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bundle.setFileSpec(argv, argc);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = handleCommand(&bundle);
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (wantUsage) {
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        usage();
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result = 2;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("--> returning %d\n", result);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
506