]>
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/ZipFile.h> 
  16 using namespace android
; 
  18 static const char* gProgName 
= "aapt"; 
  21  * When running under Cygwin on Windows, this will convert slash-based 
  22  * paths into back-slash-based ones. Otherwise the ApptAssets file comparisons 
  23  * fail later as they use back-slash separators under Windows. 
  25  * This operates in-place on the path string. 
  27 void convertPath(char *path
) { 
  28   if (path 
!= NULL 
&& OS_PATH_SEPARATOR 
!= '/') { 
  29     for (; *path
; path
++) { 
  31         *path 
= OS_PATH_SEPARATOR
; 
  42     fprintf(stderr
, "Android Asset Packaging Tool\n\n"); 
  43     fprintf(stderr
, "Usage:\n"); 
  45         " %s l[ist] [-v] [-a] file.{zip,jar,apk}\n" 
  46         "   List contents of Zip-compatible archive.\n\n", gProgName
); 
  48         " %s d[ump] [--values] WHAT file.{apk} [asset [asset ...]]\n" 
  49         "   badging          Print the label and icon for the app declared in APK.\n" 
  50         "   permissions      Print the permissions from the APK.\n" 
  51         "   resources        Print the resource table from the APK.\n" 
  52         "   configurations   Print the configurations in the APK.\n" 
  53         "   xmltree          Print the compiled xmls in the given assets.\n" 
  54         "   xmlstrings       Print the strings of the given compiled xml assets.\n\n", gProgName
); 
  56         " %s p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n" 
  57         "        [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \\\n" 
  58         "        [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n" 
  59         "        [--max-sdk-version VAL] [--app-version VAL] \\\n" 
  60         "        [--app-version-name TEXT] \\\n" 
  61         "        [-I base-package [-I base-package ...]] \\\n" 
  62         "        [-A asset-source-dir] [-P public-definitions-file] \\\n" 
  63         "        [-S resource-sources [-S resource-sources ...]] " 
  64         "        [-F apk-file] [-J R-file-dir] \\\n" 
  65         "        [raw-files-dir [raw-files-dir] ...]\n" 
  67         "   Package the android resources.  It will read assets and resources that are\n" 
  68         "   supplied with the -M -A -S or raw-files-dir arguments.  The -J -P -F and -R\n" 
  69         "   options control which files are output.\n\n" 
  72         " %s r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]\n" 
  73         "   Delete specified files from Zip-compatible archive.\n\n", 
  76         " %s a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]\n" 
  77         "   Add specified files to Zip-compatible archive.\n\n", gProgName
); 
  80         "   Print program version.\n\n", gProgName
); 
  83         "   -a  print Android-specific data (resources, manifest) when listing\n" 
  84         "   -c  specify which configurations to include.  The default is all\n" 
  85         "       configurations.  The value of the parameter should be a comma\n" 
  86         "       separated list of configuration values.  Locales should be specified\n" 
  87         "       as either a language or language-region pair.  Some examples:\n" 
  91         "       If you put the special locale, zz_ZZ on the list, it will perform\n" 
  92         "       pseudolocalization on the default locale, modifying all of the\n" 
  93         "       strings so you can look for strings that missed the\n" 
  94         "       internationalization process.  For example:\n" 
  96         "   -d  one or more device assets to include, separated by commas\n" 
  97         "   -f  force overwrite of existing files\n" 
  98         "   -g  specify a pixel tolerance to force images to grayscale, default 0\n" 
  99         "   -j  specify a jar or zip file containing classes to include\n" 
 100         "   -m  make package directories under location specified by -J\n" 
 102         "   -p  pseudolocalize the default configuration\n" 
 104         "   -u  update existing packages (add new, replace older, remove deleted files)\n" 
 105         "   -v  verbose output\n" 
 106         "   -x  create extending (non-application) resource IDs\n" 
 107         "   -z  require localization of resource attributes marked with\n" 
 108         "       localization=\"suggested\"\n" 
 109         "   -A  additional directory in which to find raw asset files\n" 
 110         "   -F  specify the apk file to output\n" 
 111         "   -I  add an existing package to base include set\n" 
 112         "   -J  specify where to output R.java resource constant definitions\n" 
 113         "   -M  specify full path to AndroidManifest.xml to include in zip\n" 
 114         "   -P  specify where to output public resource definitions\n" 
 115         "   -S  directory in which to find resources.  Multiple directories will be scanned" 
 116         "       and the first match found (left to right) will take precedence." 
 117         "   -0  specifies an additional extension for which such files will not\n" 
 118         "       be stored compressed in the .apk.  An empty string means to not\n" 
 119         "       compress any files at all.\n" 
 120         "   --min-sdk-version\n" 
 121         "       inserts android:minSdkVersion in to manifest.\n" 
 122         "   --target-sdk-version\n" 
 123         "       inserts android:targetSdkVersion in to manifest.\n" 
 124         "   --max-sdk-version\n" 
 125         "       inserts android:maxSdkVersion in to manifest.\n" 
 127         "       when used with \"dump resources\" also includes resource values.\n" 
 129         "       inserts android:versionCode in to manifest.\n" 
 131         "       inserts android:versionName in to manifest.\n"); 
 135  * Dispatch the command. 
 137 int handleCommand(Bundle
* bundle
) 
 139     //printf("--- command %d (verbose=%d force=%d):\n", 
 140     //    bundle->getCommand(), bundle->getVerbose(), bundle->getForce()); 
 141     //for (int i = 0; i < bundle->getFileSpecCount(); i++) 
 142     //    printf("  %d: '%s'\n", i, bundle->getFileSpecEntry(i)); 
 144     switch (bundle
->getCommand()) { 
 145     case kCommandVersion
:   return doVersion(bundle
); 
 146     case kCommandList
:      return doList(bundle
); 
 147     case kCommandDump
:      return doDump(bundle
); 
 148     case kCommandAdd
:       return doAdd(bundle
); 
 149     case kCommandRemove
:    return doRemove(bundle
); 
 150     case kCommandPackage
:   return doPackage(bundle
); 
 152         fprintf(stderr
, "%s: requested command not yet supported\n", gProgName
); 
 160 int main(int argc
, char* const argv
[]) 
 162     char *prog 
= argv
[0]; 
 164     bool wantUsage 
= false; 
 165     int result 
= 1;    // pessimistically assume an error. 
 168     /* default to compression */ 
 169     bundle
.setCompressionMethod(ZipEntry::kCompressDeflated
); 
 176     if (argv
[1][0] == 'v') 
 177         bundle
.setCommand(kCommandVersion
); 
 178     else if (argv
[1][0] == 'd') 
 179         bundle
.setCommand(kCommandDump
); 
 180     else if (argv
[1][0] == 'l') 
 181         bundle
.setCommand(kCommandList
); 
 182     else if (argv
[1][0] == 'a') 
 183         bundle
.setCommand(kCommandAdd
); 
 184     else if (argv
[1][0] == 'r') 
 185         bundle
.setCommand(kCommandRemove
); 
 186     else if (argv
[1][0] == 'p') 
 187         bundle
.setCommand(kCommandPackage
); 
 189         fprintf(stderr
, "ERROR: Unknown command '%s'\n", argv
[1]); 
 197      * Pull out flags.  We support "-fv" and "-f -v". 
 199     while (argc 
&& argv
[0][0] == '-') { 
 201         const char* cp 
= argv
[0] +1; 
 203         while (*cp 
!= '\0') { 
 206                 bundle
.setVerbose(true); 
 209                 bundle
.setAndroidList(true); 
 215                     fprintf(stderr
, "ERROR: No argument supplied for '-c' option\n"); 
 219                 bundle
.addConfigurations(argv
[0]); 
 222                 bundle
.setForce(true); 
 228                     fprintf(stderr
, "ERROR: No argument supplied for '-g' option\n"); 
 232                 tolerance 
= atoi(argv
[0]); 
 233                 bundle
.setGrayscaleTolerance(tolerance
); 
 234                 printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog
, tolerance
); 
 237                 bundle
.setMakePackageDirs(true); 
 241                 bundle
.setPseudolocalize(true); 
 245                 bundle
.setUpdate(true); 
 248                 bundle
.setExtending(true); 
 251                 bundle
.setRequireLocalization(true); 
 257                     fprintf(stderr
, "ERROR: No argument supplied for '-j' option\n"); 
 261                 convertPath(argv
[0]); 
 262                 bundle
.addJarFile(argv
[0]); 
 268                     fprintf(stderr
, "ERROR: No argument supplied for '-A' option\n"); 
 272                 convertPath(argv
[0]); 
 273                 bundle
.setAssetSourceDir(argv
[0]); 
 279                     fprintf(stderr
, "ERROR: No argument supplied for '-I' option\n"); 
 283                 convertPath(argv
[0]); 
 284                 bundle
.addPackageInclude(argv
[0]); 
 290                     fprintf(stderr
, "ERROR: No argument supplied for '-F' option\n"); 
 294                 convertPath(argv
[0]); 
 295                 bundle
.setOutputAPKFile(argv
[0]); 
 301                     fprintf(stderr
, "ERROR: No argument supplied for '-J' option\n"); 
 305                 convertPath(argv
[0]); 
 306                 bundle
.setRClassDir(argv
[0]); 
 312                     fprintf(stderr
, "ERROR: No argument supplied for '-M' option\n"); 
 316                 convertPath(argv
[0]); 
 317                 bundle
.setAndroidManifestFile(argv
[0]); 
 323                     fprintf(stderr
, "ERROR: No argument supplied for '-P' option\n"); 
 327                 convertPath(argv
[0]); 
 328                 bundle
.setPublicOutputFile(argv
[0]); 
 334                     fprintf(stderr
, "ERROR: No argument supplied for '-S' option\n"); 
 338                 convertPath(argv
[0]); 
 339                 bundle
.addResourceSourceDir(argv
[0]); 
 345                     fprintf(stderr
, "ERROR: No argument supplied for '-e' option\n"); 
 349                 if (argv
[0][0] != 0) { 
 350                     bundle
.addNoCompressExtension(argv
[0]); 
 352                     bundle
.setCompressionMethod(ZipEntry::kCompressStored
); 
 356                 if (strcmp(cp
, "-min-sdk-version") == 0) { 
 360                         fprintf(stderr
, "ERROR: No argument supplied for '--min-sdk-version' option\n"); 
 364                     bundle
.setMinSdkVersion(argv
[0]); 
 365                 } else if (strcmp(cp
, "-target-sdk-version") == 0) { 
 369                         fprintf(stderr
, "ERROR: No argument supplied for '--target-sdk-version' option\n"); 
 373                     bundle
.setTargetSdkVersion(argv
[0]); 
 374                 } else if (strcmp(cp
, "-max-sdk-version") == 0) { 
 378                         fprintf(stderr
, "ERROR: No argument supplied for '--max-sdk-version' option\n"); 
 382                     bundle
.setMaxSdkVersion(argv
[0]); 
 383                 } else if (strcmp(cp
, "-version-code") == 0) { 
 387                         fprintf(stderr
, "ERROR: No argument supplied for '--version-code' option\n"); 
 391                     bundle
.setVersionCode(argv
[0]); 
 392                 } else if (strcmp(cp
, "-version-name") == 0) { 
 396                         fprintf(stderr
, "ERROR: No argument supplied for '--version-name' option\n"); 
 400                     bundle
.setVersionName(argv
[0]); 
 401                 } else if (strcmp(cp
, "-values") == 0) { 
 402                     bundle
.setValues(true); 
 404                     fprintf(stderr
, "ERROR: Unknown option '-%s'\n", cp
); 
 408                 cp 
+= strlen(cp
) - 1; 
 411                 fprintf(stderr
, "ERROR: Unknown flag '-%c'\n", *cp
); 
 423      * We're past the flags.  The rest all goes straight in. 
 425     bundle
.setFileSpec(argv
, argc
); 
 427     result 
= handleCommand(&bundle
); 
 435     //printf("--> returning %d\n", result);