]>
git.saurik.com Git - android/aapt.git/blob - Main.cpp
   2 // Copyright 2006 The Android Open Source Project 
   4 // Android Asset Packaging Tool main entry point. 
  10 #include <utils/threads.h> 
  11 #include <utils/List.h> 
  12 #include <utils/Errors.h> 
  18 using namespace android
; 
  20 static const char* gProgName 
= "aapt"; 
  23  * When running under Cygwin on Windows, this will convert slash-based 
  24  * paths into back-slash-based ones. Otherwise the ApptAssets file comparisons 
  25  * fail later as they use back-slash separators under Windows. 
  27  * This operates in-place on the path string. 
  29 void convertPath(char *path
) { 
  30   if (path 
!= NULL 
&& OS_PATH_SEPARATOR 
!= '/') { 
  31     for (; *path
; path
++) { 
  33         *path 
= OS_PATH_SEPARATOR
; 
  44     fprintf(stderr
, "Android Asset Packaging Tool\n\n"); 
  45     fprintf(stderr
, "Usage:\n"); 
  47         " %s l[ist] [-v] [-a] file.{zip,jar,apk}\n" 
  48         "   List contents of Zip-compatible archive.\n\n", gProgName
); 
  50         " %s d[ump] [--values] WHAT file.{apk} [asset [asset ...]]\n" 
  51         "   badging          Print the label and icon for the app declared in APK.\n" 
  52         "   permissions      Print the permissions from the APK.\n" 
  53         "   resources        Print the resource table from the APK.\n" 
  54         "   configurations   Print the configurations in the APK.\n" 
  55         "   xmltree          Print the compiled xmls in the given assets.\n" 
  56         "   xmlstrings       Print the strings of the given compiled xml assets.\n\n", gProgName
); 
  58         " %s p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n" 
  59         "        [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \\\n" 
  60         "        [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n" 
  61         "        [--max-sdk-version VAL] [--app-version VAL] \\\n" 
  62         "        [--app-version-name TEXT] [--custom-package VAL] \\\n" 
  63         "        [-I base-package [-I base-package ...]] \\\n" 
  64         "        [-A asset-source-dir]  [-G class-list-file] [-P public-definitions-file] \\\n" 
  65         "        [-S resource-sources [-S resource-sources ...]] " 
  66         "        [-F apk-file] [-J R-file-dir] \\\n" 
  67         "        [raw-files-dir [raw-files-dir] ...]\n" 
  69         "   Package the android resources.  It will read assets and resources that are\n" 
  70         "   supplied with the -M -A -S or raw-files-dir arguments.  The -J -P -F and -R\n" 
  71         "   options control which files are output.\n\n" 
  74         " %s r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]\n" 
  75         "   Delete specified files from Zip-compatible archive.\n\n", 
  78         " %s a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]\n" 
  79         "   Add specified files to Zip-compatible archive.\n\n", gProgName
); 
  82         "   Print program version.\n\n", gProgName
); 
  85         "   -a  print Android-specific data (resources, manifest) when listing\n" 
  86         "   -c  specify which configurations to include.  The default is all\n" 
  87         "       configurations.  The value of the parameter should be a comma\n" 
  88         "       separated list of configuration values.  Locales should be specified\n" 
  89         "       as either a language or language-region pair.  Some examples:\n" 
  93         "       If you put the special locale, zz_ZZ on the list, it will perform\n" 
  94         "       pseudolocalization on the default locale, modifying all of the\n" 
  95         "       strings so you can look for strings that missed the\n" 
  96         "       internationalization process.  For example:\n" 
  98         "   -d  one or more device assets to include, separated by commas\n" 
  99         "   -f  force overwrite of existing files\n" 
 100         "   -g  specify a pixel tolerance to force images to grayscale, default 0\n" 
 101         "   -j  specify a jar or zip file containing classes to include\n" 
 102         "   -k  junk path of file(s) added\n" 
 103         "   -m  make package directories under location specified by -J\n" 
 105         "   -p  pseudolocalize the default configuration\n" 
 107         "   -u  update existing packages (add new, replace older, remove deleted files)\n" 
 108         "   -v  verbose output\n" 
 109         "   -x  create extending (non-application) resource IDs\n" 
 110         "   -z  require localization of resource attributes marked with\n" 
 111         "       localization=\"suggested\"\n" 
 112         "   -A  additional directory in which to find raw asset files\n" 
 113         "   -G  A file to output proguard options into.\n" 
 114         "   -F  specify the apk file to output\n" 
 115         "   -I  add an existing package to base include set\n" 
 116         "   -J  specify where to output R.java resource constant definitions\n" 
 117         "   -M  specify full path to AndroidManifest.xml to include in zip\n" 
 118         "   -P  specify where to output public resource definitions\n" 
 119         "   -S  directory in which to find resources.  Multiple directories will be scanned\n" 
 120         "       and the first match found (left to right) will take precedence.\n" 
 121         "   -8  Encode string resources in UTF-8.\n" 
 122         "   -0  specifies an additional extension for which such files will not\n" 
 123         "       be stored compressed in the .apk.  An empty string means to not\n" 
 124         "       compress any files at all.\n" 
 125         "   --min-sdk-version\n" 
 126         "       inserts android:minSdkVersion in to manifest.\n" 
 127         "   --target-sdk-version\n" 
 128         "       inserts android:targetSdkVersion in to manifest.\n" 
 129         "   --max-sdk-version\n" 
 130         "       inserts android:maxSdkVersion in to manifest.\n" 
 132         "       when used with \"dump resources\" also includes resource values.\n" 
 134         "       inserts android:versionCode in to manifest.\n" 
 136         "       inserts android:versionName in to manifest.\n" 
 137         "   --custom-package\n" 
 138         "       generates R.java into a different package.\n"); 
 142  * Dispatch the command. 
 144 int handleCommand(Bundle
* bundle
) 
 146     //printf("--- command %d (verbose=%d force=%d):\n", 
 147     //    bundle->getCommand(), bundle->getVerbose(), bundle->getForce()); 
 148     //for (int i = 0; i < bundle->getFileSpecCount(); i++) 
 149     //    printf("  %d: '%s'\n", i, bundle->getFileSpecEntry(i)); 
 151     switch (bundle
->getCommand()) { 
 152     case kCommandVersion
:   return doVersion(bundle
); 
 153     case kCommandList
:      return doList(bundle
); 
 154     case kCommandDump
:      return doDump(bundle
); 
 155     case kCommandAdd
:       return doAdd(bundle
); 
 156     case kCommandRemove
:    return doRemove(bundle
); 
 157     case kCommandPackage
:   return doPackage(bundle
); 
 159         fprintf(stderr
, "%s: requested command not yet supported\n", gProgName
); 
 167 int main(int argc
, char* const argv
[]) 
 169     char *prog 
= argv
[0]; 
 171     bool wantUsage 
= false; 
 172     int result 
= 1;    // pessimistically assume an error. 
 175     /* default to compression */ 
 176     bundle
.setCompressionMethod(ZipEntry::kCompressDeflated
); 
 183     if (argv
[1][0] == 'v') 
 184         bundle
.setCommand(kCommandVersion
); 
 185     else if (argv
[1][0] == 'd') 
 186         bundle
.setCommand(kCommandDump
); 
 187     else if (argv
[1][0] == 'l') 
 188         bundle
.setCommand(kCommandList
); 
 189     else if (argv
[1][0] == 'a') 
 190         bundle
.setCommand(kCommandAdd
); 
 191     else if (argv
[1][0] == 'r') 
 192         bundle
.setCommand(kCommandRemove
); 
 193     else if (argv
[1][0] == 'p') 
 194         bundle
.setCommand(kCommandPackage
); 
 196         fprintf(stderr
, "ERROR: Unknown command '%s'\n", argv
[1]); 
 204      * Pull out flags.  We support "-fv" and "-f -v". 
 206     while (argc 
&& argv
[0][0] == '-') { 
 208         const char* cp 
= argv
[0] +1; 
 210         while (*cp 
!= '\0') { 
 213                 bundle
.setVerbose(true); 
 216                 bundle
.setAndroidList(true); 
 222                     fprintf(stderr
, "ERROR: No argument supplied for '-c' option\n"); 
 226                 bundle
.addConfigurations(argv
[0]); 
 229                 bundle
.setForce(true); 
 235                     fprintf(stderr
, "ERROR: No argument supplied for '-g' option\n"); 
 239                 tolerance 
= atoi(argv
[0]); 
 240                 bundle
.setGrayscaleTolerance(tolerance
); 
 241                 printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog
, tolerance
); 
 244                 bundle
.setJunkPath(true); 
 247                 bundle
.setMakePackageDirs(true); 
 251                 bundle
.setPseudolocalize(true); 
 255                 bundle
.setUpdate(true); 
 258                 bundle
.setExtending(true); 
 261                 bundle
.setRequireLocalization(true); 
 267                     fprintf(stderr
, "ERROR: No argument supplied for '-j' option\n"); 
 271                 convertPath(argv
[0]); 
 272                 bundle
.addJarFile(argv
[0]); 
 278                     fprintf(stderr
, "ERROR: No argument supplied for '-A' option\n"); 
 282                 convertPath(argv
[0]); 
 283                 bundle
.setAssetSourceDir(argv
[0]); 
 289                     fprintf(stderr
, "ERROR: No argument supplied for '-G' option\n"); 
 293                 convertPath(argv
[0]); 
 294                 bundle
.setProguardFile(argv
[0]); 
 300                     fprintf(stderr
, "ERROR: No argument supplied for '-I' option\n"); 
 304                 convertPath(argv
[0]); 
 305                 bundle
.addPackageInclude(argv
[0]); 
 311                     fprintf(stderr
, "ERROR: No argument supplied for '-F' option\n"); 
 315                 convertPath(argv
[0]); 
 316                 bundle
.setOutputAPKFile(argv
[0]); 
 322                     fprintf(stderr
, "ERROR: No argument supplied for '-J' option\n"); 
 326                 convertPath(argv
[0]); 
 327                 bundle
.setRClassDir(argv
[0]); 
 333                     fprintf(stderr
, "ERROR: No argument supplied for '-M' option\n"); 
 337                 convertPath(argv
[0]); 
 338                 bundle
.setAndroidManifestFile(argv
[0]); 
 344                     fprintf(stderr
, "ERROR: No argument supplied for '-P' option\n"); 
 348                 convertPath(argv
[0]); 
 349                 bundle
.setPublicOutputFile(argv
[0]); 
 355                     fprintf(stderr
, "ERROR: No argument supplied for '-S' option\n"); 
 359                 convertPath(argv
[0]); 
 360                 bundle
.addResourceSourceDir(argv
[0]); 
 366                     fprintf(stderr
, "ERROR: No argument supplied for '-e' option\n"); 
 370                 if (argv
[0][0] != 0) { 
 371                     bundle
.addNoCompressExtension(argv
[0]); 
 373                     bundle
.setCompressionMethod(ZipEntry::kCompressStored
); 
 377                 bundle
.setUTF8(true); 
 380                 if (strcmp(cp
, "-min-sdk-version") == 0) { 
 384                         fprintf(stderr
, "ERROR: No argument supplied for '--min-sdk-version' option\n"); 
 388                     bundle
.setMinSdkVersion(argv
[0]); 
 389                 } else if (strcmp(cp
, "-target-sdk-version") == 0) { 
 393                         fprintf(stderr
, "ERROR: No argument supplied for '--target-sdk-version' option\n"); 
 397                     bundle
.setTargetSdkVersion(argv
[0]); 
 398                 } else if (strcmp(cp
, "-max-sdk-version") == 0) { 
 402                         fprintf(stderr
, "ERROR: No argument supplied for '--max-sdk-version' option\n"); 
 406                     bundle
.setMaxSdkVersion(argv
[0]); 
 407                 } else if (strcmp(cp
, "-version-code") == 0) { 
 411                         fprintf(stderr
, "ERROR: No argument supplied for '--version-code' option\n"); 
 415                     bundle
.setVersionCode(argv
[0]); 
 416                 } else if (strcmp(cp
, "-version-name") == 0) { 
 420                         fprintf(stderr
, "ERROR: No argument supplied for '--version-name' option\n"); 
 424                     bundle
.setVersionName(argv
[0]); 
 425                 } else if (strcmp(cp
, "-values") == 0) { 
 426                     bundle
.setValues(true); 
 427                 } else if (strcmp(cp
, "-custom-package") == 0) { 
 431                         fprintf(stderr
, "ERROR: No argument supplied for '--custom-package' option\n"); 
 435                     bundle
.setCustomPackage(argv
[0]); 
 437                     fprintf(stderr
, "ERROR: Unknown option '-%s'\n", cp
); 
 441                 cp 
+= strlen(cp
) - 1; 
 444                 fprintf(stderr
, "ERROR: Unknown flag '-%c'\n", *cp
); 
 456      * We're past the flags.  The rest all goes straight in. 
 458     bundle
.setFileSpec(argv
, argc
); 
 460     result 
= handleCommand(&bundle
); 
 468     //printf("--> returning %d\n", result);