1*d57664e9SAndroid Build Coastguard Worker //
2*d57664e9SAndroid Build Coastguard Worker // Copyright 2006 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker //
4*d57664e9SAndroid Build Coastguard Worker // Android Asset Packaging Tool main entry point.
5*d57664e9SAndroid Build Coastguard Worker //
6*d57664e9SAndroid Build Coastguard Worker #include "Main.h"
7*d57664e9SAndroid Build Coastguard Worker #include "Bundle.h"
8*d57664e9SAndroid Build Coastguard Worker
9*d57664e9SAndroid Build Coastguard Worker #include <build/version.h>
10*d57664e9SAndroid Build Coastguard Worker #include <utils/Compat.h>
11*d57664e9SAndroid Build Coastguard Worker #include <utils/Log.h>
12*d57664e9SAndroid Build Coastguard Worker #include <utils/threads.h>
13*d57664e9SAndroid Build Coastguard Worker #include <utils/List.h>
14*d57664e9SAndroid Build Coastguard Worker #include <utils/Errors.h>
15*d57664e9SAndroid Build Coastguard Worker
16*d57664e9SAndroid Build Coastguard Worker #include <cstdlib>
17*d57664e9SAndroid Build Coastguard Worker #include <getopt.h>
18*d57664e9SAndroid Build Coastguard Worker #include <cassert>
19*d57664e9SAndroid Build Coastguard Worker
20*d57664e9SAndroid Build Coastguard Worker using namespace android;
21*d57664e9SAndroid Build Coastguard Worker
22*d57664e9SAndroid Build Coastguard Worker static const char* gProgName = "aapt";
23*d57664e9SAndroid Build Coastguard Worker
24*d57664e9SAndroid Build Coastguard Worker /*
25*d57664e9SAndroid Build Coastguard Worker * Show version info. All the cool kids do it.
26*d57664e9SAndroid Build Coastguard Worker */
doVersion(Bundle * bundle)27*d57664e9SAndroid Build Coastguard Worker int doVersion(Bundle* bundle)
28*d57664e9SAndroid Build Coastguard Worker {
29*d57664e9SAndroid Build Coastguard Worker if (bundle->getFileSpecCount() != 0) {
30*d57664e9SAndroid Build Coastguard Worker printf("(ignoring extra arguments)\n");
31*d57664e9SAndroid Build Coastguard Worker }
32*d57664e9SAndroid Build Coastguard Worker printf("Android Asset Packaging Tool, v0.2-%s\n", android::build::GetBuildNumber().c_str());
33*d57664e9SAndroid Build Coastguard Worker
34*d57664e9SAndroid Build Coastguard Worker return 0;
35*d57664e9SAndroid Build Coastguard Worker }
36*d57664e9SAndroid Build Coastguard Worker
37*d57664e9SAndroid Build Coastguard Worker /*
38*d57664e9SAndroid Build Coastguard Worker * When running under Cygwin on Windows, this will convert slash-based
39*d57664e9SAndroid Build Coastguard Worker * paths into back-slash-based ones. Otherwise the ApptAssets file comparisons
40*d57664e9SAndroid Build Coastguard Worker * fail later as they use back-slash separators under Windows.
41*d57664e9SAndroid Build Coastguard Worker *
42*d57664e9SAndroid Build Coastguard Worker * This operates in-place on the path string.
43*d57664e9SAndroid Build Coastguard Worker */
convertPath(char * path)44*d57664e9SAndroid Build Coastguard Worker void convertPath(char *path) {
45*d57664e9SAndroid Build Coastguard Worker if (path != NULL && OS_PATH_SEPARATOR != '/') {
46*d57664e9SAndroid Build Coastguard Worker for (; *path; path++) {
47*d57664e9SAndroid Build Coastguard Worker if (*path == '/') {
48*d57664e9SAndroid Build Coastguard Worker *path = OS_PATH_SEPARATOR;
49*d57664e9SAndroid Build Coastguard Worker }
50*d57664e9SAndroid Build Coastguard Worker }
51*d57664e9SAndroid Build Coastguard Worker }
52*d57664e9SAndroid Build Coastguard Worker }
53*d57664e9SAndroid Build Coastguard Worker
54*d57664e9SAndroid Build Coastguard Worker /*
55*d57664e9SAndroid Build Coastguard Worker * Print usage info.
56*d57664e9SAndroid Build Coastguard Worker */
usage(void)57*d57664e9SAndroid Build Coastguard Worker void usage(void)
58*d57664e9SAndroid Build Coastguard Worker {
59*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "Android Asset Packaging Tool\n\n");
60*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "Usage:\n");
61*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
62*d57664e9SAndroid Build Coastguard Worker " %s l[ist] [-v] [-a] file.{zip,jar,apk}\n"
63*d57664e9SAndroid Build Coastguard Worker " List contents of Zip-compatible archive.\n\n", gProgName);
64*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
65*d57664e9SAndroid Build Coastguard Worker " %s d[ump] [--values] [--include-meta-data] WHAT file.{apk} [asset [asset ...]]\n"
66*d57664e9SAndroid Build Coastguard Worker " strings Print the contents of the resource table string pool in the APK.\n"
67*d57664e9SAndroid Build Coastguard Worker " badging Print the label and icon for the app declared in APK.\n"
68*d57664e9SAndroid Build Coastguard Worker " permissions Print the permissions from the APK.\n"
69*d57664e9SAndroid Build Coastguard Worker " resources Print the resource table from the APK.\n"
70*d57664e9SAndroid Build Coastguard Worker " configurations Print the configurations in the APK.\n"
71*d57664e9SAndroid Build Coastguard Worker " xmltree Print the compiled xmls in the given assets.\n"
72*d57664e9SAndroid Build Coastguard Worker " xmlstrings Print the strings of the given compiled xml assets.\n\n", gProgName);
73*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
74*d57664e9SAndroid Build Coastguard Worker " %s p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n"
75*d57664e9SAndroid Build Coastguard Worker " [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \\\n"
76*d57664e9SAndroid Build Coastguard Worker " [--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n"
77*d57664e9SAndroid Build Coastguard Worker " [--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \\\n"
78*d57664e9SAndroid Build Coastguard Worker " [--rename-manifest-package PACKAGE] \\\n"
79*d57664e9SAndroid Build Coastguard Worker " [--rename-instrumentation-target-package PACKAGE] \\\n"
80*d57664e9SAndroid Build Coastguard Worker " [--utf16] [--auto-add-overlay] \\\n"
81*d57664e9SAndroid Build Coastguard Worker " [--max-res-version VAL] \\\n"
82*d57664e9SAndroid Build Coastguard Worker " [-I base-package [-I base-package ...]] \\\n"
83*d57664e9SAndroid Build Coastguard Worker " [-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] \\\n"
84*d57664e9SAndroid Build Coastguard Worker " [-D main-dex-class-list-file] \\\n"
85*d57664e9SAndroid Build Coastguard Worker " [-S resource-sources [-S resource-sources ...]] \\\n"
86*d57664e9SAndroid Build Coastguard Worker " [-F apk-file] [-J R-file-dir] \\\n"
87*d57664e9SAndroid Build Coastguard Worker " [--product product1,product2,...] \\\n"
88*d57664e9SAndroid Build Coastguard Worker " [-c CONFIGS] [--preferred-density DENSITY] \\\n"
89*d57664e9SAndroid Build Coastguard Worker " [--split CONFIGS [--split CONFIGS]] \\\n"
90*d57664e9SAndroid Build Coastguard Worker " [--feature-of package [--feature-after package]] \\\n"
91*d57664e9SAndroid Build Coastguard Worker " [raw-files-dir [raw-files-dir] ...] \\\n"
92*d57664e9SAndroid Build Coastguard Worker " [--output-text-symbols DIR]\n"
93*d57664e9SAndroid Build Coastguard Worker "\n"
94*d57664e9SAndroid Build Coastguard Worker " Package the android resources. It will read assets and resources that are\n"
95*d57664e9SAndroid Build Coastguard Worker " supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R\n"
96*d57664e9SAndroid Build Coastguard Worker " options control which files are output.\n\n"
97*d57664e9SAndroid Build Coastguard Worker , gProgName);
98*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
99*d57664e9SAndroid Build Coastguard Worker " %s r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]\n"
100*d57664e9SAndroid Build Coastguard Worker " Delete specified files from Zip-compatible archive.\n\n",
101*d57664e9SAndroid Build Coastguard Worker gProgName);
102*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
103*d57664e9SAndroid Build Coastguard Worker " %s a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]\n"
104*d57664e9SAndroid Build Coastguard Worker " Add specified files to Zip-compatible archive.\n\n", gProgName);
105*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
106*d57664e9SAndroid Build Coastguard Worker " %s c[runch] [-v] -S resource-sources ... -C output-folder ...\n"
107*d57664e9SAndroid Build Coastguard Worker " Do PNG preprocessing on one or several resource folders\n"
108*d57664e9SAndroid Build Coastguard Worker " and store the results in the output folder.\n\n", gProgName);
109*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
110*d57664e9SAndroid Build Coastguard Worker " %s s[ingleCrunch] [-v] -i input-file -o outputfile\n"
111*d57664e9SAndroid Build Coastguard Worker " Do PNG preprocessing on a single file.\n\n", gProgName);
112*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
113*d57664e9SAndroid Build Coastguard Worker " %s v[ersion]\n"
114*d57664e9SAndroid Build Coastguard Worker " Print program version.\n\n", gProgName);
115*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,
116*d57664e9SAndroid Build Coastguard Worker " Modifiers:\n"
117*d57664e9SAndroid Build Coastguard Worker " -a print Android-specific data (resources, manifest) when listing\n"
118*d57664e9SAndroid Build Coastguard Worker " -c specify which configurations to include. The default is all\n"
119*d57664e9SAndroid Build Coastguard Worker " configurations. The value of the parameter should be a comma\n"
120*d57664e9SAndroid Build Coastguard Worker " separated list of configuration values. Locales should be specified\n"
121*d57664e9SAndroid Build Coastguard Worker " as either a language or language-region pair. Some examples:\n"
122*d57664e9SAndroid Build Coastguard Worker " en\n"
123*d57664e9SAndroid Build Coastguard Worker " port,en\n"
124*d57664e9SAndroid Build Coastguard Worker " port,land,en_US\n"
125*d57664e9SAndroid Build Coastguard Worker " -d one or more device assets to include, separated by commas\n"
126*d57664e9SAndroid Build Coastguard Worker " -f force overwrite of existing files\n"
127*d57664e9SAndroid Build Coastguard Worker " -g specify a pixel tolerance to force images to grayscale, default 0\n"
128*d57664e9SAndroid Build Coastguard Worker " -j specify a jar or zip file containing classes to include\n"
129*d57664e9SAndroid Build Coastguard Worker " -k junk path of file(s) added\n"
130*d57664e9SAndroid Build Coastguard Worker " -m make package directories under location specified by -J\n"
131*d57664e9SAndroid Build Coastguard Worker " -u update existing packages (add new, replace older, remove deleted files)\n"
132*d57664e9SAndroid Build Coastguard Worker " -v verbose output\n"
133*d57664e9SAndroid Build Coastguard Worker " -x create extending (non-application) resource IDs\n"
134*d57664e9SAndroid Build Coastguard Worker " -z require localization of resource attributes marked with\n"
135*d57664e9SAndroid Build Coastguard Worker " localization=\"suggested\"\n"
136*d57664e9SAndroid Build Coastguard Worker " -A additional directory in which to find raw asset files\n"
137*d57664e9SAndroid Build Coastguard Worker " -G A file to output proguard options into.\n"
138*d57664e9SAndroid Build Coastguard Worker " -D A file to output proguard options for the main dex into.\n"
139*d57664e9SAndroid Build Coastguard Worker " -F specify the apk file to output\n"
140*d57664e9SAndroid Build Coastguard Worker " -I add an existing package to base include set\n"
141*d57664e9SAndroid Build Coastguard Worker " -J specify where to output R.java resource constant definitions\n"
142*d57664e9SAndroid Build Coastguard Worker " -M specify full path to AndroidManifest.xml to include in zip\n"
143*d57664e9SAndroid Build Coastguard Worker " -P specify where to output public resource definitions\n"
144*d57664e9SAndroid Build Coastguard Worker " -S directory in which to find resources. Multiple directories will be scanned\n"
145*d57664e9SAndroid Build Coastguard Worker " and the first match found (left to right) will take precedence.\n"
146*d57664e9SAndroid Build Coastguard Worker " -0 specifies an additional extension for which such files will not\n"
147*d57664e9SAndroid Build Coastguard Worker " be stored compressed in the .apk. An empty string means to not\n"
148*d57664e9SAndroid Build Coastguard Worker " compress any files at all.\n"
149*d57664e9SAndroid Build Coastguard Worker " --debug-mode\n"
150*d57664e9SAndroid Build Coastguard Worker " inserts android:debuggable=\"true\" in to the application node of the\n"
151*d57664e9SAndroid Build Coastguard Worker " manifest, making the application debuggable even on production devices.\n"
152*d57664e9SAndroid Build Coastguard Worker " --include-meta-data\n"
153*d57664e9SAndroid Build Coastguard Worker " when used with \"dump badging\" also includes meta-data tags.\n"
154*d57664e9SAndroid Build Coastguard Worker " --pseudo-localize\n"
155*d57664e9SAndroid Build Coastguard Worker " generate resources for pseudo-locales (en-XA and ar-XB).\n"
156*d57664e9SAndroid Build Coastguard Worker " --min-sdk-version\n"
157*d57664e9SAndroid Build Coastguard Worker " inserts android:minSdkVersion in to manifest. If the version is 7 or\n"
158*d57664e9SAndroid Build Coastguard Worker " higher, the default encoding for resources will be in UTF-8.\n"
159*d57664e9SAndroid Build Coastguard Worker " --target-sdk-version\n"
160*d57664e9SAndroid Build Coastguard Worker " inserts android:targetSdkVersion in to manifest.\n"
161*d57664e9SAndroid Build Coastguard Worker " --max-res-version\n"
162*d57664e9SAndroid Build Coastguard Worker " ignores versioned resource directories above the given value.\n"
163*d57664e9SAndroid Build Coastguard Worker " --values\n"
164*d57664e9SAndroid Build Coastguard Worker " when used with \"dump resources\" also includes resource values.\n"
165*d57664e9SAndroid Build Coastguard Worker " --version-code\n"
166*d57664e9SAndroid Build Coastguard Worker " inserts android:versionCode in to manifest.\n"
167*d57664e9SAndroid Build Coastguard Worker " --version-name\n"
168*d57664e9SAndroid Build Coastguard Worker " inserts android:versionName in to manifest.\n"
169*d57664e9SAndroid Build Coastguard Worker " --replace-version\n"
170*d57664e9SAndroid Build Coastguard Worker " If --version-code and/or --version-name are specified, these\n"
171*d57664e9SAndroid Build Coastguard Worker " values will replace any value already in the manifest. By\n"
172*d57664e9SAndroid Build Coastguard Worker " default, nothing is changed if the manifest already defines\n"
173*d57664e9SAndroid Build Coastguard Worker " these attributes.\n"
174*d57664e9SAndroid Build Coastguard Worker " --custom-package\n"
175*d57664e9SAndroid Build Coastguard Worker " generates R.java into a different package.\n"
176*d57664e9SAndroid Build Coastguard Worker " --extra-packages\n"
177*d57664e9SAndroid Build Coastguard Worker " generate R.java for libraries. Separate libraries with ':'.\n"
178*d57664e9SAndroid Build Coastguard Worker " --generate-dependencies\n"
179*d57664e9SAndroid Build Coastguard Worker " generate dependency files in the same directories for R.java and resource package\n"
180*d57664e9SAndroid Build Coastguard Worker " --auto-add-overlay\n"
181*d57664e9SAndroid Build Coastguard Worker " Automatically add resources that are only in overlays.\n"
182*d57664e9SAndroid Build Coastguard Worker " --preferred-density\n"
183*d57664e9SAndroid Build Coastguard Worker " Specifies a preference for a particular density. Resources that do not\n"
184*d57664e9SAndroid Build Coastguard Worker " match this density and have variants that are a closer match are removed.\n"
185*d57664e9SAndroid Build Coastguard Worker " --split\n"
186*d57664e9SAndroid Build Coastguard Worker " Builds a separate split APK for the configurations listed. This can\n"
187*d57664e9SAndroid Build Coastguard Worker " be loaded alongside the base APK at runtime.\n"
188*d57664e9SAndroid Build Coastguard Worker " --feature-of\n"
189*d57664e9SAndroid Build Coastguard Worker " Builds a split APK that is a feature of the apk specified here. Resources\n"
190*d57664e9SAndroid Build Coastguard Worker " in the base APK can be referenced from the feature APK.\n"
191*d57664e9SAndroid Build Coastguard Worker " --feature-after\n"
192*d57664e9SAndroid Build Coastguard Worker " An app can have multiple Feature Split APKs which must be totally ordered.\n"
193*d57664e9SAndroid Build Coastguard Worker " If --feature-of is specified, this flag specifies which Feature Split APK\n"
194*d57664e9SAndroid Build Coastguard Worker " comes before this one. The first Feature Split APK should not define\n"
195*d57664e9SAndroid Build Coastguard Worker " anything here.\n"
196*d57664e9SAndroid Build Coastguard Worker " --rename-manifest-package\n"
197*d57664e9SAndroid Build Coastguard Worker " Rewrite the manifest so that its package name is the package name\n"
198*d57664e9SAndroid Build Coastguard Worker " given here. Relative class names (for example .Foo) will be\n"
199*d57664e9SAndroid Build Coastguard Worker " changed to absolute names with the old package so that the code\n"
200*d57664e9SAndroid Build Coastguard Worker " does not need to change.\n"
201*d57664e9SAndroid Build Coastguard Worker " --rename-instrumentation-target-package\n"
202*d57664e9SAndroid Build Coastguard Worker " Rewrite the manifest so that all of its instrumentation\n"
203*d57664e9SAndroid Build Coastguard Worker " components target the given package. Useful when used in\n"
204*d57664e9SAndroid Build Coastguard Worker " conjunction with --rename-manifest-package to fix tests against\n"
205*d57664e9SAndroid Build Coastguard Worker " a package that has been renamed.\n"
206*d57664e9SAndroid Build Coastguard Worker " --product\n"
207*d57664e9SAndroid Build Coastguard Worker " Specifies which variant to choose for strings that have\n"
208*d57664e9SAndroid Build Coastguard Worker " product variants\n"
209*d57664e9SAndroid Build Coastguard Worker " --utf16\n"
210*d57664e9SAndroid Build Coastguard Worker " changes default encoding for resources to UTF-16. Only useful when API\n"
211*d57664e9SAndroid Build Coastguard Worker " level is set to 7 or higher where the default encoding is UTF-8.\n"
212*d57664e9SAndroid Build Coastguard Worker " --non-constant-id\n"
213*d57664e9SAndroid Build Coastguard Worker " Make the resources ID non constant. This is required to make an R java class\n"
214*d57664e9SAndroid Build Coastguard Worker " that does not contain the final value but is used to make reusable compiled\n"
215*d57664e9SAndroid Build Coastguard Worker " libraries that need to access resources.\n"
216*d57664e9SAndroid Build Coastguard Worker " --shared-lib\n"
217*d57664e9SAndroid Build Coastguard Worker " Make a shared library resource package that can be loaded by an application\n"
218*d57664e9SAndroid Build Coastguard Worker " at runtime to access the libraries resources. Implies --non-constant-id.\n"
219*d57664e9SAndroid Build Coastguard Worker " --app-as-shared-lib\n"
220*d57664e9SAndroid Build Coastguard Worker " Make an app resource package that also can be loaded as shared library at runtime.\n"
221*d57664e9SAndroid Build Coastguard Worker " Implies --non-constant-id.\n"
222*d57664e9SAndroid Build Coastguard Worker " --error-on-failed-insert\n"
223*d57664e9SAndroid Build Coastguard Worker " Forces aapt to return an error if it fails to insert values into the manifest\n"
224*d57664e9SAndroid Build Coastguard Worker " with --debug-mode, --min-sdk-version, --target-sdk-version --version-code\n"
225*d57664e9SAndroid Build Coastguard Worker " and --version-name.\n"
226*d57664e9SAndroid Build Coastguard Worker " Insertion typically fails if the manifest already defines the attribute.\n"
227*d57664e9SAndroid Build Coastguard Worker " --error-on-missing-config-entry\n"
228*d57664e9SAndroid Build Coastguard Worker " Forces aapt to return an error if it fails to find an entry for a configuration.\n"
229*d57664e9SAndroid Build Coastguard Worker " --output-text-symbols\n"
230*d57664e9SAndroid Build Coastguard Worker " Generates a text file containing the resource symbols of the R class in the\n"
231*d57664e9SAndroid Build Coastguard Worker " specified folder.\n"
232*d57664e9SAndroid Build Coastguard Worker " --ignore-assets\n"
233*d57664e9SAndroid Build Coastguard Worker " Assets to be ignored. Default pattern is:\n"
234*d57664e9SAndroid Build Coastguard Worker " %s\n"
235*d57664e9SAndroid Build Coastguard Worker " --skip-symbols-without-default-localization\n"
236*d57664e9SAndroid Build Coastguard Worker " Prevents symbols from being generated for strings that do not have a default\n"
237*d57664e9SAndroid Build Coastguard Worker " localization\n"
238*d57664e9SAndroid Build Coastguard Worker " --no-version-vectors\n"
239*d57664e9SAndroid Build Coastguard Worker " Do not automatically generate versioned copies of vector XML resources.\n"
240*d57664e9SAndroid Build Coastguard Worker " --no-version-transitions\n"
241*d57664e9SAndroid Build Coastguard Worker " Do not automatically generate versioned copies of transition XML resources.\n"
242*d57664e9SAndroid Build Coastguard Worker " --private-symbols\n"
243*d57664e9SAndroid Build Coastguard Worker " Java package name to use when generating R.java for private resources.\n",
244*d57664e9SAndroid Build Coastguard Worker gDefaultIgnoreAssets);
245*d57664e9SAndroid Build Coastguard Worker }
246*d57664e9SAndroid Build Coastguard Worker
247*d57664e9SAndroid Build Coastguard Worker /*
248*d57664e9SAndroid Build Coastguard Worker * Dispatch the command.
249*d57664e9SAndroid Build Coastguard Worker */
handleCommand(Bundle * bundle)250*d57664e9SAndroid Build Coastguard Worker int handleCommand(Bundle* bundle)
251*d57664e9SAndroid Build Coastguard Worker {
252*d57664e9SAndroid Build Coastguard Worker //printf("--- command %d (verbose=%d force=%d):\n",
253*d57664e9SAndroid Build Coastguard Worker // bundle->getCommand(), bundle->getVerbose(), bundle->getForce());
254*d57664e9SAndroid Build Coastguard Worker //for (int i = 0; i < bundle->getFileSpecCount(); i++)
255*d57664e9SAndroid Build Coastguard Worker // printf(" %d: '%s'\n", i, bundle->getFileSpecEntry(i));
256*d57664e9SAndroid Build Coastguard Worker
257*d57664e9SAndroid Build Coastguard Worker switch (bundle->getCommand()) {
258*d57664e9SAndroid Build Coastguard Worker case kCommandVersion: return doVersion(bundle);
259*d57664e9SAndroid Build Coastguard Worker case kCommandList: return doList(bundle);
260*d57664e9SAndroid Build Coastguard Worker case kCommandDump: return doDump(bundle);
261*d57664e9SAndroid Build Coastguard Worker case kCommandAdd: return doAdd(bundle);
262*d57664e9SAndroid Build Coastguard Worker case kCommandRemove: return doRemove(bundle);
263*d57664e9SAndroid Build Coastguard Worker case kCommandPackage: return doPackage(bundle);
264*d57664e9SAndroid Build Coastguard Worker case kCommandCrunch: return doCrunch(bundle);
265*d57664e9SAndroid Build Coastguard Worker case kCommandSingleCrunch: return doSingleCrunch(bundle);
266*d57664e9SAndroid Build Coastguard Worker case kCommandDaemon: return runInDaemonMode(bundle);
267*d57664e9SAndroid Build Coastguard Worker default:
268*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "%s: requested command not yet supported\n", gProgName);
269*d57664e9SAndroid Build Coastguard Worker return 1;
270*d57664e9SAndroid Build Coastguard Worker }
271*d57664e9SAndroid Build Coastguard Worker }
272*d57664e9SAndroid Build Coastguard Worker
273*d57664e9SAndroid Build Coastguard Worker /*
274*d57664e9SAndroid Build Coastguard Worker * Parse args.
275*d57664e9SAndroid Build Coastguard Worker */
main(int argc,char * const argv[])276*d57664e9SAndroid Build Coastguard Worker int main(int argc, char* const argv[])
277*d57664e9SAndroid Build Coastguard Worker {
278*d57664e9SAndroid Build Coastguard Worker char *prog = argv[0];
279*d57664e9SAndroid Build Coastguard Worker Bundle bundle;
280*d57664e9SAndroid Build Coastguard Worker bool wantUsage = false;
281*d57664e9SAndroid Build Coastguard Worker int result = 1; // pessimistically assume an error.
282*d57664e9SAndroid Build Coastguard Worker int tolerance = 0;
283*d57664e9SAndroid Build Coastguard Worker
284*d57664e9SAndroid Build Coastguard Worker /* default to compression */
285*d57664e9SAndroid Build Coastguard Worker bundle.setCompressionMethod(ZipEntry::kCompressDeflated);
286*d57664e9SAndroid Build Coastguard Worker
287*d57664e9SAndroid Build Coastguard Worker if (argc < 2) {
288*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
289*d57664e9SAndroid Build Coastguard Worker goto bail;
290*d57664e9SAndroid Build Coastguard Worker }
291*d57664e9SAndroid Build Coastguard Worker
292*d57664e9SAndroid Build Coastguard Worker if (argv[1][0] == 'v')
293*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandVersion);
294*d57664e9SAndroid Build Coastguard Worker else if (argv[1][0] == 'd')
295*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandDump);
296*d57664e9SAndroid Build Coastguard Worker else if (argv[1][0] == 'l')
297*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandList);
298*d57664e9SAndroid Build Coastguard Worker else if (argv[1][0] == 'a')
299*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandAdd);
300*d57664e9SAndroid Build Coastguard Worker else if (argv[1][0] == 'r')
301*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandRemove);
302*d57664e9SAndroid Build Coastguard Worker else if (argv[1][0] == 'p')
303*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandPackage);
304*d57664e9SAndroid Build Coastguard Worker else if (argv[1][0] == 'c')
305*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandCrunch);
306*d57664e9SAndroid Build Coastguard Worker else if (argv[1][0] == 's')
307*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandSingleCrunch);
308*d57664e9SAndroid Build Coastguard Worker else if (argv[1][0] == 'm')
309*d57664e9SAndroid Build Coastguard Worker bundle.setCommand(kCommandDaemon);
310*d57664e9SAndroid Build Coastguard Worker else {
311*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: Unknown command '%s'\n", argv[1]);
312*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
313*d57664e9SAndroid Build Coastguard Worker goto bail;
314*d57664e9SAndroid Build Coastguard Worker }
315*d57664e9SAndroid Build Coastguard Worker argc -= 2;
316*d57664e9SAndroid Build Coastguard Worker argv += 2;
317*d57664e9SAndroid Build Coastguard Worker
318*d57664e9SAndroid Build Coastguard Worker /*
319*d57664e9SAndroid Build Coastguard Worker * Pull out flags. We support "-fv" and "-f -v".
320*d57664e9SAndroid Build Coastguard Worker */
321*d57664e9SAndroid Build Coastguard Worker while (argc && argv[0][0] == '-') {
322*d57664e9SAndroid Build Coastguard Worker /* flag(s) found */
323*d57664e9SAndroid Build Coastguard Worker const char* cp = argv[0] +1;
324*d57664e9SAndroid Build Coastguard Worker
325*d57664e9SAndroid Build Coastguard Worker while (*cp != '\0') {
326*d57664e9SAndroid Build Coastguard Worker switch (*cp) {
327*d57664e9SAndroid Build Coastguard Worker case 'v':
328*d57664e9SAndroid Build Coastguard Worker bundle.setVerbose(true);
329*d57664e9SAndroid Build Coastguard Worker break;
330*d57664e9SAndroid Build Coastguard Worker case 'a':
331*d57664e9SAndroid Build Coastguard Worker bundle.setAndroidList(true);
332*d57664e9SAndroid Build Coastguard Worker break;
333*d57664e9SAndroid Build Coastguard Worker case 'c':
334*d57664e9SAndroid Build Coastguard Worker argc--;
335*d57664e9SAndroid Build Coastguard Worker argv++;
336*d57664e9SAndroid Build Coastguard Worker if (!argc) {
337*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-c' option\n");
338*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
339*d57664e9SAndroid Build Coastguard Worker goto bail;
340*d57664e9SAndroid Build Coastguard Worker }
341*d57664e9SAndroid Build Coastguard Worker bundle.addConfigurations(argv[0]);
342*d57664e9SAndroid Build Coastguard Worker break;
343*d57664e9SAndroid Build Coastguard Worker case 'f':
344*d57664e9SAndroid Build Coastguard Worker bundle.setForce(true);
345*d57664e9SAndroid Build Coastguard Worker break;
346*d57664e9SAndroid Build Coastguard Worker case 'g':
347*d57664e9SAndroid Build Coastguard Worker argc--;
348*d57664e9SAndroid Build Coastguard Worker argv++;
349*d57664e9SAndroid Build Coastguard Worker if (!argc) {
350*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-g' option\n");
351*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
352*d57664e9SAndroid Build Coastguard Worker goto bail;
353*d57664e9SAndroid Build Coastguard Worker }
354*d57664e9SAndroid Build Coastguard Worker tolerance = atoi(argv[0]);
355*d57664e9SAndroid Build Coastguard Worker bundle.setGrayscaleTolerance(tolerance);
356*d57664e9SAndroid Build Coastguard Worker printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog, tolerance);
357*d57664e9SAndroid Build Coastguard Worker break;
358*d57664e9SAndroid Build Coastguard Worker case 'k':
359*d57664e9SAndroid Build Coastguard Worker bundle.setJunkPath(true);
360*d57664e9SAndroid Build Coastguard Worker break;
361*d57664e9SAndroid Build Coastguard Worker case 'm':
362*d57664e9SAndroid Build Coastguard Worker bundle.setMakePackageDirs(true);
363*d57664e9SAndroid Build Coastguard Worker break;
364*d57664e9SAndroid Build Coastguard Worker #if 0
365*d57664e9SAndroid Build Coastguard Worker case 'p':
366*d57664e9SAndroid Build Coastguard Worker bundle.setPseudolocalize(true);
367*d57664e9SAndroid Build Coastguard Worker break;
368*d57664e9SAndroid Build Coastguard Worker #endif
369*d57664e9SAndroid Build Coastguard Worker case 'u':
370*d57664e9SAndroid Build Coastguard Worker bundle.setUpdate(true);
371*d57664e9SAndroid Build Coastguard Worker break;
372*d57664e9SAndroid Build Coastguard Worker case 'x':
373*d57664e9SAndroid Build Coastguard Worker bundle.setExtending(true);
374*d57664e9SAndroid Build Coastguard Worker break;
375*d57664e9SAndroid Build Coastguard Worker case 'z':
376*d57664e9SAndroid Build Coastguard Worker bundle.setRequireLocalization(true);
377*d57664e9SAndroid Build Coastguard Worker break;
378*d57664e9SAndroid Build Coastguard Worker case 'j':
379*d57664e9SAndroid Build Coastguard Worker argc--;
380*d57664e9SAndroid Build Coastguard Worker argv++;
381*d57664e9SAndroid Build Coastguard Worker if (!argc) {
382*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-j' option\n");
383*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
384*d57664e9SAndroid Build Coastguard Worker goto bail;
385*d57664e9SAndroid Build Coastguard Worker }
386*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
387*d57664e9SAndroid Build Coastguard Worker bundle.addJarFile(argv[0]);
388*d57664e9SAndroid Build Coastguard Worker break;
389*d57664e9SAndroid Build Coastguard Worker case 'A':
390*d57664e9SAndroid Build Coastguard Worker argc--;
391*d57664e9SAndroid Build Coastguard Worker argv++;
392*d57664e9SAndroid Build Coastguard Worker if (!argc) {
393*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-A' option\n");
394*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
395*d57664e9SAndroid Build Coastguard Worker goto bail;
396*d57664e9SAndroid Build Coastguard Worker }
397*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
398*d57664e9SAndroid Build Coastguard Worker bundle.addAssetSourceDir(argv[0]);
399*d57664e9SAndroid Build Coastguard Worker break;
400*d57664e9SAndroid Build Coastguard Worker case 'G':
401*d57664e9SAndroid Build Coastguard Worker argc--;
402*d57664e9SAndroid Build Coastguard Worker argv++;
403*d57664e9SAndroid Build Coastguard Worker if (!argc) {
404*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-G' option\n");
405*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
406*d57664e9SAndroid Build Coastguard Worker goto bail;
407*d57664e9SAndroid Build Coastguard Worker }
408*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
409*d57664e9SAndroid Build Coastguard Worker bundle.setProguardFile(argv[0]);
410*d57664e9SAndroid Build Coastguard Worker break;
411*d57664e9SAndroid Build Coastguard Worker case 'D':
412*d57664e9SAndroid Build Coastguard Worker argc--;
413*d57664e9SAndroid Build Coastguard Worker argv++;
414*d57664e9SAndroid Build Coastguard Worker if (!argc) {
415*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-D' option\n");
416*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
417*d57664e9SAndroid Build Coastguard Worker goto bail;
418*d57664e9SAndroid Build Coastguard Worker }
419*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
420*d57664e9SAndroid Build Coastguard Worker bundle.setMainDexProguardFile(argv[0]);
421*d57664e9SAndroid Build Coastguard Worker break;
422*d57664e9SAndroid Build Coastguard Worker case 'I':
423*d57664e9SAndroid Build Coastguard Worker argc--;
424*d57664e9SAndroid Build Coastguard Worker argv++;
425*d57664e9SAndroid Build Coastguard Worker if (!argc) {
426*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-I' option\n");
427*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
428*d57664e9SAndroid Build Coastguard Worker goto bail;
429*d57664e9SAndroid Build Coastguard Worker }
430*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
431*d57664e9SAndroid Build Coastguard Worker bundle.addPackageInclude(argv[0]);
432*d57664e9SAndroid Build Coastguard Worker break;
433*d57664e9SAndroid Build Coastguard Worker case 'F':
434*d57664e9SAndroid Build Coastguard Worker argc--;
435*d57664e9SAndroid Build Coastguard Worker argv++;
436*d57664e9SAndroid Build Coastguard Worker if (!argc) {
437*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-F' option\n");
438*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
439*d57664e9SAndroid Build Coastguard Worker goto bail;
440*d57664e9SAndroid Build Coastguard Worker }
441*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
442*d57664e9SAndroid Build Coastguard Worker bundle.setOutputAPKFile(argv[0]);
443*d57664e9SAndroid Build Coastguard Worker break;
444*d57664e9SAndroid Build Coastguard Worker case 'J':
445*d57664e9SAndroid Build Coastguard Worker argc--;
446*d57664e9SAndroid Build Coastguard Worker argv++;
447*d57664e9SAndroid Build Coastguard Worker if (!argc) {
448*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-J' option\n");
449*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
450*d57664e9SAndroid Build Coastguard Worker goto bail;
451*d57664e9SAndroid Build Coastguard Worker }
452*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
453*d57664e9SAndroid Build Coastguard Worker bundle.setRClassDir(argv[0]);
454*d57664e9SAndroid Build Coastguard Worker break;
455*d57664e9SAndroid Build Coastguard Worker case 'M':
456*d57664e9SAndroid Build Coastguard Worker argc--;
457*d57664e9SAndroid Build Coastguard Worker argv++;
458*d57664e9SAndroid Build Coastguard Worker if (!argc) {
459*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-M' option\n");
460*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
461*d57664e9SAndroid Build Coastguard Worker goto bail;
462*d57664e9SAndroid Build Coastguard Worker }
463*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
464*d57664e9SAndroid Build Coastguard Worker bundle.setAndroidManifestFile(argv[0]);
465*d57664e9SAndroid Build Coastguard Worker break;
466*d57664e9SAndroid Build Coastguard Worker case 'P':
467*d57664e9SAndroid Build Coastguard Worker argc--;
468*d57664e9SAndroid Build Coastguard Worker argv++;
469*d57664e9SAndroid Build Coastguard Worker if (!argc) {
470*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-P' option\n");
471*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
472*d57664e9SAndroid Build Coastguard Worker goto bail;
473*d57664e9SAndroid Build Coastguard Worker }
474*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
475*d57664e9SAndroid Build Coastguard Worker bundle.setPublicOutputFile(argv[0]);
476*d57664e9SAndroid Build Coastguard Worker break;
477*d57664e9SAndroid Build Coastguard Worker case 'S':
478*d57664e9SAndroid Build Coastguard Worker argc--;
479*d57664e9SAndroid Build Coastguard Worker argv++;
480*d57664e9SAndroid Build Coastguard Worker if (!argc) {
481*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-S' option\n");
482*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
483*d57664e9SAndroid Build Coastguard Worker goto bail;
484*d57664e9SAndroid Build Coastguard Worker }
485*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
486*d57664e9SAndroid Build Coastguard Worker bundle.addResourceSourceDir(argv[0]);
487*d57664e9SAndroid Build Coastguard Worker break;
488*d57664e9SAndroid Build Coastguard Worker case 'C':
489*d57664e9SAndroid Build Coastguard Worker argc--;
490*d57664e9SAndroid Build Coastguard Worker argv++;
491*d57664e9SAndroid Build Coastguard Worker if (!argc) {
492*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-C' option\n");
493*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
494*d57664e9SAndroid Build Coastguard Worker goto bail;
495*d57664e9SAndroid Build Coastguard Worker }
496*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
497*d57664e9SAndroid Build Coastguard Worker bundle.setCrunchedOutputDir(argv[0]);
498*d57664e9SAndroid Build Coastguard Worker break;
499*d57664e9SAndroid Build Coastguard Worker case 'i':
500*d57664e9SAndroid Build Coastguard Worker argc--;
501*d57664e9SAndroid Build Coastguard Worker argv++;
502*d57664e9SAndroid Build Coastguard Worker if (!argc) {
503*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-i' option\n");
504*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
505*d57664e9SAndroid Build Coastguard Worker goto bail;
506*d57664e9SAndroid Build Coastguard Worker }
507*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
508*d57664e9SAndroid Build Coastguard Worker bundle.setSingleCrunchInputFile(argv[0]);
509*d57664e9SAndroid Build Coastguard Worker break;
510*d57664e9SAndroid Build Coastguard Worker case 'o':
511*d57664e9SAndroid Build Coastguard Worker argc--;
512*d57664e9SAndroid Build Coastguard Worker argv++;
513*d57664e9SAndroid Build Coastguard Worker if (!argc) {
514*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-o' option\n");
515*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
516*d57664e9SAndroid Build Coastguard Worker goto bail;
517*d57664e9SAndroid Build Coastguard Worker }
518*d57664e9SAndroid Build Coastguard Worker convertPath(argv[0]);
519*d57664e9SAndroid Build Coastguard Worker bundle.setSingleCrunchOutputFile(argv[0]);
520*d57664e9SAndroid Build Coastguard Worker break;
521*d57664e9SAndroid Build Coastguard Worker case '0':
522*d57664e9SAndroid Build Coastguard Worker argc--;
523*d57664e9SAndroid Build Coastguard Worker argv++;
524*d57664e9SAndroid Build Coastguard Worker if (!argc) {
525*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-e' option\n");
526*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
527*d57664e9SAndroid Build Coastguard Worker goto bail;
528*d57664e9SAndroid Build Coastguard Worker }
529*d57664e9SAndroid Build Coastguard Worker if (argv[0][0] != 0) {
530*d57664e9SAndroid Build Coastguard Worker bundle.addNoCompressExtension(argv[0]);
531*d57664e9SAndroid Build Coastguard Worker } else {
532*d57664e9SAndroid Build Coastguard Worker bundle.setCompressionMethod(ZipEntry::kCompressStored);
533*d57664e9SAndroid Build Coastguard Worker }
534*d57664e9SAndroid Build Coastguard Worker break;
535*d57664e9SAndroid Build Coastguard Worker case '-':
536*d57664e9SAndroid Build Coastguard Worker if (strcmp(cp, "-debug-mode") == 0) {
537*d57664e9SAndroid Build Coastguard Worker bundle.setDebugMode(true);
538*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-min-sdk-version") == 0) {
539*d57664e9SAndroid Build Coastguard Worker argc--;
540*d57664e9SAndroid Build Coastguard Worker argv++;
541*d57664e9SAndroid Build Coastguard Worker if (!argc) {
542*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--min-sdk-version' option\n");
543*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
544*d57664e9SAndroid Build Coastguard Worker goto bail;
545*d57664e9SAndroid Build Coastguard Worker }
546*d57664e9SAndroid Build Coastguard Worker bundle.setMinSdkVersion(argv[0]);
547*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-target-sdk-version") == 0) {
548*d57664e9SAndroid Build Coastguard Worker argc--;
549*d57664e9SAndroid Build Coastguard Worker argv++;
550*d57664e9SAndroid Build Coastguard Worker if (!argc) {
551*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--target-sdk-version' option\n");
552*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
553*d57664e9SAndroid Build Coastguard Worker goto bail;
554*d57664e9SAndroid Build Coastguard Worker }
555*d57664e9SAndroid Build Coastguard Worker bundle.setTargetSdkVersion(argv[0]);
556*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-max-sdk-version") == 0) {
557*d57664e9SAndroid Build Coastguard Worker argc--;
558*d57664e9SAndroid Build Coastguard Worker argv++;
559*d57664e9SAndroid Build Coastguard Worker if (!argc) {
560*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--max-sdk-version' option\n");
561*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
562*d57664e9SAndroid Build Coastguard Worker goto bail;
563*d57664e9SAndroid Build Coastguard Worker }
564*d57664e9SAndroid Build Coastguard Worker bundle.setMaxSdkVersion(argv[0]);
565*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-max-res-version") == 0) {
566*d57664e9SAndroid Build Coastguard Worker argc--;
567*d57664e9SAndroid Build Coastguard Worker argv++;
568*d57664e9SAndroid Build Coastguard Worker if (!argc) {
569*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--max-res-version' option\n");
570*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
571*d57664e9SAndroid Build Coastguard Worker goto bail;
572*d57664e9SAndroid Build Coastguard Worker }
573*d57664e9SAndroid Build Coastguard Worker bundle.setMaxResVersion(argv[0]);
574*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-version-code") == 0) {
575*d57664e9SAndroid Build Coastguard Worker argc--;
576*d57664e9SAndroid Build Coastguard Worker argv++;
577*d57664e9SAndroid Build Coastguard Worker if (!argc) {
578*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--version-code' option\n");
579*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
580*d57664e9SAndroid Build Coastguard Worker goto bail;
581*d57664e9SAndroid Build Coastguard Worker }
582*d57664e9SAndroid Build Coastguard Worker bundle.setVersionCode(argv[0]);
583*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-version-name") == 0) {
584*d57664e9SAndroid Build Coastguard Worker argc--;
585*d57664e9SAndroid Build Coastguard Worker argv++;
586*d57664e9SAndroid Build Coastguard Worker if (!argc) {
587*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--version-name' option\n");
588*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
589*d57664e9SAndroid Build Coastguard Worker goto bail;
590*d57664e9SAndroid Build Coastguard Worker }
591*d57664e9SAndroid Build Coastguard Worker bundle.setVersionName(argv[0]);
592*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-replace-version") == 0) {
593*d57664e9SAndroid Build Coastguard Worker bundle.setReplaceVersion(true);
594*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-values") == 0) {
595*d57664e9SAndroid Build Coastguard Worker bundle.setValues(true);
596*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-include-meta-data") == 0) {
597*d57664e9SAndroid Build Coastguard Worker bundle.setIncludeMetaData(true);
598*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-custom-package") == 0) {
599*d57664e9SAndroid Build Coastguard Worker argc--;
600*d57664e9SAndroid Build Coastguard Worker argv++;
601*d57664e9SAndroid Build Coastguard Worker if (!argc) {
602*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--custom-package' option\n");
603*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
604*d57664e9SAndroid Build Coastguard Worker goto bail;
605*d57664e9SAndroid Build Coastguard Worker }
606*d57664e9SAndroid Build Coastguard Worker bundle.setCustomPackage(argv[0]);
607*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-extra-packages") == 0) {
608*d57664e9SAndroid Build Coastguard Worker argc--;
609*d57664e9SAndroid Build Coastguard Worker argv++;
610*d57664e9SAndroid Build Coastguard Worker if (!argc) {
611*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--extra-packages' option\n");
612*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
613*d57664e9SAndroid Build Coastguard Worker goto bail;
614*d57664e9SAndroid Build Coastguard Worker }
615*d57664e9SAndroid Build Coastguard Worker bundle.setExtraPackages(argv[0]);
616*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-generate-dependencies") == 0) {
617*d57664e9SAndroid Build Coastguard Worker bundle.setGenDependencies(true);
618*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-utf16") == 0) {
619*d57664e9SAndroid Build Coastguard Worker bundle.setWantUTF16(true);
620*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-preferred-density") == 0) {
621*d57664e9SAndroid Build Coastguard Worker argc--;
622*d57664e9SAndroid Build Coastguard Worker argv++;
623*d57664e9SAndroid Build Coastguard Worker if (!argc) {
624*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--preferred-density' option\n");
625*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
626*d57664e9SAndroid Build Coastguard Worker goto bail;
627*d57664e9SAndroid Build Coastguard Worker }
628*d57664e9SAndroid Build Coastguard Worker bundle.setPreferredDensity(argv[0]);
629*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-split") == 0) {
630*d57664e9SAndroid Build Coastguard Worker argc--;
631*d57664e9SAndroid Build Coastguard Worker argv++;
632*d57664e9SAndroid Build Coastguard Worker if (!argc) {
633*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--split' option\n");
634*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
635*d57664e9SAndroid Build Coastguard Worker goto bail;
636*d57664e9SAndroid Build Coastguard Worker }
637*d57664e9SAndroid Build Coastguard Worker bundle.addSplitConfigurations(argv[0]);
638*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-feature-of") == 0) {
639*d57664e9SAndroid Build Coastguard Worker argc--;
640*d57664e9SAndroid Build Coastguard Worker argv++;
641*d57664e9SAndroid Build Coastguard Worker if (!argc) {
642*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--feature-of' option\n");
643*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
644*d57664e9SAndroid Build Coastguard Worker goto bail;
645*d57664e9SAndroid Build Coastguard Worker }
646*d57664e9SAndroid Build Coastguard Worker bundle.setFeatureOfPackage(argv[0]);
647*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-feature-after") == 0) {
648*d57664e9SAndroid Build Coastguard Worker argc--;
649*d57664e9SAndroid Build Coastguard Worker argv++;
650*d57664e9SAndroid Build Coastguard Worker if (!argc) {
651*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--feature-after' option\n");
652*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
653*d57664e9SAndroid Build Coastguard Worker goto bail;
654*d57664e9SAndroid Build Coastguard Worker }
655*d57664e9SAndroid Build Coastguard Worker bundle.setFeatureAfterPackage(argv[0]);
656*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-rename-manifest-package") == 0) {
657*d57664e9SAndroid Build Coastguard Worker argc--;
658*d57664e9SAndroid Build Coastguard Worker argv++;
659*d57664e9SAndroid Build Coastguard Worker if (!argc) {
660*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--rename-manifest-package' option\n");
661*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
662*d57664e9SAndroid Build Coastguard Worker goto bail;
663*d57664e9SAndroid Build Coastguard Worker }
664*d57664e9SAndroid Build Coastguard Worker bundle.setManifestPackageNameOverride(argv[0]);
665*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-rename-instrumentation-target-package") == 0) {
666*d57664e9SAndroid Build Coastguard Worker argc--;
667*d57664e9SAndroid Build Coastguard Worker argv++;
668*d57664e9SAndroid Build Coastguard Worker if (!argc) {
669*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--rename-instrumentation-target-package' option\n");
670*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
671*d57664e9SAndroid Build Coastguard Worker goto bail;
672*d57664e9SAndroid Build Coastguard Worker }
673*d57664e9SAndroid Build Coastguard Worker bundle.setInstrumentationPackageNameOverride(argv[0]);
674*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-auto-add-overlay") == 0) {
675*d57664e9SAndroid Build Coastguard Worker bundle.setAutoAddOverlay(true);
676*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-error-on-failed-insert") == 0) {
677*d57664e9SAndroid Build Coastguard Worker bundle.setErrorOnFailedInsert(true);
678*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-error-on-missing-config-entry") == 0) {
679*d57664e9SAndroid Build Coastguard Worker bundle.setErrorOnMissingConfigEntry(true);
680*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-output-text-symbols") == 0) {
681*d57664e9SAndroid Build Coastguard Worker argc--;
682*d57664e9SAndroid Build Coastguard Worker argv++;
683*d57664e9SAndroid Build Coastguard Worker if (!argc) {
684*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '-output-text-symbols' option\n");
685*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
686*d57664e9SAndroid Build Coastguard Worker goto bail;
687*d57664e9SAndroid Build Coastguard Worker }
688*d57664e9SAndroid Build Coastguard Worker bundle.setOutputTextSymbols(argv[0]);
689*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-product") == 0) {
690*d57664e9SAndroid Build Coastguard Worker argc--;
691*d57664e9SAndroid Build Coastguard Worker argv++;
692*d57664e9SAndroid Build Coastguard Worker if (!argc) {
693*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--product' option\n");
694*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
695*d57664e9SAndroid Build Coastguard Worker goto bail;
696*d57664e9SAndroid Build Coastguard Worker }
697*d57664e9SAndroid Build Coastguard Worker bundle.setProduct(argv[0]);
698*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-non-constant-id") == 0) {
699*d57664e9SAndroid Build Coastguard Worker bundle.setNonConstantId(true);
700*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-skip-symbols-without-default-localization") == 0) {
701*d57664e9SAndroid Build Coastguard Worker bundle.setSkipSymbolsWithoutDefaultLocalization(true);
702*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-shared-lib") == 0) {
703*d57664e9SAndroid Build Coastguard Worker bundle.setNonConstantId(true);
704*d57664e9SAndroid Build Coastguard Worker bundle.setBuildSharedLibrary(true);
705*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-app-as-shared-lib") == 0) {
706*d57664e9SAndroid Build Coastguard Worker bundle.setNonConstantId(true);
707*d57664e9SAndroid Build Coastguard Worker bundle.setBuildAppAsSharedLibrary(true);
708*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-no-crunch") == 0) {
709*d57664e9SAndroid Build Coastguard Worker bundle.setUseCrunchCache(true);
710*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-ignore-assets") == 0) {
711*d57664e9SAndroid Build Coastguard Worker argc--;
712*d57664e9SAndroid Build Coastguard Worker argv++;
713*d57664e9SAndroid Build Coastguard Worker if (!argc) {
714*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for '--ignore-assets' option\n");
715*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
716*d57664e9SAndroid Build Coastguard Worker goto bail;
717*d57664e9SAndroid Build Coastguard Worker }
718*d57664e9SAndroid Build Coastguard Worker gUserIgnoreAssets = argv[0];
719*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-pseudo-localize") == 0) {
720*d57664e9SAndroid Build Coastguard Worker bundle.setPseudolocalize(PSEUDO_ACCENTED | PSEUDO_BIDI);
721*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-no-version-vectors") == 0) {
722*d57664e9SAndroid Build Coastguard Worker bundle.setNoVersionVectors(true);
723*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-no-version-transitions") == 0) {
724*d57664e9SAndroid Build Coastguard Worker bundle.setNoVersionTransitions(true);
725*d57664e9SAndroid Build Coastguard Worker } else if (strcmp(cp, "-private-symbols") == 0) {
726*d57664e9SAndroid Build Coastguard Worker argc--;
727*d57664e9SAndroid Build Coastguard Worker argv++;
728*d57664e9SAndroid Build Coastguard Worker if (!argc) {
729*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: No argument supplied for "
730*d57664e9SAndroid Build Coastguard Worker "'--private-symbols' option\n");
731*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
732*d57664e9SAndroid Build Coastguard Worker goto bail;
733*d57664e9SAndroid Build Coastguard Worker }
734*d57664e9SAndroid Build Coastguard Worker bundle.setPrivateSymbolsPackage(String8(argv[0]));
735*d57664e9SAndroid Build Coastguard Worker } else {
736*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp);
737*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
738*d57664e9SAndroid Build Coastguard Worker goto bail;
739*d57664e9SAndroid Build Coastguard Worker }
740*d57664e9SAndroid Build Coastguard Worker cp += strlen(cp) - 1;
741*d57664e9SAndroid Build Coastguard Worker break;
742*d57664e9SAndroid Build Coastguard Worker default:
743*d57664e9SAndroid Build Coastguard Worker fprintf(stderr, "ERROR: Unknown flag '-%c'\n", *cp);
744*d57664e9SAndroid Build Coastguard Worker wantUsage = true;
745*d57664e9SAndroid Build Coastguard Worker goto bail;
746*d57664e9SAndroid Build Coastguard Worker }
747*d57664e9SAndroid Build Coastguard Worker
748*d57664e9SAndroid Build Coastguard Worker cp++;
749*d57664e9SAndroid Build Coastguard Worker }
750*d57664e9SAndroid Build Coastguard Worker argc--;
751*d57664e9SAndroid Build Coastguard Worker argv++;
752*d57664e9SAndroid Build Coastguard Worker }
753*d57664e9SAndroid Build Coastguard Worker
754*d57664e9SAndroid Build Coastguard Worker /*
755*d57664e9SAndroid Build Coastguard Worker * We're past the flags. The rest all goes straight in.
756*d57664e9SAndroid Build Coastguard Worker */
757*d57664e9SAndroid Build Coastguard Worker bundle.setFileSpec(argv, argc);
758*d57664e9SAndroid Build Coastguard Worker
759*d57664e9SAndroid Build Coastguard Worker result = handleCommand(&bundle);
760*d57664e9SAndroid Build Coastguard Worker
761*d57664e9SAndroid Build Coastguard Worker bail:
762*d57664e9SAndroid Build Coastguard Worker if (wantUsage) {
763*d57664e9SAndroid Build Coastguard Worker usage();
764*d57664e9SAndroid Build Coastguard Worker result = 2;
765*d57664e9SAndroid Build Coastguard Worker }
766*d57664e9SAndroid Build Coastguard Worker
767*d57664e9SAndroid Build Coastguard Worker //printf("--> returning %d\n", result);
768*d57664e9SAndroid Build Coastguard Worker return result;
769*d57664e9SAndroid Build Coastguard Worker }
770