1#include "android/help.h"
2#include "android/cmdline-option.h"
3#include "android/utils/path.h"
4#include "android/utils/bufprint.h"
5#include "android/utils/debug.h"
6#include "android/utils/misc.h"
7#include "android/skin/keyset.h"
8#include "android/android.h"
9#include <stdint.h>
10#include "audio/audio.h"
11#include <string.h>
12#include <stdlib.h>
13#include "android/protocol/core-commands-api.h"
14
15/* XXX: TODO: put most of the help stuff in auto-generated files */
16
17#define  PRINTF(...)  stralloc_add_format(out,__VA_ARGS__)
18
19static void
20help_virtual_device( stralloc_t*  out )
21{
22    PRINTF(
23    "  An Android Virtual Device (AVD) models a single virtual\n"
24    "  device running the Android platform that has, at least, its own\n"
25    "  kernel, system image and data partition.\n\n"
26
27    "  Only one emulator process can run a given AVD at a time, but\n"
28    "  you can create several AVDs and run them concurrently.\n\n"
29
30    "  You can invoke a given AVD at startup using either '-avd <name>'\n"
31    "  or '@<name>', both forms being equivalent. For example, to launch\n"
32    "  the AVD named 'foo', type:\n\n"
33
34    "      emulator @foo\n\n"
35
36    "  The 'android' helper tool can be used to manage virtual devices.\n"
37    "  For example:\n\n"
38
39    "    android create avd -n <name> -t 1  # creates a new virtual device.\n"
40    "    android list avd                   # list all virtual devices available.\n\n"
41
42    "  Try 'android --help' for more commands.\n\n"
43
44    "  Each AVD really corresponds to a content directory which stores\n"
45    "  persistent and writable disk images as well as configuration files.\n"
46
47    "  Each AVD must be created against an existing SDK platform or add-on.\n"
48    "  For more information on this topic, see -help-sdk-images.\n\n"
49
50    "  SPECIAL NOTE: in the case where you are *not* using the emulator\n"
51    "  with the Android SDK, but with the Android build system, you will\n"
52    "  need to define the ANDROID_PRODUCT_OUT variable in your environment.\n"
53    "  See -help-build-images for the details.\n"
54    );
55}
56
57
58static void
59help_sdk_images( stralloc_t*  out )
60{
61    PRINTF(
62    "  The Android SDK now supports multiple versions of the Android platform.\n"
63    "  Each SDK 'platform' corresponds to:\n\n"
64
65    "    - a given version of the Android API.\n"
66    "    - a set of corresponding system image files.\n"
67    "    - build and configuration properties.\n"
68    "    - an android.jar file used when building your application.\n"
69    "    - skins.\n\n"
70
71    "  The Android SDK also supports the concept of 'add-ons'. Each add-on is\n"
72    "  based on an existing platform, and provides replacement or additional\n"
73    "  image files, android.jar, hardware configuration options and/or skins.\n\n"
74
75    "  The purpose of add-ons is to allow vendors to provide their own customized\n"
76    "  system images and APIs without needing to package a complete SDK.\n\n"
77
78    "  Before using the SDK, you need to create an Android Virtual Device (AVD)\n"
79    "  (see -help-virtual-device for details). Each AVD is created in reference\n"
80    "  to a given SDK platform *or* add-on, and will search the corresponding\n"
81    "  directories for system image files, in the following order:\n\n"
82
83    "    - in the AVD's content directory.\n"
84    "    - in the AVD's SDK add-on directory, if any.\n"
85    "    - in the AVD's SDK platform directory, if any.\n\n"
86
87    "  The image files are documented in -help-disk-images. By default, an AVD\n"
88    "  content directory will contain the following persistent image files:\n\n"
89
90    "     userdata-qemu.img     - the /data partition image file\n"
91    "     cache.img             - the /cache partition image file\n\n"
92
93    "  You can use -wipe-data to re-initialize the /data partition to its factory\n"
94    "  defaults. This will erase all user settings for the virtual device.\n\n"
95    );
96}
97
98static void
99help_build_images( stralloc_t*  out )
100{
101    PRINTF(
102    "  The emulator detects that you are working from the Android build system\n"
103    "  by looking at the ANDROID_PRODUCT_OUT variable in your environment.\n\n"
104
105    "  If it is defined, it should point to the product-specific directory that\n"
106    "  contains the generated system images.\n"
107
108    "  In this case, the emulator will look by default for the following image\n"
109    "  files there:\n\n"
110
111    "    - system.img   : the *initial* system image.\n"
112    "    - ramdisk.img  : the ramdisk image used to boot the system.\n"
113    "    - userdata.img : the *initial* user data image (see below).\n"
114    "    - kernel-qemu  : the emulator-specific Linux kernel image.\n\n"
115
116    "  If the kernel image is not found in the out directory, then it is searched\n"
117    "  in <build-root>/prebuilts/qemu-kernel/.\n\n"
118
119    "  Skins will be looked in <build-root>/development/tools/emulator/skins/\n\n"
120
121    "  You can use the -sysdir, -system, -kernel, -ramdisk, -datadir, -data options\n"
122    "  to specify different search directories or specific image files. You can\n"
123    "  also use the -cache and -sdcard options to indicate specific cache partition\n"
124    "  and SD Card image files.\n\n"
125
126    "  For more details, see the corresponding -help-<option> section.\n\n"
127
128    "  Note that the following behaviour is specific to 'build mode':\n\n"
129
130    "  - the *initial* system image is copied to a temporary file which is\n"
131    "    automatically removed when the emulator exits. There is thus no way to\n"
132    "    make persistent changes to this image through the emulator, even if\n"
133    "    you use the '-image <file>' option.\n\n"
134
135    "  - unless you use the '-cache <file>' option, the cache partition image\n"
136    "    is backed by a temporary file that is initially empty and destroyed on\n"
137    "    program exit.\n\n"
138
139    "  SPECIAL NOTE: If you are using the emulator with the Android SDK, the\n"
140    "  information above doesn't apply. See -help-sdk-images for more details.\n"
141    );
142}
143
144static void
145help_disk_images( stralloc_t*  out )
146{
147    char  datadir[256];
148
149    bufprint_config_path( datadir, datadir + sizeof(datadir) );
150
151    PRINTF(
152    "  The emulator needs several key image files to run appropriately.\n"
153    "  Their exact location depends on whether you're using the emulator\n"
154    "  from the Android SDK, or not (more details below).\n\n"
155
156    "  The minimal required image files are the following:\n\n"
157
158    "    kernel-qemu      the emulator-specific Linux kernel image\n"
159    "    ramdisk.img      the ramdisk image used to boot the system\n"
160    "    system.img       the *initial* system image\n"
161    "    userdata.img     the *initial* data partition image\n\n"
162
163    "  It will also use the following writable image files:\n\n"
164
165    "    userdata-qemu.img  the persistent data partition image\n"
166    "    system-qemu.img    an *optional* persistent system image\n"
167    "    cache.img          an *optional* cache partition image\n"
168    "    sdcard.img         an *optional* SD Card partition image\n\n"
169    "    snapshots.img      an *optional* state snapshots image\n\n"
170
171    "  If you use a virtual device, its content directory should store\n"
172    "  all writable images, and read-only ones will be found from the\n"
173    "  corresponding platform/add-on directories. See -help-sdk-images\n"
174    "  for more details.\n\n"
175
176    "  If you are building from the Android build system, you should\n"
177    "  have ANDROID_PRODUCT_OUT defined in your environment, and the\n"
178    "  emulator shall be able to pick-up the right image files automatically.\n"
179    "  See -help-build-images for more details.\n\n"
180
181    "  If you're neither using the SDK or the Android build system, you\n"
182    "  can still run the emulator by explicitely providing the paths to\n"
183    "  *all* required disk images through a combination of the following\n"
184    "  options: -sysdir, -datadir, -kernel, -ramdisk, -system, -data, -cache\n"
185    "  -sdcard and -snapstorage.\n\n"
186
187    "  The actual logic being that the emulator should be able to find all\n"
188    "  images from the options you give it.\n\n"
189
190    "  For more detail, see the corresponding -help-<option> entry.\n\n"
191
192    "  Other related options are:\n\n"
193
194    "      -init-data       Specify an alternative *initial* user data image\n\n"
195
196    "      -wipe-data       Copy the content of the *initial* user data image\n"
197"                           (userdata.img) into the writable one (userdata-qemu.img)\n\n"
198
199    "      -no-cache        do not use a cache partition, even if one is\n"
200    "                       available.\n\n"
201
202    "      -no-snapstorage  do not use a state snapshot image, even if one is\n"
203    "                       available.\n\n"
204    ,
205    datadir );
206}
207
208static void
209help_keys(stralloc_t*  out)
210{
211    int  pass, maxw = 0;
212
213    stralloc_add_str( out, "  When running the emulator, use the following keypresses:\n\n");
214
215    if (!android_keyset)
216        android_keyset = skin_keyset_new_from_text( skin_keyset_get_default() );
217
218    for (pass = 0; pass < 2; pass++) {
219        SkinKeyCommand  cmd;
220
221        for (cmd = SKIN_KEY_COMMAND_NONE+1; cmd < SKIN_KEY_COMMAND_MAX; cmd++)
222        {
223            SkinKeyBinding  bindings[ SKIN_KEY_COMMAND_MAX_BINDINGS ];
224            int             n, count, len;
225            char            temp[32], *p = temp, *end = p + sizeof(temp);
226
227            count = skin_keyset_get_bindings( android_keyset, cmd, bindings );
228            if (count <= 0)
229                continue;
230
231            for (n = 0; n < count; n++) {
232                p = bufprint(p, end, "%s%s", (n == 0) ? "" : ", ",
233                            skin_key_symmod_to_str( bindings[n].sym, bindings[n].mod ) );
234            }
235
236            if (pass == 0) {
237                len = strlen(temp);
238                if (len > maxw)
239                    maxw = len;
240            } else {
241                PRINTF( "    %-*s  %s\n", maxw, temp, skin_key_command_description(cmd) );
242            }
243        }
244    }
245    PRINTF( "\n" );
246    PRINTF( "  note that NumLock must be deactivated for keypad keys to work\n\n" );
247}
248
249
250static void
251help_environment(stralloc_t*  out)
252{
253    PRINTF(
254    "  The Android emulator looks at various environment variables when it starts:\n\n"
255
256    "  If ANDROID_LOG_TAGS is defined, it will be used as in '-logcat <tags>'.\n\n"
257
258    "  If 'http_proxy' is defined, it will be used as in '-http-proxy <proxy>'.\n\n"
259
260    "  If ANDROID_VERBOSE is defined, it can contain a comma-separated list of\n"
261    "  verbose items. for example:\n\n"
262
263    "      ANDROID_VERBOSE=socket,radio\n\n"
264
265    "  is equivalent to using the '-verbose -verbose-socket -verbose-radio'\n"
266    "  options together. unsupported items will be ignored.\n\n"
267
268    "  If ANDROID_LOG_TAGS is defined, it will be used as in '-logcat <tags>'.\n\n"
269
270    "  If ANDROID_SDK_HOME is defined, it indicates the path of the '.android'\n"
271    "  directory which contains the SDK user data (Android Virtual Devices,\n"
272    "  DDMS preferences, key stores, etc.).\n\n"
273
274    "  If ANDROID_SDK_ROOT is defined, it indicates the path of the SDK\n"
275    "  installation directory.\n\n"
276
277    );
278}
279
280
281static void
282help_keyset_file(stralloc_t*  out)
283{
284    int           n, count;
285    const char**  strings;
286    char          temp[MAX_PATH];
287
288    PRINTF(
289    "  on startup, the emulator looks for 'keyset' file that contains the\n"
290    "  configuration of key-bindings to use. the default location on this\n"
291    "  system is:\n\n"
292    );
293
294    bufprint_config_file( temp, temp+sizeof(temp), KEYSET_FILE );
295    PRINTF( "    %s\n\n", temp );
296
297    PRINTF(
298    "  if the file doesn't exist, the emulator writes one containing factory\n"
299    "  defaults. you are then free to modify it to suit specific needs.\n\n"
300    "  this file shall contain a list of text lines in the following format:\n\n"
301
302    "    <command> [<modifiers>]<key>\n\n"
303
304    "  where <command> is an emulator-specific command name, i.e. one of:\n\n"
305    );
306
307    count   = SKIN_KEY_COMMAND_MAX-1;
308    strings = calloc( count, sizeof(char*) );
309    for (n = 0; n < count; n++)
310        strings[n] = skin_key_command_to_str(n+1);
311
312    stralloc_tabular( out, strings, count, "    ", 80-8 );
313    free(strings);
314
315    PRINTF(
316    "\n"
317    "  <modifers> is an optional list of <modifier> elements (without separators)\n"
318    "  which can be one of:\n\n"
319
320    "    Ctrl-     Left Control Key\n"
321    "    Shift-    Left Shift Key\n"
322    "    Alt-      Left Alt key\n"
323    "    RCtrl-    Right Control Key\n"
324    "    RShift-   Right Shift Key\n"
325    "    RAlt-     Right Alt key (a.k.a AltGr)\n"
326    "\n"
327    "  finally <key> is a QWERTY-specific keyboard symbol which can be one of:\n\n"
328    );
329    count   = skin_keysym_str_count();
330    strings = calloc( count, sizeof(char*) );
331    for (n = 0; n < count; n++)
332        strings[n] = skin_keysym_str(n);
333
334    stralloc_tabular( out, strings, count, "    ", 80-8 );
335    free(strings);
336
337    PRINTF(
338    "\n"
339    "  case is not significant, and a single command can be associated to up\n"
340    "  to %d different keys. to bind a command to multiple keys, use commas to\n"
341    "  separate them. here are some examples:\n\n",
342    SKIN_KEY_COMMAND_MAX_BINDINGS );
343
344    PRINTF(
345    "    TOGGLE_NETWORK      F8                # toggle the network on/off\n"
346    "    CHANGE_LAYOUT_PREV  Keypad_7,Ctrl-J   # switch to a previous skin layout\n"
347    "\n"
348    );
349}
350
351
352static void
353help_debug_tags(stralloc_t*  out)
354{
355    int  n;
356
357#define  _VERBOSE_TAG(x,y)   { #x, VERBOSE_##x, y },
358    static const struct { const char*  name; int  flag; const char*  text; }
359    verbose_options[] = {
360        VERBOSE_TAG_LIST
361        { 0, 0, 0 }
362    };
363#undef _VERBOSE_TAG
364
365    PRINTF(
366    "  the '-debug <tags>' option can be used to enable or disable debug\n"
367    "  messages from specific parts of the emulator. <tags> must be a list\n"
368    "  (separated by space/comma/column) of <component> names, which can be one of:\n\n"
369    );
370
371    for (n = 0; n < VERBOSE_MAX; n++)
372        PRINTF( "    %-12s    %s\n", verbose_options[n].name, verbose_options[n].text );
373    PRINTF( "    %-12s    %s\n", "all", "all components together\n" );
374
375    PRINTF(
376    "\n"
377    "  each <component> can be prefixed with a single '-' to indicate the disabling\n"
378    "  of its debug messages. for example:\n\n"
379
380    "    -debug all,-socket,-keys\n\n"
381
382    "  enables all debug messages, except the ones related to network sockets\n"
383    "  and key bindings/presses\n\n"
384    );
385}
386
387static void
388help_char_devices(stralloc_t*  out)
389{
390    PRINTF(
391    "  various emulation options take a <device> specification that can be used to\n"
392    "  specify something to hook to an emulated device or communication channel.\n"
393    "  here is the list of supported <device> specifications:\n\n"
394
395    "      stdio\n"
396    "          standard input/output. this may be subject to character\n"
397    "          translation (e.g. LN <=> CR/LF)\n\n"
398
399    "      COM<n>   [Windows only]\n"
400    "          where <n> is a digit. host serial communication port.\n\n"
401
402    "      pipe:<filename>\n"
403    "          named pipe <filename>\n\n"
404
405    "      file:<filename>\n"
406    "          write output to <filename>, no input can be read\n\n"
407
408    "      pty  [Linux only]\n"
409    "          pseudo TTY (a new PTY is automatically allocated)\n\n"
410
411    "      /dev/<file>  [Unix only]\n"
412    "          host char device file, e.g. /dev/ttyS0. may require root access\n\n"
413
414    "      /dev/parport<N>  [Linux only]\n"
415    "          use host parallel port. may require root access\n\n"
416
417    "      unix:<path>[,server][,nowait]]     [Unix only]\n"
418    "          use a Unix domain socket. if you use the 'server' option, then\n"
419    "          the emulator will create the socket and wait for a client to\n"
420    "          connect before continuing, unless you also use 'nowait'\n\n"
421
422    "      tcp:[<host>]:<port>[,server][,nowait][,nodelay]\n"
423    "          use a TCP socket. 'host' is set to localhost by default. if you\n"
424    "          use the 'server' option will bind the port and wait for a client\n"
425    "          to connect before continuing, unless you also use 'nowait'. the\n"
426    "          'nodelay' option disables the TCP Nagle algorithm\n\n"
427
428    "      telnet:[<host>]:<port>[,server][,nowait][,nodelay]\n"
429    "          similar to 'tcp:' but uses the telnet protocol instead of raw TCP\n\n"
430
431    "      udp:[<remote_host>]:<remote_port>[@[<src_ip>]:<src_port>]\n"
432    "          send output to a remote UDP server. if 'remote_host' is no\n"
433    "          specified it will default to '0.0.0.0'. you can also receive input\n"
434    "          through UDP by specifying a source address after the optional '@'.\n\n"
435
436    "      fdpair:<fd1>,<fd2>  [Unix only]\n"
437    "          redirection input and output to a pair of pre-opened file\n"
438    "          descriptors. this is mostly useful for scripts and other\n"
439    "          programmatic launches of the emulator.\n\n"
440
441    "      none\n"
442    "          no device connected\n\n"
443
444    "      null\n"
445    "          the null device (a.k.a /dev/null on Unix, or NUL on Win32)\n\n"
446
447    "  NOTE: these correspond to the <device> parameter of the QEMU -serial option\n"
448    "        as described on http://bellard.org/qemu/qemu-doc.html#SEC10\n\n"
449    );
450}
451
452static void
453help_avd(stralloc_t*  out)
454{
455    PRINTF(
456    "  use '-avd <name>' to start the emulator program with a given Android\n"
457    "  Virtual Device (a.k.a. AVD), where <name> must correspond to the name\n"
458    "  of one of the existing AVDs available on your host machine.\n\n"
459
460      "See -help-virtual-device to learn how to create/list/manage AVDs.\n\n"
461
462    "  As a special convenience, using '@<name>' is equivalent to using\n"
463    "  '-avd <name>'.\n\n"
464    );
465}
466
467static void
468help_sysdir(stralloc_t*  out)
469{
470    char   systemdir[MAX_PATH];
471    char   *p = systemdir, *end = p + sizeof(systemdir);
472
473    p = bufprint_app_dir( p, end );
474    p = bufprint( p, end, PATH_SEP "lib" PATH_SEP "images" );
475
476    PRINTF(
477    "  use '-sysdir <dir>' to specify a directory where system read-only\n"
478    "  image files will be searched. on this system, the default directory is:\n\n"
479    "      %s\n\n", systemdir );
480
481    PRINTF(
482    "  see '-help-disk-images' for more information about disk image files\n\n" );
483}
484
485static void
486help_datadir(stralloc_t*  out)
487{
488    char  datadir[MAX_PATH];
489
490    bufprint_config_path(datadir, datadir + sizeof(datadir));
491
492    PRINTF(
493    "  use '-datadir <dir>' to specify a directory where writable image files\n"
494    "  will be searched. on this system, the default directory is:\n\n"
495    "      %s\n\n", datadir );
496
497    PRINTF(
498    "  see '-help-disk-images' for more information about disk image files\n\n" );
499}
500
501static void
502help_kernel(stralloc_t*  out)
503{
504    PRINTF(
505    "  use '-kernel <file>' to specify a Linux kernel image to be run.\n"
506    "  the default image is 'kernel-qemu' from the system directory.\n\n"
507
508    "  you can use '-debug-kernel' to see debug messages from the kernel\n"
509    "  to the terminal\n\n"
510
511    "  see '-help-disk-images' for more information about disk image files\n\n"
512    );
513}
514
515static void
516help_ramdisk(stralloc_t*  out)
517{
518    PRINTF(
519    "  use '-ramdisk <file>' to specify a Linux ramdisk boot image to be run in\n"
520    "  the emulator. the default image is 'ramdisk.img' from the system directory.\n\n"
521
522    "  see '-help-disk-images' for more information about disk image files\n\n"
523    );
524}
525
526static void
527help_system(stralloc_t*  out)
528{
529    PRINTF(
530    "  use '-system <file>' to specify the intial system image that will be loaded.\n"
531    "  the default image is 'system.img' from the system directory.\n\n"
532
533    "  NOTE: In previous releases of the Android SDK, this option was named '-image'.\n"
534    "        And using '-system <path>' was equivalent to using '-sysdir <path>' now.\n\n"
535
536    "  see '-help-disk-images' for more information about disk image files\n\n"
537    );
538}
539
540static void
541help_image(stralloc_t*  out)
542{
543    PRINTF(
544    "  This option is obsolete, you should use '-system <file>' instead to point\n"
545    "  to the initial system image.\n\n"
546
547    "  see '-help-disk-images' for more information about disk image files\n\n"
548    );
549}
550
551static void
552help_data(stralloc_t*  out)
553{
554    PRINTF(
555    "  use '-data <file>' to specify a different /data partition image file.\n\n"
556
557    "  see '-help-disk-images' for more information about disk image files\n\n"
558    );
559}
560
561static void
562help_wipe_data(stralloc_t*  out)
563{
564    PRINTF(
565    "  use '-wipe-data' to reset your /data partition image to its factory\n"
566    "  defaults. this removes all installed applications and settings.\n\n"
567
568    "  see '-help-disk-images' for more information about disk image files\n\n"
569    );
570}
571
572static void
573help_cache(stralloc_t*  out)
574{
575    PRINTF(
576    "  use '-cache <file>' to specify a /cache partition image. if <file> does\n"
577    "  not exist, it will be created empty. by default, the cache partition is\n"
578    "  backed by a temporary file that is deleted when the emulator exits.\n"
579    "  using the -cache option allows it to be persistent.\n\n"
580
581    "  the '-no-cache' option can be used to disable the cache partition.\n\n"
582
583    "  see '-help-disk-images' for more information about disk image files\n\n"
584    );
585}
586
587static void
588help_cache_size(stralloc_t*  out)
589{
590    PRINTF(
591    "  use '-cache <size>' to specify a /cache partition size in MB. By default,\n"
592    "  the cache partition size is set to 66MB\n\n"
593    );
594}
595
596static void
597help_no_cache(stralloc_t*  out)
598{
599    PRINTF(
600    "  use '-no-cache' to disable the cache partition in the emulated system.\n"
601    "  the cache partition is optional, but when available, is used by the browser\n"
602    "  to cache web pages and images\n\n"
603
604    "  see '-help-disk-images' for more information about disk image files\n\n"
605    );
606}
607
608static void
609help_sdcard(stralloc_t*  out)
610{
611    PRINTF(
612    "  use '-sdcard <file>' to specify a SD Card image file that will be attached\n"
613    "  to the emulator. By default, the 'sdcard.img' file is searched in the data\n"
614    "  directory.\n\n"
615
616    "  if the file does not exist, the emulator will still start, but without an\n"
617    "  attached SD Card.\n\n"
618
619    "  see '-help-disk-images' for more information about disk image files\n\n"
620    );
621}
622
623static void
624help_snapstorage(stralloc_t*  out)
625{
626    PRINTF(
627    "  Use '-snapstorage <file>' to specify a repository file for snapshots.\n"
628    "  All snapshots made during execution will be saved in this file, and only\n"
629    "  snapshots in this file can be restored during the emulator run.\n\n"
630
631    "  If the option is not specified, it defaults to 'snapshots.img' in the\n"
632    "  data directory. If the specified file does not exist, the emulator will\n"
633    "  start, but without support for saving or loading state snapshots.\n\n"
634
635    "  see '-help-disk-images' for more information about disk image files\n"
636    "  see '-help-snapshot' for more information about snapshots\n\n"
637    );
638}
639
640static void
641help_no_snapstorage(stralloc_t*  out)
642{
643    PRINTF(
644    "  This starts the emulator without mounting a file to store or load state\n"
645    "  snapshots, forcing a full boot and disabling state snapshot functionality.\n\n"
646    ""
647    "  This command overrides the configuration specified by the parameters\n"
648    "  '-snapstorage' and '-snapshot'. A warning will be raised if either\n"
649    "  of those parameters was specified anyway.\n\n"
650     );
651 }
652
653static void
654help_snapshot(stralloc_t*  out)
655{
656    PRINTF(
657    "  Rather than executing a full boot sequence, the Android emulator can\n"
658    "  resume execution from an earlier state snapshot (which is usually\n"
659    "  significantly faster). When the parameter '-snapshot <name>' is given,\n"
660    "  the emulator loads the snapshot of that name from the snapshot image,\n"
661    "  and saves it back under the same name on exit.\n\n"
662
663    "  If the option is not specified, it defaults to 'default-boot'. If the\n"
664    "  specified snapshot does not exist, the emulator will perform a full boot\n"
665    "  sequence instead, but will still save.\n\n"
666
667    "  WARNING: In the process of loading, all contents of the system, userdata\n"
668    "           and SD card images will be OVERWRITTEN with the contents they\n"
669    "           held when the snapshot was made. Unless saved in a different\n"
670    "           snapshot, any changes since will be lost!\n\n"
671
672    "  If you want to create a snapshot manually, connect to the emulator console:\n\n"
673
674    "      telnet localhost <port>\n\n"
675
676    "  Then execute the command 'avd snapshot save <name>'. See '-help-port' for\n"
677    "  information on obtaining <port>.\n\n"
678    );
679}
680
681static void
682help_no_snapshot(stralloc_t*  out)
683{
684    PRINTF(
685    "  This inhibits both the autoload and autosave operations, forcing\n"
686    "  emulator to perform a full boot sequence and losing state on close.\n"
687    "  It overrides the '-snapshot' parameter.\n"
688    "  If '-snapshot' was specified anyway, a warning is raised.\n\n"
689    );
690}
691
692static void
693help_no_snapshot_load(stralloc_t*  out)
694{
695    PRINTF(
696    "  Prevents the emulator from loading the AVD's state from the snapshot\n"
697    "  storage on start.\n\n"
698    );
699}
700
701static void
702help_no_snapshot_save(stralloc_t*  out)
703{
704    PRINTF(
705    "  Prevents the emulator from saving the AVD's state to the snapshot\n"
706    "  storage on exit, meaning that all changes will be lost.\n\n"
707    );
708}
709
710static void
711help_no_snapshot_update_time(stralloc_t*  out)
712{
713    PRINTF(
714    "  Prevent the emulator from sending an unsolicited time update\n"
715    "  in response to the first signal strength query after loadvm,\n"
716    "  to avoid a sudden time jump that might upset testing. (Signal\n"
717    "  strength is queried approximately every 15 seconds)\n\n"
718    );
719}
720
721static void
722help_snapshot_list(stralloc_t*  out)
723{
724    PRINTF(
725    "  This prints a table of snapshots that are stored in the snapshot storage\n"
726    "  file that the emulator was started with, then exits. Values from the 'ID'\n"
727    "  and 'TAG' columns can be used as arguments for the '-snapshot' parameter.\n\n"
728
729    "  If '-snapstorage <file>' was specified as well, this command prints a "
730    "  table of the snapshots stored in <file>.\n\n"
731
732    "  See '-help-snapshot' for more information on snapshots.\n\n"
733    );
734}
735
736static void
737help_skindir(stralloc_t*  out)
738{
739    PRINTF(
740    "  use '-skindir <dir>' to specify a directory that will be used to search\n"
741    "  for emulator skins. each skin must be a subdirectory of <dir>. by default\n"
742    "  the emulator will look in the 'skins' sub-directory of the system directory\n\n"
743
744    "  the '-skin <name>' option is required when -skindir is used.\n"
745    );
746}
747
748static void
749help_skin(stralloc_t*  out)
750{
751    PRINTF(
752    "  use '-skin <skin>' to specify an emulator skin, each skin corresponds to\n"
753    "  the visual appearance of a given device, including buttons and keyboards,\n"
754    "  and is stored as subdirectory <skin> of the skin root directory\n"
755    "  (see '-help-skindir')\n\n" );
756
757    PRINTF(
758    "  note that <skin> can also be '<width>x<height>' (e.g. '320x480') to\n"
759    "  specify an exact framebuffer size, without any visual ornaments.\n\n" );
760}
761
762static void
763help_dynamic_skin(stralloc_t* out)
764{
765    PRINTF(
766    "  use '-dynamic_skin' to dynamically generate a skin based on the settings\n"
767    "  in the AVD. This option only has effect if the -skin WxH option is used\n"
768    "  to specify the width and height of the framebuffer\n");
769}
770
771/* default network settings for emulator */
772#define  DEFAULT_NETSPEED  "full"
773#define  DEFAULT_NETDELAY  "none"
774
775static void
776help_shaper(stralloc_t*  out)
777{
778    int  n;
779    NetworkSpeed* android_netspeed;
780    NetworkLatency* android_netdelay;
781    PRINTF(
782    "  the Android emulator supports network throttling, i.e. slower network\n"
783    "  bandwidth as well as higher connection latencies. this is done either through\n"
784    "  skin configuration, or with '-netspeed <speed>' and '-netdelay <delay>'.\n\n"
785
786    "  the format of -netspeed is one of the following (numbers are kbits/s):\n\n" );
787
788    for (n = 0; !corecmd_get_netspeed(n, &android_netspeed); n++) {
789        PRINTF( "    -netspeed %-12s %-15s  (up: %.1f, down: %.1f)\n",
790                        android_netspeed->name,
791                        android_netspeed->display,
792                        android_netspeed->upload/1000.,
793                        android_netspeed->download/1000. );
794        free(android_netspeed);
795    }
796    PRINTF( "\n" );
797    PRINTF( "    -netspeed %-12s %s", "<num>", "select both upload and download speed\n");
798    PRINTF( "    -netspeed %-12s %s", "<up>:<down>", "select individual up and down speed\n");
799
800    PRINTF( "\n  The format of -netdelay is one of the following (numbers are msec):\n\n" );
801    for (n = 0; !corecmd_get_netdelay(n, &android_netdelay); n++) {
802        PRINTF( "    -netdelay %-10s   %-15s  (min %d, max %d)\n",
803                        android_netdelay->name, android_netdelay->display,
804                        android_netdelay->min_ms, android_netdelay->max_ms );
805        free(android_netdelay);
806    }
807    PRINTF( "    -netdelay %-10s   %s", "<num>", "select exact latency\n");
808    PRINTF( "    -netdelay %-10s   %s", "<min>:<max>", "select min and max latencies\n\n");
809
810    PRINTF( "  the emulator uses the following defaults:\n\n" );
811    PRINTF( "    Default network speed   is '%s'\n",   DEFAULT_NETSPEED);
812    PRINTF( "    Default network latency is '%s'\n\n", DEFAULT_NETDELAY);
813}
814
815static void
816help_http_proxy(stralloc_t*  out)
817{
818    PRINTF(
819    "  the Android emulator allows you to redirect all TCP connections through\n"
820    "  a HTTP/HTTPS proxy. this can be enabled by using the '-http-proxy <proxy>'\n"
821    "  option, or by defining the 'http_proxy' environment variable.\n\n"
822
823    "  <proxy> can be one of the following:\n\n"
824    "    http://<server>:<port>\n"
825    "    http://<username>:<password>@<server>:<port>\n\n"
826
827    "  the 'http://' prefix can be omitted. If '-http-proxy <proxy>' is not used,\n"
828    "  the 'http_proxy' environment variable is looked up and any value matching\n"
829    "  the <proxy> format will be used automatically\n\n" );
830}
831
832static void
833help_report_console(stralloc_t*  out)
834{
835    PRINTF(
836    "  the '-report-console <socket>' option can be used to report the\n"
837    "  automatically-assigned console port number to a remote third-party\n"
838    "  before starting the emulation. <socket> must be in one of these\n"
839    "  formats:\n\n"
840
841    "      tcp:<port>[,server][,max=<seconds>]\n"
842    "      unix:<path>[,server][,max=<seconds>]\n"
843    "\n"
844    "  if the 'server' option is used, the emulator opens a server socket\n"
845    "  and waits for an incoming connection to it. by default, it will instead\n"
846    "  try to make a normal client connection to the socket, and, in case of\n"
847    "  failure, will repeat this operation every second for 10 seconds.\n"
848    "  the 'max=<seconds>' option can be used to modify the timeout\n\n"
849
850    "  when the connection is established, the emulator sends its console port\n"
851    "  number as text to the remote third-party, then closes the connection and\n"
852    "  starts the emulation as usual. *any* failure in the process described here\n"
853    "  will result in the emulator aborting immediately\n\n"
854
855    "  as an example, here's a small Unix shell script that starts the emulator in\n"
856    "  the background and waits for its port number with the help of the 'netcat'\n"
857    "  utility:\n\n"
858
859    "      MYPORT=5000\n"
860    "      emulator -no-window -report-console tcp:$MYPORT &\n"
861    "      CONSOLEPORT=`nc -l localhost $MYPORT`\n"
862    "\n"
863    );
864}
865
866static void
867help_dpi_device(stralloc_t*  out)
868{
869    PRINTF(
870    "  use '-dpi-device <dpi>' to specify the screen resolution of the emulated\n"
871    "  device. <dpi> must be an integer between 72 and 1000. the default is taken\n"
872    "  from the skin, if available, or uses the contant value %d (an average of\n"
873    "  several prototypes used during Android development).\n\n", DEFAULT_DEVICE_DPI );
874
875    PRINTF(
876    "  the device resolution can also used to rescale the emulator window with\n"
877    "  the '-scale' option (see -help-scale)\n\n"
878    );
879}
880
881static void
882help_audio(stralloc_t*  out)
883{
884    PRINTF(
885    "  the '-audio <backend>' option allows you to select a specific backend\n"
886    "  to be used to both play and record audio in the Android emulator.\n\n"
887
888    "  use '-audio none' to disable audio completely.\n\n"
889    );
890}
891
892static void
893help_scale(stralloc_t*  out)
894{
895    PRINTF(
896    "  the '-scale <scale>' option is used to scale the emulator window to\n"
897    "  something that better fits the physical dimensions of a real device. this\n"
898    "  can be *very* useful to check that your UI isn't too small to be usable\n"
899    "  on a real device.\n\n"
900
901    "  there are three supported formats for <scale>:\n\n"
902
903    "  * if <scale> is a real number (between 0.1 and 3.0) it is used as a\n"
904    "    scaling factor for the emulator's window.\n\n"
905
906    "  * if <scale> is an integer followed by the suffix 'dpi' (e.g. '110dpi'),\n"
907    "    then it is interpreted as the resolution of your monitor screen. this\n"
908    "    will be divided by the emulated device's resolution to get an absolute\n"
909    "    scale. (see -help-dpi-device for details).\n\n"
910
911    "  * finally, if <scale> is the keyword 'auto', the emulator tries to guess\n"
912    "    your monitor's resolution and automatically adjusts its window\n"
913    "    accordingly\n\n"
914
915    "    NOTE: this process is *very* unreliable, depending on your OS, video\n"
916    "          driver issues and other random system parameters\n\n"
917
918    "  the emulator's scale can be changed anytime at runtime through the control\n"
919    "  console. see the help for the 'window scale' command for details\n\n" );
920}
921
922static void
923help_trace(stralloc_t*  out)
924{
925    PRINTF(
926    "  use '-trace <name>' to start the emulator with runtime code profiling support\n"
927    "  profiling itself will not be enabled unless you press F9 to activate it, or\n"
928    "  the executed code turns it on programmatically.\n\n"
929
930    "  trace information is stored in directory <name>, several files are created\n"
931    "  there, that can later be used with the 'traceview' program that comes with\n"
932    "  the Android SDK for analysis.\n\n"
933
934    "  note that execution will be slightly slower when enabling code profiling,\n"
935    "  this is a necessary requirement of the operations being performed to record\n"
936    "  the execution trace. this slowdown should not affect your system until you\n"
937    "  enable the profiling though...\n\n"
938    );
939}
940
941#ifdef CONFIG_MEMCHECK
942static void
943help_memcheck(stralloc_t*  out)
944{
945    PRINTF(
946    "  use '-memcheck <flags>' to start the emulator with memory access checking\n"
947    "  support.\n\n"
948
949    "  <flags> enables, or disables memory access checking, and also controls\n"
950    "  what events are going to be logged by the memory access checker.\n"
951    "  <flags> can be one of the following:\n"
952    "  1 - Enables memory access checking with default logging (\"LIRW\"), or\n"
953    "  0 - Disables memory access checking, or\n"
954    "  A combination (in no particular order) of the following:\n"
955    "     L - Logs memory leaks on process exit.\n"
956    "     I - Logs attempts to use invalid pointers in free, or realloc routines.\n"
957    "     R - Logs memory access violation on read operations.\n"
958    "     W - Logs memory access violation on write operations.\n"
959    "     N - Logs new process ID allocation.\n"
960    "     F - Logs guest's process forking.\n"
961    "     S - Logs guest's process starting.\n"
962    "     E - Logs guest's process exiting.\n"
963    "     C - Logs guest's thread creation (clone).\n"
964    "     B - Logs libc.so initialization in the guest system.\n"
965    "     M - Logs module mapping and unmapping in the guest system.\n"
966    "     A - Logs all emulator events. Equala to \"LIRWFSECANBM\" combination.\n"
967    "     e - Logs error messages, received from the guest system.\n"
968    "     d - Logs debug messages, received from the guest system.\n"
969    "     i - Logs information messages, received from the guest system.\n"
970    "     a - Logs all messages, received from the guest system.\n"
971    "         This is equal to \"edi\" combination.\n\n"
972
973    "  note that execution might be significantly slower when enabling memory access\n"
974    "  checking, this is a necessary requirement of the operations being performed\n"
975    "  to analyze memory allocations and memory access.\n\n"
976    );
977}
978#endif  // CONFIG_MEMCHECK
979
980#ifdef CONFIG_STANDALONE_UI
981static void
982help_list_cores(stralloc_t*  out)
983{
984    PRINTF(
985    "  use '-list-cores localhost to list emulator core processes running on this machine.\n"
986    "  use '-list-cores host_name, or IP address to list emulator core processes running on\n"
987    "  a remote machine.\n"
988    );
989}
990
991static void
992help_attach_core(stralloc_t*  out)
993{
994    PRINTF(
995    "  the -attach-core <console socket> options attaches the UI to a running emulator core process.\n\n"
996
997    "  the <console socket> parameter must be in the form [host:]port, where 'host' addresses the\n"
998    "  machine on which the core process is running, and 'port' addresses the console port number for\n"
999    "  the running core process. Note that 'host' value must be in the form that can be resolved\n"
1000    "  into an IP address.\n\n"
1001
1002    "  Use -list-cores to enumerate console ports for all currently running core processes.\n"
1003    );
1004}
1005#endif  // CONFIG_STANDALONE_UI
1006
1007static void
1008help_show_kernel(stralloc_t*  out)
1009{
1010    PRINTF(
1011    "  use '-show-kernel' to redirect debug messages from the kernel to the current\n"
1012    "  terminal. this is useful to check that the boot process works correctly.\n\n"
1013    );
1014}
1015
1016static void
1017help_shell(stralloc_t*  out)
1018{
1019    PRINTF(
1020    "  use '-shell' to create a root shell console on the current terminal.\n"
1021    "  this is unlike the 'adb shell' command for the following reasons:\n\n"
1022
1023    "  * this is a *root* shell that allows you to modify many parts of the system\n"
1024    "  * this works even if the ADB daemon in the emulated system is broken\n"
1025    "  * pressing Ctrl-C will stop the emulator, instead of the shell.\n\n"
1026    "  See also '-shell-serial'.\n\n" );
1027}
1028
1029static void
1030help_shell_serial(stralloc_t*  out)
1031{
1032    PRINTF(
1033    "  use '-shell-serial <device>' instead of '-shell' to open a root shell\n"
1034    "  to the emulated system, while specifying an external communication\n"
1035    "  channel / host device.\n\n"
1036
1037    "  '-shell-serial stdio' is identical to '-shell', while you can use\n"
1038    "  '-shell-serial tcp::4444,server,nowait' to talk to the shell over local\n"
1039    "  TCP port 4444.  '-shell-serial fdpair:3:6' would let a parent process\n"
1040    "  talk to the shell using fds 3 and 6.\n\n"
1041
1042    "  see -help-char-devices for a list of available <device> specifications.\n\n"
1043    "  NOTE: you can have only one shell per emulator instance at the moment\n\n"
1044    );
1045}
1046
1047static void
1048help_logcat(stralloc_t*  out)
1049{
1050    PRINTF(
1051    "  use '-logcat <tags>' to redirect log messages from the emulated system to\n"
1052    "  the current terminal. <tags> is a list of space/comma-separated log filters\n"
1053    "  where each filter has the following format:\n\n"
1054
1055    "     <componentName>:<logLevel>\n\n"
1056
1057    "  where <componentName> is either '*' or the name of a given component,\n"
1058    "  and <logLevel> is one of the following letters:\n\n"
1059
1060    "      v          verbose level\n"
1061    "      d          debug level\n"
1062    "      i          informative log level\n"
1063    "      w          warning log level\n"
1064    "      e          error log level\n"
1065    "      s          silent log level\n\n"
1066
1067    "  for example, the following only displays messages from the 'GSM' component\n"
1068    "  that are at least at the informative level:\n\n"
1069
1070    "    -logcat '*:s GSM:i'\n\n"
1071
1072    "  if '-logcat <tags>' is not used, the emulator looks for ANDROID_LOG_TAGS\n"
1073    "  in the environment. if it is defined, its value must match the <tags>\n"
1074    "  format and will be used to redirect log messages to the terminal.\n\n"
1075
1076    "  note that this doesn't prevent you from redirecting the same, or other,\n"
1077    "  log messages through the ADB or DDMS tools too.\n\n");
1078}
1079
1080static void
1081help_no_audio(stralloc_t*  out)
1082{
1083    PRINTF(
1084    "  use '-no-audio' to disable all audio support in the emulator. this may be\n"
1085    "  unfortunately be necessary in some cases:\n\n"
1086
1087    "  * at least two users have reported that their Windows machine rebooted\n"
1088    "    instantly unless they used this option when starting the emulator.\n"
1089    "    it is very likely that the problem comes from buggy audio drivers.\n\n"
1090
1091    "  * on some Linux machines, the emulator might get stuck at startup with\n"
1092    "    audio support enabled. this problem is hard to reproduce, but seems to\n"
1093    "    be related too to flaky ALSA / audio driver support.\n\n"
1094
1095    "  on Linux, another option is to try to change the default audio backend\n"
1096    "  used by the emulator. you can do that by setting the QEMU_AUDIO_DRV\n"
1097    "  environment variables to one of the following values:\n\n"
1098
1099    "    alsa        (use the ALSA backend)\n"
1100    "    esd         (use the EsounD backend)\n"
1101    "    sdl         (use the SDL audio backend, no audio input supported)\n"
1102    "    oss         (use the OSS backend)\n"
1103    "    none        (do not support audio)\n"
1104    "\n"
1105    "  the very brave can also try to use distinct backends for audio input\n"
1106    "  and audio outputs, this is possible by selecting one of the above values\n"
1107    "  into the QEMU_AUDIO_OUT_DRV and QEMU_AUDIO_IN_DRV environment variables.\n\n"
1108    );
1109}
1110
1111static void
1112help_raw_keys(stralloc_t*  out)
1113{
1114    PRINTF(
1115    "  this option is deprecated because one can do the same using Ctrl-K\n"
1116    "  at runtime (this keypress toggles between unicode/raw keyboard modes)\n\n"
1117
1118    "  by default, the emulator tries to reverse-map the characters you type on\n"
1119    "  your keyboard to device-specific key presses whenever possible. this is\n"
1120    "  done to make the emulator usable with a non-QWERTY keyboard.\n\n"
1121
1122    "  however, this also means that single keypresses like Shift or Alt are not\n"
1123    "  passed to the emulated device. the '-raw-keys' option disables the reverse\n"
1124    "  mapping. it should only be used when using a QWERTY keyboard on your machine\n"
1125
1126    "  (should only be useful to Android system hackers, e.g. when implementing a\n"
1127    "  new input method).\n\n"
1128    );
1129}
1130
1131static void
1132help_radio(stralloc_t*  out)
1133{
1134    PRINTF(
1135    "  use '-radio <device>' to redirect the GSM modem emulation to an external\n"
1136    "  character device or program. this bypasses the emulator's internal modem\n"
1137    "  and should only be used for testing.\n\n"
1138
1139    "  see '-help-char-devices' for the format of <device>\n\n"
1140
1141    "  the data exchanged with the external device/program are GSM AT commands\n\n"
1142
1143    "  note that, when running in the emulator, the Android GSM stack only supports\n"
1144    "  a *very* basic subset of the GSM protocol. trying to link the emulator to\n"
1145    "  a real GSM modem is very likely to not work properly.\n\n"
1146    );
1147}
1148
1149
1150static void
1151help_port(stralloc_t*  out)
1152{
1153    PRINTF(
1154    "  at startup, the emulator tries to bind its control console at a free port\n"
1155    "  starting from 5554, in increments of two (i.e. 5554, then 5556, 5558, etc..)\n"
1156    "  this allows several emulator instances to run concurrently on the same\n"
1157    "  machine, each one using a different console port number.\n\n"
1158
1159    "  use '-port <port>' to force an emulator instance to use a given console port\n\n"
1160
1161    "  note that <port> must be an *even* integer between 5554 and 5584 included.\n"
1162    "  <port>+1 must also be free and will be reserved for ADB. if any of these\n"
1163    "  ports is already used, the emulator will fail to start.\n\n" );
1164}
1165
1166static void
1167help_ports(stralloc_t*  out)
1168{
1169    PRINTF(
1170    "  the '-ports <consoleport>,<adbport>' option allows you to explicitely set\n"
1171    "  the TCP ports used by the emulator to implement its control console and\n"
1172    "  communicate with the ADB tool.\n\n"
1173
1174    "  This is a very special option that should probably *not* be used by typical\n"
1175    "  developers using the Android SDK (use '-port <port>' instead), because the\n"
1176    "  corresponding instance is probably not going to be seen from adb/DDMS. Its\n"
1177    "  purpose is to use the emulator in very specific network configurations.\n\n"
1178
1179    "    <consoleport> is the TCP port used to bind the control console\n"
1180    "    <adbport> is the TCP port used to bind the ADB local transport/tunnel.\n\n"
1181
1182    "  If both ports aren't available on startup, the emulator will exit.\n\n");
1183}
1184
1185
1186static void
1187help_onion(stralloc_t*  out)
1188{
1189    PRINTF(
1190    "  use '-onion <file>' to specify a PNG image file that will be displayed on\n"
1191    "  top of the emulated framebuffer with translucency. this can be useful to\n"
1192    "  check that UI elements are correctly positioned with regards to a reference\n"
1193    "  graphics specification.\n\n"
1194
1195    "  the default translucency is 50%%, but you can use '-onion-alpha <%%age>' to\n"
1196    "  select a different one, or even use keypresses at runtime to alter it\n"
1197    "  (see -help-keys for details)\n\n"
1198
1199    "  finally, the onion image can be rotated (see -help-onion-rotate)\n\n"
1200    );
1201}
1202
1203static void
1204help_onion_alpha(stralloc_t*  out)
1205{
1206    PRINTF(
1207    "  use '-onion-alpha <percent>' to change the translucency level of the onion\n"
1208    "  image that is going to be displayed on top of the framebuffer (see also\n"
1209    "  -help-onion). the default is 50%%.\n\n"
1210
1211    "  <percent> must be an integer between 0 and 100.\n\n"
1212
1213    "  you can also change the translucency dynamically (see -help-keys)\n\n"
1214    );
1215}
1216
1217static void
1218help_onion_rotation(stralloc_t*  out)
1219{
1220    PRINTF(
1221    "  use '-onion-rotation <rotation>' to change the rotation of the onion\n"
1222    "  image loaded through '-onion <file>'. valid values for <rotation> are:\n\n"
1223
1224    "   0        no rotation\n"
1225    "   1        90  degrees clockwise\n"
1226    "   2        180 degrees\n"
1227    "   3        270 degrees clockwise\n\n"
1228    );
1229}
1230
1231
1232static void
1233help_timezone(stralloc_t*  out)
1234{
1235    PRINTF(
1236    "  by default, the emulator tries to detect your current timezone to report\n"
1237    "  it to the emulated system. use the '-timezone <timezone>' option to choose\n"
1238    "  a different timezone, or if the automatic detection doesn't work correctly.\n\n"
1239
1240    "  VERY IMPORTANT NOTE:\n\n"
1241    "  the <timezone> value must be in zoneinfo format, i.e. it should look like\n"
1242    "  Area/Location or even Area/SubArea/Location. valid examples are:\n\n"
1243
1244    "    America/Los_Angeles\n"
1245    "    Europe/Paris\n\n"
1246
1247    "  using a human-friendly abbreviation like 'PST' or 'CET' will not work, as\n"
1248    "  well as using values that are not defined by the zoneinfo database.\n\n"
1249
1250    "  NOTE: unfortunately, this will not work on M5 and older SDK releases\n\n"
1251    );
1252}
1253
1254
1255static void
1256help_dns_server(stralloc_t*  out)
1257{
1258    PRINTF(
1259    "  by default, the emulator tries to detect the DNS servers you're using and\n"
1260    "  will setup special aliases in the emulated firewall network to allow the\n"
1261    "  Android system to connect directly to them. use '-dns-server <servers>' to\n"
1262    "  select a different list of DNS servers to be used.\n\n"
1263
1264    "  <servers> must be a comma-separated list of up to 4 DNS server names or\n"
1265    "  IP addresses.\n\n"
1266
1267    "  NOTE: on M5 and older SDK releases, only the first server in the list will\n"
1268    "        be used.\n\n"
1269    );
1270}
1271
1272
1273static void
1274help_cpu_delay(stralloc_t*  out)
1275{
1276    PRINTF(
1277    "  this option is purely experimental, probably doesn't work as you would\n"
1278    "  expect, and may even disappear in a later emulator release.\n\n"
1279
1280    "  use '-cpu-delay <delay>' to throttle CPU emulation. this may be useful\n"
1281    "  to detect weird race conditions that only happen on 'lower' CPUs. note\n"
1282    "  that <delay> is a unit-less integer that doesn't even scale linearly\n"
1283    "  to observable slowdowns. use trial and error to find something that\n"
1284    "  suits you, the 'correct' machine is very probably dependent on your\n"
1285    "  host CPU and memory anyway...\n\n"
1286    );
1287}
1288
1289
1290static void
1291help_no_boot_anim(stralloc_t*  out)
1292{
1293    PRINTF(
1294    "  use '-no-boot-anim' to disable the boot animation (red bouncing ball) when\n"
1295    "  starting the emulator. on slow machines, this can surprisingly speed up the\n"
1296    "  boot sequence in tremendous ways.\n\n"
1297
1298    "  NOTE: unfortunately, this will not work on M5 and older SDK releases\n\n"
1299    );
1300}
1301
1302
1303static void
1304help_gps(stralloc_t*  out)
1305{
1306    PRINTF(
1307    "  use '-gps <device>' to emulate an NMEA-compatible GPS unit connected to\n"
1308    "  an external character device or socket. the format of <device> is the same\n"
1309    "  than the one used for '-radio <device>' (see -help-char-devices for details)\n\n"
1310    );
1311}
1312
1313
1314static void
1315help_keyset(stralloc_t*  out)
1316{
1317    char  temp[256];
1318
1319    PRINTF(
1320    "  use '-keyset <name>' to specify a different keyset file name to use when\n"
1321    "  starting the emulator. a keyset file contains a list of key bindings used\n"
1322    "  to control the emulator with the host keyboard.\n\n"
1323
1324    "  by default, the emulator looks for the following file:\n\n"
1325    );
1326
1327    bufprint_config_file(temp, temp+sizeof(temp), KEYSET_FILE);
1328    PRINTF(
1329    "    %s\n\n", temp );
1330
1331    bufprint_config_path(temp, temp+sizeof(temp));
1332    PRINTF(
1333    "  however, if -keyset is used, then the emulator does the following:\n\n"
1334
1335    "  - first, if <name> doesn't have an extension, then the '.keyset' suffix\n"
1336    "    is appended to it (e.g. \"foo\" => \"foo.keyset\"),\n\n"
1337
1338    "  - then, the emulator searches for a file named <name> in the following\n"
1339    "    directories:\n\n"
1340
1341    "     * the emulator configuration directory: %s\n"
1342    "     * the 'keysets' subdirectory of <systemdir>, if any\n"
1343    "     * the 'keysets' subdirectory of the program location, if any\n\n",
1344    temp );
1345
1346    PRINTF(
1347    "  if no corresponding file is found, a default set of key bindings is used.\n\n"
1348    "  use '-help-keys' to list the default key bindings.\n"
1349    "  use '-help-keyset-file' to learn more about the format of keyset files.\n"
1350    "\n"
1351    );
1352}
1353
1354#ifdef CONFIG_NAND_LIMITS
1355static void
1356help_nand_limits(stralloc_t*  out)
1357{
1358    PRINTF(
1359    "  use '-nand-limits <limits>' to enable a debugging feature that sends a\n"
1360    "  signal to an external process once a read and/or write limit is achieved\n"
1361    "  in the emulated system. the format of <limits> is the following:\n\n"
1362
1363    "     pid=<number>,signal=<number>,[reads=<threshold>][,writes=<threshold>]\n\n"
1364
1365    "  where 'pid' is the target process identifier, 'signal' the number of the\n"
1366    "  target signal. the read and/or write threshold'reads' are a number optionally\n"
1367    "  followed by a K, M or G suffix, corresponding to the number of bytes to be\n"
1368    "  read or written before the signal is sent.\n\n"
1369    );
1370}
1371#endif /* CONFIG_NAND_LIMITS */
1372
1373static void
1374help_bootchart(stralloc_t  *out)
1375{
1376    PRINTF(
1377    "  some Android system images have a modified 'init' system that  integrates\n"
1378    "  a bootcharting facility (see http://www.bootchart.org/). You can pass a\n"
1379    "  bootcharting period to the system with the following:\n\n"
1380
1381    "    -bootchart <timeout>\n\n"
1382
1383    "  where 'timeout' is a period expressed in seconds. Note that this won't do\n"
1384    "  anything if your init doesn't have bootcharting activated.\n\n"
1385    );
1386}
1387
1388static void
1389help_tcpdump(stralloc_t  *out)
1390{
1391    PRINTF(
1392    "  use the -tcpdump <file> option to start capturing all network packets\n"
1393    "  that are sent through the emulator's virtual Ethernet LAN. You can later\n"
1394    "  use tools like WireShark to analyze the traffic and understand what\n"
1395    "  really happens.\n\n"
1396
1397    "  note that this captures all Ethernet packets, and is not limited to TCP\n"
1398    "  connections.\n\n"
1399
1400    "  you can also start/stop the packet capture dynamically through the console;\n"
1401    "  see the 'network capture start' and 'network capture stop' commands for\n"
1402    "  details.\n\n"
1403    );
1404}
1405
1406static void
1407help_charmap(stralloc_t  *out)
1408{
1409    PRINTF(
1410    "  use '-charmap <file>' to use key character map specified in that file.\n"
1411    "  <file> must be a full path to a kcm file, containing desired character map.\n\n"
1412    );
1413}
1414
1415static void
1416help_prop(stralloc_t  *out)
1417{
1418    PRINTF(
1419    "  use '-prop <name>=<value>' to set a boot-time system property.\n"
1420    "  <name> must be a property name of at most %d characters, without any\n"
1421    "  space in it, and <value> must be a string of at most %d characters.\n\n",
1422    BOOT_PROPERTY_MAX_NAME, BOOT_PROPERTY_MAX_VALUE );
1423
1424    PRINTF(
1425    "  the corresponding system property will be set at boot time in the\n"
1426    "  emulated system. This can be useful for debugging purposes.\n\n"
1427
1428    "  note that you can use several -prop options to define more than one\n"
1429    "  boot property.\n\n"
1430    );
1431}
1432
1433static void
1434help_shared_net_id(stralloc_t*  out)
1435{
1436    PRINTF(
1437    "  Normally, Android instances running in the emulator cannot talk to each other\n"
1438    "  directly, because each instance is behind a virtual router. However, sometimes\n"
1439    "  it is necessary to test the behaviour of applications if they are directly\n"
1440    "  exposed to the network.\n\n"
1441
1442    "  This option instructs the emulator to join a virtual network shared with\n"
1443    "  emulators also using this option. The number given is used to construct\n"
1444    "  the IP address 10.1.2.<number>, which is bound to a second interface on\n"
1445    "  the emulator. Each emulator must use a different number.\n\n"
1446    );
1447}
1448
1449static void
1450help_gpu(stralloc_t* out)
1451{
1452    PRINTF(
1453    "  Use -gpu <mode> to override the mode of hardware OpenGL ES emulation\n"
1454    "  indicated by the AVD. Valid values for <mode> are:\n\n"
1455
1456    "     on       -> enable GPU emulation\n"
1457    "     off      -> disable GPU emulation\n"
1458    "     auto     -> use the setting from the AVD\n"
1459    "     enabled  -> same as 'on'\n"
1460    "     disabled -> same as 'off'\n\n"
1461
1462    "  Note that enabling GPU emulation if the system image does not support it\n"
1463    "  will prevent the proper display of the emulated framebuffer.\n\n"
1464
1465    "  You can always disable GPU emulation (i.e. '-gpu off'), and this will\n"
1466    "  force the virtual device to use the slow software renderer instead.\n"
1467    "  Note that OpenGLES 2.0 is _not_ supported by it.\n\n"
1468
1469    "  The 'auto' mode is the default. In this mode, the hw.gpu.enabled setting\n"
1470    "  in the AVD's hardware-qemu.ini file will determine whether GPU emulation\n"
1471    "  is enabled.\n\n"
1472
1473    "  Even if hardware GPU emulation is enabled, if the host-side OpenGL ES\n"
1474    "  emulation library cannot be initialized, the emulator will run with GPU\n"
1475    "  emulation disabled rather than failing to start.\n"
1476    );
1477}
1478
1479static void
1480help_camera_back(stralloc_t* out)
1481{
1482    PRINTF(
1483    "  Use -camera-back <mode> to control emulation of a camera facing back.\n"
1484    "  Valid values for <mode> are:\n\n"
1485
1486    "     emulated  -> camera will be emulated using software ('fake') camera emulation\n"
1487    "     webcam<N> -> camera will be emulated using a webcamera connected to the host\n"
1488    "     none      -> camera emulation will be disabled\n\n"
1489    );
1490}
1491
1492static void
1493help_camera_front(stralloc_t* out)
1494{
1495    PRINTF(
1496    "  Use -camera-front <mode> to control emulation of a camera facing front.\n"
1497    "  Valid values for <mode> are:\n\n"
1498
1499    "     emulated  -> camera will be emulated using software ('fake') camera emulation\n"
1500    "     webcam<N> -> camera will be emulated using a webcamera connected to the host\n"
1501    "     none      -> camera emulation will be disabled\n\n"
1502    );
1503}
1504
1505static void
1506help_webcam_list(stralloc_t* out)
1507{
1508    PRINTF(
1509    "  Use -webcam-list to list web cameras available for emulation.\n\n"
1510    );
1511}
1512
1513static void
1514help_screen(stralloc_t* out)
1515{
1516    PRINTF(
1517    "  Use -screen <mode> to set the emulated screen mode.\n"
1518    "  Valid values for <mode> are:\n\n"
1519
1520    "     touch       -> emulate a touch screen\n"
1521    "     multi-touch -> emulate a multi-touch screen\n"
1522    "     no-touch    -> disable touch and multi-touch screen emulation\n\n"
1523
1524    "  Default mode for screen emulation is 'touch'.\n\n"
1525    );
1526}
1527
1528static void
1529help_force_32bit(stralloc_t* out)
1530{
1531    PRINTF(
1532    "  Use -force-32bit to use 32-bit emulator on 64-bit platforms\n\n"
1533
1534    );
1535}
1536
1537#define  help_no_skin   NULL
1538#define  help_netspeed  help_shaper
1539#define  help_netdelay  help_shaper
1540#define  help_netfast   help_shaper
1541
1542#define  help_noaudio      NULL
1543#define  help_noskin       NULL
1544#define  help_nocache      NULL
1545#define  help_no_jni       NULL
1546#define  help_nojni        NULL
1547#define  help_initdata     NULL
1548#define  help_no_window    NULL
1549#define  help_version      NULL
1550#define  help_memory       NULL
1551#define  help_partition_size NULL
1552
1553typedef struct {
1554    const char*  name;
1555    const char*  template;
1556    const char*  descr;
1557    void (*func)(stralloc_t*);
1558} OptionHelp;
1559
1560static const OptionHelp    option_help[] = {
1561#define  OPT_FLAG(_name,_descr)             { STRINGIFY(_name), NULL, _descr, help_##_name },
1562#define  OPT_PARAM(_name,_template,_descr)  { STRINGIFY(_name), _template, _descr, help_##_name },
1563#define  OPT_LIST                           OPT_PARAM
1564#include "android/cmdline-options.h"
1565    { NULL, NULL, NULL, NULL }
1566};
1567
1568typedef struct {
1569    const char*  name;
1570    const char*  desc;
1571    void (*func)(stralloc_t*);
1572} TopicHelp;
1573
1574
1575static const TopicHelp    topic_help[] = {
1576    { "disk-images",  "about disk images",      help_disk_images },
1577    { "keys",         "supported key bindings", help_keys },
1578    { "debug-tags",   "debug tags for -debug <tags>", help_debug_tags },
1579    { "char-devices", "character <device> specification", help_char_devices },
1580    { "environment",  "environment variables",  help_environment },
1581    { "keyset-file",  "key bindings configuration file", help_keyset_file },
1582    { "virtual-device", "virtual device management", help_virtual_device },
1583    { "sdk-images",   "about disk images when using the SDK", help_sdk_images },
1584    { "build-images", "about disk images when building Android", help_build_images },
1585    { NULL, NULL, NULL }
1586};
1587
1588int
1589android_help_for_option( const char*  option, stralloc_t*  out )
1590{
1591    OptionHelp const*  oo;
1592    char               temp[32];
1593
1594    /* the names in the option_help table use underscore instead
1595     * of dashes, so create a tranlated copy of the option name
1596     * before scanning the table for matches
1597     */
1598    buffer_translate_char( temp, sizeof temp, option, '-', '_' );
1599
1600    for ( oo = option_help; oo->name != NULL; oo++ ) {
1601        if ( !strcmp(oo->name, temp) ) {
1602            if (oo->func)
1603                oo->func(out);
1604            else
1605                stralloc_add_str(out, oo->descr);
1606            return 0;
1607        }
1608    }
1609    return -1;
1610}
1611
1612
1613int
1614android_help_for_topic( const char*  topic, stralloc_t*  out )
1615{
1616    const TopicHelp*  tt;
1617
1618    for ( tt = topic_help; tt->name != NULL; tt++ ) {
1619        if ( !strcmp(tt->name, topic) ) {
1620            tt->func(out);
1621            return 0;
1622        }
1623    }
1624    return -1;
1625}
1626
1627
1628extern void
1629android_help_list_options( stralloc_t*  out )
1630{
1631    const OptionHelp*  oo;
1632    const TopicHelp*   tt;
1633    int                maxwidth = 0;
1634
1635    for ( oo = option_help; oo->name != NULL; oo++ ) {
1636        int  width = strlen(oo->name);
1637        if (oo->template != NULL)
1638            width += strlen(oo->template);
1639        if (width > maxwidth)
1640            maxwidth = width;
1641    }
1642
1643    for (oo = option_help; oo->name != NULL; oo++) {
1644        char  temp[32];
1645        /* the names in the option_help table use underscores instead
1646         * of dashes, so create a translated copy of the option's name
1647         */
1648        buffer_translate_char(temp, sizeof temp, oo->name, '_', '-');
1649
1650        stralloc_add_format( out, "    -%s %-*s %s\n",
1651            temp,
1652            (int)(maxwidth - strlen(oo->name)),
1653            oo->template ? oo->template : "",
1654            oo->descr );
1655    }
1656
1657    PRINTF( "\n" );
1658    PRINTF( "     %-*s  %s\n", maxwidth, "-qemu args...",    "pass arguments to qemu");
1659    PRINTF( "     %-*s  %s\n", maxwidth, "-qemu -h", "display qemu help");
1660    PRINTF( "\n" );
1661    PRINTF( "     %-*s  %s\n", maxwidth, "-verbose",       "same as '-debug-init'");
1662    PRINTF( "     %-*s  %s\n", maxwidth, "-debug <tags>",  "enable/disable debug messages");
1663    PRINTF( "     %-*s  %s\n", maxwidth, "-debug-<tag>",   "enable specific debug messages");
1664    PRINTF( "     %-*s  %s\n", maxwidth, "-debug-no-<tag>","disable specific debug messages");
1665    PRINTF( "\n" );
1666    PRINTF( "     %-*s  %s\n", maxwidth, "-help",    "print this help");
1667    PRINTF( "     %-*s  %s\n", maxwidth, "-help-<option>", "print option-specific help");
1668    PRINTF( "\n" );
1669
1670    for (tt = topic_help; tt->name != NULL; tt += 1) {
1671        char    help[32];
1672        snprintf(help, sizeof(help), "-help-%s", tt->name);
1673        PRINTF( "     %-*s  %s\n", maxwidth, help, tt->desc );
1674    }
1675    PRINTF( "     %-*s  %s\n", maxwidth, "-help-all", "prints all help content");
1676    PRINTF( "\n");
1677}
1678
1679
1680void
1681android_help_main( stralloc_t*  out )
1682{
1683    stralloc_add_str(out, "Android Emulator usage: emulator [options] [-qemu args]\n");
1684    stralloc_add_str(out, "  options:\n" );
1685
1686    android_help_list_options(out);
1687
1688    /*printf( "%.*s", out->n, out->s );*/
1689}
1690
1691
1692void
1693android_help_all( stralloc_t*  out )
1694{
1695    const OptionHelp*  oo;
1696    const TopicHelp*   tt;
1697
1698    for (oo = option_help; oo->name != NULL; oo++) {
1699        PRINTF( "========= help for option -%s:\n\n", oo->name );
1700        android_help_for_option( oo->name, out );
1701    }
1702
1703    for (tt = topic_help; tt->name != NULL; tt++) {
1704        PRINTF( "========= help for -help-%s\n\n", tt->name );
1705        android_help_for_topic( tt->name, out );
1706    }
1707    PRINTF( "========= top-level help\n\n" );
1708    android_help_main(out);
1709}
1710