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