Main.cpp revision a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3d
14e3124206a058ceb1be7b893d83b9201744db380Ben Gruver// 24e3124206a058ceb1be7b893d83b9201744db380Ben Gruver// Copyright 2006 The Android Open Source Project 34e3124206a058ceb1be7b893d83b9201744db380Ben Gruver// 44e3124206a058ceb1be7b893d83b9201744db380Ben Gruver// Android Asset Packaging Tool main entry point. 54e3124206a058ceb1be7b893d83b9201744db380Ben Gruver// 64e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#include "Main.h" 74e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#include "Bundle.h" 84e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 94e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#include <utils.h> 104e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#include <utils/ZipFile.h> 114e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 124e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#include <stdlib.h> 134e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#include <getopt.h> 144e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#include <assert.h> 154e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 164e3124206a058ceb1be7b893d83b9201744db380Ben Gruverusing namespace android; 174e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 184e3124206a058ceb1be7b893d83b9201744db380Ben Gruverstatic const char* gProgName = "aapt"; 194e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 204e3124206a058ceb1be7b893d83b9201744db380Ben Gruver/* 214e3124206a058ceb1be7b893d83b9201744db380Ben Gruver * When running under Cygwin on Windows, this will convert slash-based 224e3124206a058ceb1be7b893d83b9201744db380Ben Gruver * paths into back-slash-based ones. Otherwise the ApptAssets file comparisons 234e3124206a058ceb1be7b893d83b9201744db380Ben Gruver * fail later as they use back-slash separators under Windows. 244e3124206a058ceb1be7b893d83b9201744db380Ben Gruver * 254e3124206a058ceb1be7b893d83b9201744db380Ben Gruver * This operates in-place on the path string. 264e3124206a058ceb1be7b893d83b9201744db380Ben Gruver */ 274e3124206a058ceb1be7b893d83b9201744db380Ben Gruvervoid convertPath(char *path) { 284e3124206a058ceb1be7b893d83b9201744db380Ben Gruver if (path != NULL && OS_PATH_SEPARATOR != '/') { 294e3124206a058ceb1be7b893d83b9201744db380Ben Gruver for (; *path; path++) { 304e3124206a058ceb1be7b893d83b9201744db380Ben Gruver if (*path == '/') { 314e3124206a058ceb1be7b893d83b9201744db380Ben Gruver *path = OS_PATH_SEPARATOR; 324e3124206a058ceb1be7b893d83b9201744db380Ben Gruver } 334e3124206a058ceb1be7b893d83b9201744db380Ben Gruver } 344e3124206a058ceb1be7b893d83b9201744db380Ben Gruver } 354e3124206a058ceb1be7b893d83b9201744db380Ben Gruver} 364e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 374e3124206a058ceb1be7b893d83b9201744db380Ben Gruver/* 384e3124206a058ceb1be7b893d83b9201744db380Ben Gruver * Print usage info. 394e3124206a058ceb1be7b893d83b9201744db380Ben Gruver */ 404e3124206a058ceb1be7b893d83b9201744db380Ben Gruvervoid usage(void) 414e3124206a058ceb1be7b893d83b9201744db380Ben Gruver{ 424e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, "Android Asset Packaging Tool\n\n"); 434e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, "Usage:\n"); 444e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, 454e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " %s l[ist] [-v] [-a] file.{zip,jar,apk}\n" 464e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " List contents of Zip-compatible archive.\n\n", gProgName); 474e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, 484e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " %s d[ump] WHAT file.{apk} [asset [asset ...]]\n" 494e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " badging Print the label and icon for the app declared in APK.\n" 504e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " permissions Print the permissions from the APK.\n" 514e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " resources Print the resource table from the APK.\n" 524e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " configurations Print the configurations in the APK.\n" 534e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " xmltree Print the compiled xmls in the given assets.\n" 544e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " xmlstrings Print the strings of the given compiled xml assets.\n\n", gProgName); 554e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, 564e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " %s p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n" 574e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \\\n" 584e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n" 594e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [--max-sdk-version VAL] [--app-version VAL] \\\n" 604e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [--app-version-name TEXT] \\\n" 614e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [-I base-package [-I base-package ...]] \\\n" 624e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [-A asset-source-dir] [-P public-definitions-file] \\\n" 634e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [-S resource-sources [-S resource-sources ...]] " 644e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [-F apk-file] [-J R-file-dir] \\\n" 654e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " [raw-files-dir [raw-files-dir] ...]\n" 664e3124206a058ceb1be7b893d83b9201744db380Ben Gruver "\n" 674e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " Package the android resources. It will read assets and resources that are\n" 684e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R\n" 694e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " options control which files are output.\n\n" 704e3124206a058ceb1be7b893d83b9201744db380Ben Gruver , gProgName); 714e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, 724e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " %s r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]\n" 734e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " Delete specified files from Zip-compatible archive.\n\n", 744e3124206a058ceb1be7b893d83b9201744db380Ben Gruver gProgName); 754e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, 764e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " %s a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]\n" 774e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " Add specified files to Zip-compatible archive.\n\n", gProgName); 784e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, 794e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " %s v[ersion]\n" 804e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " Print program version.\n\n", gProgName); 814e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, 824e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " Modifiers:\n" 834e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -a print Android-specific data (resources, manifest) when listing\n" 844e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -c specify which configurations to include. The default is all\n" 854e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " configurations. The value of the parameter should be a comma\n" 864e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " separated list of configuration values. Locales should be specified\n" 874e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " as either a language or language-region pair. Some examples:\n" 884e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " en\n" 894e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " port,en\n" 904e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " port,land,en_US\n" 914e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " If you put the special locale, zz_ZZ on the list, it will perform\n" 924e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " pseudolocalization on the default locale, modifying all of the\n" 934e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " strings so you can look for strings that missed the\n" 944e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " internationalization process. For example:\n" 954e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " port,land,zz_ZZ\n" 964e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -d one or more device assets to include, separated by commas\n" 974e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -f force overwrite of existing files\n" 984e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -g specify a pixel tolerance to force images to grayscale, default 0\n" 994e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -j specify a jar or zip file containing classes to include\n" 1004e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -m make package directories under location specified by -J\n" 1014e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#if 0 1024e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -p pseudolocalize the default configuration\n" 1034e3124206a058ceb1be7b893d83b9201744db380Ben Gruver#endif 1044e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -u update existing packages (add new, replace older, remove deleted files)\n" 1054e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -v verbose output\n" 1064e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -x create extending (non-application) resource IDs\n" 1074e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -z require localization of resource attributes marked with\n" 1084e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " localization=\"suggested\"\n" 1094e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -A additional directory in which to find raw asset files\n" 1104e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -F specify the apk file to output\n" 1114e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -I add an existing package to base include set\n" 1124e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -J specify where to output R.java resource constant definitions\n" 1134e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -M specify full path to AndroidManifest.xml to include in zip\n" 1144e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -P specify where to output public resource definitions\n" 1154e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -S directory in which to find resources. Multiple directories will be scanned" 1164e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " and the first match found (left to right) will take precedence." 1174e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " -0 specifies an additional extension for which such files will not\n" 1184e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " be stored compressed in the .apk. An empty string means to not\n" 1194e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " compress any files at all.\n" 1204e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " --min-sdk-version\n" 1214e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " inserts android:minSdkVersion in to manifest.\n" 1224e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " --target-sdk-version\n" 1234e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " inserts android:targetSdkVersion in to manifest.\n" 1244e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " --max-sdk-version\n" 1254e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " inserts android:maxSdkVersion in to manifest.\n" 1264e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " --version-code\n" 1274e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " inserts android:versionCode in to manifest.\n" 1284e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " --version-name\n" 1294e3124206a058ceb1be7b893d83b9201744db380Ben Gruver " inserts android:versionName in to manifest.\n"); 1304e3124206a058ceb1be7b893d83b9201744db380Ben Gruver} 1314e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 1324e3124206a058ceb1be7b893d83b9201744db380Ben Gruver/* 1334e3124206a058ceb1be7b893d83b9201744db380Ben Gruver * Dispatch the command. 1344e3124206a058ceb1be7b893d83b9201744db380Ben Gruver */ 1354e3124206a058ceb1be7b893d83b9201744db380Ben Gruverint handleCommand(Bundle* bundle) 1364e3124206a058ceb1be7b893d83b9201744db380Ben Gruver{ 1374e3124206a058ceb1be7b893d83b9201744db380Ben Gruver //printf("--- command %d (verbose=%d force=%d):\n", 1384e3124206a058ceb1be7b893d83b9201744db380Ben Gruver // bundle->getCommand(), bundle->getVerbose(), bundle->getForce()); 1394e3124206a058ceb1be7b893d83b9201744db380Ben Gruver //for (int i = 0; i < bundle->getFileSpecCount(); i++) 1404e3124206a058ceb1be7b893d83b9201744db380Ben Gruver // printf(" %d: '%s'\n", i, bundle->getFileSpecEntry(i)); 1414e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 1424e3124206a058ceb1be7b893d83b9201744db380Ben Gruver switch (bundle->getCommand()) { 1434e3124206a058ceb1be7b893d83b9201744db380Ben Gruver case kCommandVersion: return doVersion(bundle); 1444e3124206a058ceb1be7b893d83b9201744db380Ben Gruver case kCommandList: return doList(bundle); 1454e3124206a058ceb1be7b893d83b9201744db380Ben Gruver case kCommandDump: return doDump(bundle); 1464e3124206a058ceb1be7b893d83b9201744db380Ben Gruver case kCommandAdd: return doAdd(bundle); 1474e3124206a058ceb1be7b893d83b9201744db380Ben Gruver case kCommandRemove: return doRemove(bundle); 1484e3124206a058ceb1be7b893d83b9201744db380Ben Gruver case kCommandPackage: return doPackage(bundle); 1494e3124206a058ceb1be7b893d83b9201744db380Ben Gruver default: 1504e3124206a058ceb1be7b893d83b9201744db380Ben Gruver fprintf(stderr, "%s: requested command not yet supported\n", gProgName); 1514e3124206a058ceb1be7b893d83b9201744db380Ben Gruver return 1; 1524e3124206a058ceb1be7b893d83b9201744db380Ben Gruver } 1534e3124206a058ceb1be7b893d83b9201744db380Ben Gruver} 1544e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 1554e3124206a058ceb1be7b893d83b9201744db380Ben Gruver/* 1564e3124206a058ceb1be7b893d83b9201744db380Ben Gruver * Parse args. 1574e3124206a058ceb1be7b893d83b9201744db380Ben Gruver */ 1584e3124206a058ceb1be7b893d83b9201744db380Ben Gruverint main(int argc, char* const argv[]) 1594e3124206a058ceb1be7b893d83b9201744db380Ben Gruver{ 1604e3124206a058ceb1be7b893d83b9201744db380Ben Gruver char *prog = argv[0]; 1614e3124206a058ceb1be7b893d83b9201744db380Ben Gruver Bundle bundle; 1624e3124206a058ceb1be7b893d83b9201744db380Ben Gruver bool wantUsage = false; 1634e3124206a058ceb1be7b893d83b9201744db380Ben Gruver int result = 1; // pessimistically assume an error. 1644e3124206a058ceb1be7b893d83b9201744db380Ben Gruver int tolerance = 0; 1654e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 1664e3124206a058ceb1be7b893d83b9201744db380Ben Gruver /* default to compression */ 1674e3124206a058ceb1be7b893d83b9201744db380Ben Gruver bundle.setCompressionMethod(ZipEntry::kCompressDeflated); 1684e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 1694e3124206a058ceb1be7b893d83b9201744db380Ben Gruver if (argc < 2) { 1704e3124206a058ceb1be7b893d83b9201744db380Ben Gruver wantUsage = true; 1714e3124206a058ceb1be7b893d83b9201744db380Ben Gruver goto bail; 1724e3124206a058ceb1be7b893d83b9201744db380Ben Gruver } 1734e3124206a058ceb1be7b893d83b9201744db380Ben Gruver 1744e3124206a058ceb1be7b893d83b9201744db380Ben Gruver if (argv[1][0] == 'v') 1754e3124206a058ceb1be7b893d83b9201744db380Ben Gruver bundle.setCommand(kCommandVersion); 1764e3124206a058ceb1be7b893d83b9201744db380Ben Gruver else if (argv[1][0] == 'd') 1774e3124206a058ceb1be7b893d83b9201744db380Ben Gruver bundle.setCommand(kCommandDump); 1784e3124206a058ceb1be7b893d83b9201744db380Ben Gruver else if (argv[1][0] == 'l') 1794e3124206a058ceb1be7b893d83b9201744db380Ben Gruver bundle.setCommand(kCommandList); 1804e3124206a058ceb1be7b893d83b9201744db380Ben Gruver else if (argv[1][0] == 'a') 1814e3124206a058ceb1be7b893d83b9201744db380Ben Gruver bundle.setCommand(kCommandAdd); 1824e3124206a058ceb1be7b893d83b9201744db380Ben Gruver else if (argv[1][0] == 'r') 1834e3124206a058ceb1be7b893d83b9201744db380Ben Gruver bundle.setCommand(kCommandRemove); 1844e3124206a058ceb1be7b893d83b9201744db380Ben Gruver else if (argv[1][0] == 'p') 1854e3124206a058ceb1be7b893d83b9201744db380Ben Gruver bundle.setCommand(kCommandPackage); 186 else { 187 fprintf(stderr, "ERROR: Unknown command '%s'\n", argv[1]); 188 wantUsage = true; 189 goto bail; 190 } 191 argc -= 2; 192 argv += 2; 193 194 /* 195 * Pull out flags. We support "-fv" and "-f -v". 196 */ 197 while (argc && argv[0][0] == '-') { 198 /* flag(s) found */ 199 const char* cp = argv[0] +1; 200 201 while (*cp != '\0') { 202 switch (*cp) { 203 case 'v': 204 bundle.setVerbose(true); 205 break; 206 case 'a': 207 bundle.setAndroidList(true); 208 break; 209 case 'c': 210 argc--; 211 argv++; 212 if (!argc) { 213 fprintf(stderr, "ERROR: No argument supplied for '-c' option\n"); 214 wantUsage = true; 215 goto bail; 216 } 217 bundle.addConfigurations(argv[0]); 218 break; 219 case 'f': 220 bundle.setForce(true); 221 break; 222 case 'g': 223 argc--; 224 argv++; 225 if (!argc) { 226 fprintf(stderr, "ERROR: No argument supplied for '-g' option\n"); 227 wantUsage = true; 228 goto bail; 229 } 230 tolerance = atoi(argv[0]); 231 bundle.setGrayscaleTolerance(tolerance); 232 printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog, tolerance); 233 break; 234 case 'm': 235 bundle.setMakePackageDirs(true); 236 break; 237#if 0 238 case 'p': 239 bundle.setPseudolocalize(true); 240 break; 241#endif 242 case 'u': 243 bundle.setUpdate(true); 244 break; 245 case 'x': 246 bundle.setExtending(true); 247 break; 248 case 'z': 249 bundle.setRequireLocalization(true); 250 break; 251 case 'j': 252 argc--; 253 argv++; 254 if (!argc) { 255 fprintf(stderr, "ERROR: No argument supplied for '-j' option\n"); 256 wantUsage = true; 257 goto bail; 258 } 259 convertPath(argv[0]); 260 bundle.addJarFile(argv[0]); 261 break; 262 case 'A': 263 argc--; 264 argv++; 265 if (!argc) { 266 fprintf(stderr, "ERROR: No argument supplied for '-A' option\n"); 267 wantUsage = true; 268 goto bail; 269 } 270 convertPath(argv[0]); 271 bundle.setAssetSourceDir(argv[0]); 272 break; 273 case 'I': 274 argc--; 275 argv++; 276 if (!argc) { 277 fprintf(stderr, "ERROR: No argument supplied for '-I' option\n"); 278 wantUsage = true; 279 goto bail; 280 } 281 convertPath(argv[0]); 282 bundle.addPackageInclude(argv[0]); 283 break; 284 case 'F': 285 argc--; 286 argv++; 287 if (!argc) { 288 fprintf(stderr, "ERROR: No argument supplied for '-F' option\n"); 289 wantUsage = true; 290 goto bail; 291 } 292 convertPath(argv[0]); 293 bundle.setOutputAPKFile(argv[0]); 294 break; 295 case 'J': 296 argc--; 297 argv++; 298 if (!argc) { 299 fprintf(stderr, "ERROR: No argument supplied for '-J' option\n"); 300 wantUsage = true; 301 goto bail; 302 } 303 convertPath(argv[0]); 304 bundle.setRClassDir(argv[0]); 305 break; 306 case 'M': 307 argc--; 308 argv++; 309 if (!argc) { 310 fprintf(stderr, "ERROR: No argument supplied for '-M' option\n"); 311 wantUsage = true; 312 goto bail; 313 } 314 convertPath(argv[0]); 315 bundle.setAndroidManifestFile(argv[0]); 316 break; 317 case 'P': 318 argc--; 319 argv++; 320 if (!argc) { 321 fprintf(stderr, "ERROR: No argument supplied for '-P' option\n"); 322 wantUsage = true; 323 goto bail; 324 } 325 convertPath(argv[0]); 326 bundle.setPublicOutputFile(argv[0]); 327 break; 328 case 'S': 329 argc--; 330 argv++; 331 if (!argc) { 332 fprintf(stderr, "ERROR: No argument supplied for '-S' option\n"); 333 wantUsage = true; 334 goto bail; 335 } 336 convertPath(argv[0]); 337 bundle.addResourceSourceDir(argv[0]); 338 break; 339 case '0': 340 argc--; 341 argv++; 342 if (!argc) { 343 fprintf(stderr, "ERROR: No argument supplied for '-e' option\n"); 344 wantUsage = true; 345 goto bail; 346 } 347 if (argv[0][0] != 0) { 348 bundle.addNoCompressExtension(argv[0]); 349 } else { 350 bundle.setCompressionMethod(ZipEntry::kCompressStored); 351 } 352 break; 353 case '-': 354 if (strcmp(cp, "-min-sdk-version") == 0) { 355 argc--; 356 argv++; 357 if (!argc) { 358 fprintf(stderr, "ERROR: No argument supplied for '--min-sdk-version' option\n"); 359 wantUsage = true; 360 goto bail; 361 } 362 bundle.setMinSdkVersion(argv[0]); 363 } else if (strcmp(cp, "-target-sdk-version") == 0) { 364 argc--; 365 argv++; 366 if (!argc) { 367 fprintf(stderr, "ERROR: No argument supplied for '--target-sdk-version' option\n"); 368 wantUsage = true; 369 goto bail; 370 } 371 bundle.setTargetSdkVersion(argv[0]); 372 } else if (strcmp(cp, "-max-sdk-version") == 0) { 373 argc--; 374 argv++; 375 if (!argc) { 376 fprintf(stderr, "ERROR: No argument supplied for '--max-sdk-version' option\n"); 377 wantUsage = true; 378 goto bail; 379 } 380 bundle.setMaxSdkVersion(argv[0]); 381 } else if (strcmp(cp, "-version-code") == 0) { 382 argc--; 383 argv++; 384 if (!argc) { 385 fprintf(stderr, "ERROR: No argument supplied for '--version-code' option\n"); 386 wantUsage = true; 387 goto bail; 388 } 389 bundle.setVersionCode(argv[0]); 390 } else if (strcmp(cp, "-version-name") == 0) { 391 argc--; 392 argv++; 393 if (!argc) { 394 fprintf(stderr, "ERROR: No argument supplied for '--version-name' option\n"); 395 wantUsage = true; 396 goto bail; 397 } 398 bundle.setVersionName(argv[0]); 399 } else { 400 fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp); 401 wantUsage = true; 402 goto bail; 403 } 404 cp += strlen(cp) - 1; 405 break; 406 default: 407 fprintf(stderr, "ERROR: Unknown flag '-%c'\n", *cp); 408 wantUsage = true; 409 goto bail; 410 } 411 412 cp++; 413 } 414 argc--; 415 argv++; 416 } 417 418 /* 419 * We're past the flags. The rest all goes straight in. 420 */ 421 bundle.setFileSpec(argv, argc); 422 423 result = handleCommand(&bundle); 424 425bail: 426 if (wantUsage) { 427 usage(); 428 result = 2; 429 } 430 431 //printf("--> returning %d\n", result); 432 return result; 433} 434