1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. Oracle designates this 9 * particular file as subject to the "Classpath" exception as provided 10 * by Oracle in the LICENSE file that accompanied this code. 11 * 12 * This code is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 * version 2 for more details (a copy is included in the LICENSE file that 16 * accompanied this code). 17 * 18 * You should have received a copy of the GNU General Public License version 19 * 2 along with this work; if not, write to the Free Software Foundation, 20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 21 * 22 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 23 * or visit www.oracle.com if you need additional information or have any 24 * questions. 25 */ 26 package java.lang; 27 28 import dalvik.system.VMRuntime; 29 import dalvik.system.VMStack; 30 import android.system.StructPasswd; 31 import android.system.StructUtsname; 32 import android.system.ErrnoException; 33 import java.io.*; 34 import java.util.Locale; 35 import java.util.Properties; 36 import java.nio.channels.Channel; 37 import java.nio.channels.spi.SelectorProvider; 38 import libcore.icu.ICU; 39 import libcore.io.Libcore; 40 41 /** 42 * The <code>System</code> class contains several useful class fields 43 * and methods. It cannot be instantiated. 44 * 45 * <p>Among the facilities provided by the <code>System</code> class 46 * are standard input, standard output, and error output streams; 47 * access to externally defined properties and environment 48 * variables; a means of loading files and libraries; and a utility 49 * method for quickly copying a portion of an array. 50 * 51 * @author unascribed 52 * @since JDK1.0 53 */ 54 public final class System { 55 /** Don't let anyone instantiate this class */ 56 private System() { 57 } 58 59 /** 60 * The "standard" input stream. This stream is already 61 * open and ready to supply input data. Typically this stream 62 * corresponds to keyboard input or another input source specified by 63 * the host environment or user. 64 */ 65 public final static InputStream in; 66 67 /** 68 * The "standard" output stream. This stream is already 69 * open and ready to accept output data. Typically this stream 70 * corresponds to display output or another output destination 71 * specified by the host environment or user. 72 * <p> 73 * For simple stand-alone Java applications, a typical way to write 74 * a line of output data is: 75 * <blockquote><pre> 76 * System.out.println(data) 77 * </pre></blockquote> 78 * <p> 79 * See the <code>println</code> methods in class <code>PrintStream</code>. 80 * 81 * @see java.io.PrintStream#println() 82 * @see java.io.PrintStream#println(boolean) 83 * @see java.io.PrintStream#println(char) 84 * @see java.io.PrintStream#println(char[]) 85 * @see java.io.PrintStream#println(double) 86 * @see java.io.PrintStream#println(float) 87 * @see java.io.PrintStream#println(int) 88 * @see java.io.PrintStream#println(long) 89 * @see java.io.PrintStream#println(java.lang.Object) 90 * @see java.io.PrintStream#println(java.lang.String) 91 */ 92 public final static PrintStream out; 93 94 /** 95 * The "standard" error output stream. This stream is already 96 * open and ready to accept output data. 97 * <p> 98 * Typically this stream corresponds to display output or another 99 * output destination specified by the host environment or user. By 100 * convention, this output stream is used to display error messages 101 * or other information that should come to the immediate attention 102 * of a user even if the principal output stream, the value of the 103 * variable <code>out</code>, has been redirected to a file or other 104 * destination that is typically not continuously monitored. 105 */ 106 public final static PrintStream err; 107 108 /** 109 * Dedicated lock for GC / Finalization logic. 110 */ 111 private static final Object LOCK = new Object(); 112 113 /** 114 * Whether or not we need to do a GC before running the finalizers. 115 */ 116 private static boolean runGC; 117 118 /** 119 * If we just ran finalization, we might want to do a GC to free the finalized objects. 120 * This lets us do gc/runFinlization/gc sequences but prevents back to back System.gc(). 121 */ 122 private static boolean justRanFinalization; 123 124 /** 125 * Reassigns the "standard" input stream. 126 * 127 * <p>First, if there is a security manager, its <code>checkPermission</code> 128 * method is called with a <code>RuntimePermission("setIO")</code> permission 129 * to see if it's ok to reassign the "standard" input stream. 130 * <p> 131 * 132 * @param in the new standard input stream. 133 * 134 * @throws SecurityException 135 * if a security manager exists and its 136 * <code>checkPermission</code> method doesn't allow 137 * reassigning of the standard input stream. 138 * 139 * @see SecurityManager#checkPermission 140 * @see java.lang.RuntimePermission 141 * 142 * @since JDK1.1 143 */ 144 public static void setIn(InputStream in) { 145 setIn0(in); 146 } 147 148 /** 149 * Reassigns the "standard" output stream. 150 * 151 * <p>First, if there is a security manager, its <code>checkPermission</code> 152 * method is called with a <code>RuntimePermission("setIO")</code> permission 153 * to see if it's ok to reassign the "standard" output stream. 154 * 155 * @param out the new standard output stream 156 * 157 * @throws SecurityException 158 * if a security manager exists and its 159 * <code>checkPermission</code> method doesn't allow 160 * reassigning of the standard output stream. 161 * 162 * @see SecurityManager#checkPermission 163 * @see java.lang.RuntimePermission 164 * 165 * @since JDK1.1 166 */ 167 public static void setOut(PrintStream out) { 168 setOut0(out); 169 } 170 171 /** 172 * Reassigns the "standard" error output stream. 173 * 174 * <p>First, if there is a security manager, its <code>checkPermission</code> 175 * method is called with a <code>RuntimePermission("setIO")</code> permission 176 * to see if it's ok to reassign the "standard" error output stream. 177 * 178 * @param err the new standard error output stream. 179 * 180 * @throws SecurityException 181 * if a security manager exists and its 182 * <code>checkPermission</code> method doesn't allow 183 * reassigning of the standard error output stream. 184 * 185 * @see SecurityManager#checkPermission 186 * @see java.lang.RuntimePermission 187 * 188 * @since JDK1.1 189 */ 190 public static void setErr(PrintStream err) { 191 setErr0(err); 192 } 193 194 private static Console cons = null; 195 196 /** 197 * Returns the unique {@link java.io.Console Console} object associated 198 * with the current Java virtual machine, if any. 199 * 200 * @return The system console, if any, otherwise <tt>null</tt>. 201 * 202 * @since 1.6 203 */ 204 public static Console console() { 205 synchronized (System.class) { 206 if (cons == null) { 207 cons = Console.console(); 208 } 209 210 return cons; 211 } 212 } 213 214 /** 215 * Returns the channel inherited from the entity that created this 216 * Java virtual machine. 217 * 218 * <p> This method returns the channel obtained by invoking the 219 * {@link java.nio.channels.spi.SelectorProvider#inheritedChannel 220 * inheritedChannel} method of the system-wide default 221 * {@link java.nio.channels.spi.SelectorProvider} object. </p> 222 * 223 * <p> In addition to the network-oriented channels described in 224 * {@link java.nio.channels.spi.SelectorProvider#inheritedChannel 225 * inheritedChannel}, this method may return other kinds of 226 * channels in the future. 227 * 228 * @return The inherited channel, if any, otherwise <tt>null</tt>. 229 * 230 * @throws IOException 231 * If an I/O error occurs 232 * 233 * @throws SecurityException 234 * If a security manager is present and it does not 235 * permit access to the channel. 236 * 237 * @since 1.5 238 */ 239 public static Channel inheritedChannel() throws IOException { 240 return SelectorProvider.provider().inheritedChannel(); 241 } 242 243 private static native void setIn0(InputStream in); 244 private static native void setOut0(PrintStream out); 245 private static native void setErr0(PrintStream err); 246 247 /** 248 * Throws {@code SecurityException} (except in case {@code sm == null}). 249 * 250 * <p>Security managers do <i>not</i> provide a secure environment for 251 * executing untrusted code and are unsupported on Android. Untrusted code 252 * cannot be safely isolated within a single VM on Android, so this method 253 * <i>always</i> throws a {@code SecurityException} when passed a non-null SecurityManager 254 * 255 * @param sm a security manager 256 * @throws SecurityException always, unless {@code sm == null} 257 */ 258 public static void setSecurityManager(SecurityManager sm) { 259 if (sm != null) { 260 throw new SecurityException(); 261 } 262 } 263 264 265 /** 266 * Always returns {@code null} in Android 267 * 268 * @return {@code null} in Android 269 */ 270 public static SecurityManager getSecurityManager() { 271 // No-op on android. 272 return null; 273 } 274 275 /** 276 * Returns the current time in milliseconds. Note that 277 * while the unit of time of the return value is a millisecond, 278 * the granularity of the value depends on the underlying 279 * operating system and may be larger. For example, many 280 * operating systems measure time in units of tens of 281 * milliseconds. 282 * 283 * <p> See the description of the class <code>Date</code> for 284 * a discussion of slight discrepancies that may arise between 285 * "computer time" and coordinated universal time (UTC). 286 * 287 * @return the difference, measured in milliseconds, between 288 * the current time and midnight, January 1, 1970 UTC. 289 * @see java.util.Date 290 */ 291 public static native long currentTimeMillis(); 292 293 /** 294 * Returns the current value of the running Java Virtual Machine's 295 * high-resolution time source, in nanoseconds. 296 * 297 * <p>This method can only be used to measure elapsed time and is 298 * not related to any other notion of system or wall-clock time. 299 * The value returned represents nanoseconds since some fixed but 300 * arbitrary <i>origin</i> time (perhaps in the future, so values 301 * may be negative). The same origin is used by all invocations of 302 * this method in an instance of a Java virtual machine; other 303 * virtual machine instances are likely to use a different origin. 304 * 305 * <p>This method provides nanosecond precision, but not necessarily 306 * nanosecond resolution (that is, how frequently the value changes) 307 * - no guarantees are made except that the resolution is at least as 308 * good as that of {@link #currentTimeMillis()}. 309 * 310 * <p>Differences in successive calls that span greater than 311 * approximately 292 years (2<sup>63</sup> nanoseconds) will not 312 * correctly compute elapsed time due to numerical overflow. 313 * 314 * <p>The values returned by this method become meaningful only when 315 * the difference between two such values, obtained within the same 316 * instance of a Java virtual machine, is computed. 317 * 318 * <p> For example, to measure how long some code takes to execute: 319 * <pre> {@code 320 * long startTime = System.nanoTime(); 321 * // ... the code being measured ... 322 * long estimatedTime = System.nanoTime() - startTime;}</pre> 323 * 324 * <p>To compare two nanoTime values 325 * <pre> {@code 326 * long t0 = System.nanoTime(); 327 * ... 328 * long t1 = System.nanoTime();}</pre> 329 * 330 * one should use {@code t1 - t0 < 0}, not {@code t1 < t0}, 331 * because of the possibility of numerical overflow. 332 * 333 * @return the current value of the running Java Virtual Machine's 334 * high-resolution time source, in nanoseconds 335 * @since 1.5 336 */ 337 public static native long nanoTime(); 338 339 /** 340 * Copies an array from the specified source array, beginning at the 341 * specified position, to the specified position of the destination array. 342 * A subsequence of array components are copied from the source 343 * array referenced by <code>src</code> to the destination array 344 * referenced by <code>dest</code>. The number of components copied is 345 * equal to the <code>length</code> argument. The components at 346 * positions <code>srcPos</code> through 347 * <code>srcPos+length-1</code> in the source array are copied into 348 * positions <code>destPos</code> through 349 * <code>destPos+length-1</code>, respectively, of the destination 350 * array. 351 * <p> 352 * If the <code>src</code> and <code>dest</code> arguments refer to the 353 * same array object, then the copying is performed as if the 354 * components at positions <code>srcPos</code> through 355 * <code>srcPos+length-1</code> were first copied to a temporary 356 * array with <code>length</code> components and then the contents of 357 * the temporary array were copied into positions 358 * <code>destPos</code> through <code>destPos+length-1</code> of the 359 * destination array. 360 * <p> 361 * If <code>dest</code> is <code>null</code>, then a 362 * <code>NullPointerException</code> is thrown. 363 * <p> 364 * If <code>src</code> is <code>null</code>, then a 365 * <code>NullPointerException</code> is thrown and the destination 366 * array is not modified. 367 * <p> 368 * Otherwise, if any of the following is true, an 369 * <code>ArrayStoreException</code> is thrown and the destination is 370 * not modified: 371 * <ul> 372 * <li>The <code>src</code> argument refers to an object that is not an 373 * array. 374 * <li>The <code>dest</code> argument refers to an object that is not an 375 * array. 376 * <li>The <code>src</code> argument and <code>dest</code> argument refer 377 * to arrays whose component types are different primitive types. 378 * <li>The <code>src</code> argument refers to an array with a primitive 379 * component type and the <code>dest</code> argument refers to an array 380 * with a reference component type. 381 * <li>The <code>src</code> argument refers to an array with a reference 382 * component type and the <code>dest</code> argument refers to an array 383 * with a primitive component type. 384 * </ul> 385 * <p> 386 * Otherwise, if any of the following is true, an 387 * <code>IndexOutOfBoundsException</code> is 388 * thrown and the destination is not modified: 389 * <ul> 390 * <li>The <code>srcPos</code> argument is negative. 391 * <li>The <code>destPos</code> argument is negative. 392 * <li>The <code>length</code> argument is negative. 393 * <li><code>srcPos+length</code> is greater than 394 * <code>src.length</code>, the length of the source array. 395 * <li><code>destPos+length</code> is greater than 396 * <code>dest.length</code>, the length of the destination array. 397 * </ul> 398 * <p> 399 * Otherwise, if any actual component of the source array from 400 * position <code>srcPos</code> through 401 * <code>srcPos+length-1</code> cannot be converted to the component 402 * type of the destination array by assignment conversion, an 403 * <code>ArrayStoreException</code> is thrown. In this case, let 404 * <b><i>k</i></b> be the smallest nonnegative integer less than 405 * length such that <code>src[srcPos+</code><i>k</i><code>]</code> 406 * cannot be converted to the component type of the destination 407 * array; when the exception is thrown, source array components from 408 * positions <code>srcPos</code> through 409 * <code>srcPos+</code><i>k</i><code>-1</code> 410 * will already have been copied to destination array positions 411 * <code>destPos</code> through 412 * <code>destPos+</code><i>k</I><code>-1</code> and no other 413 * positions of the destination array will have been modified. 414 * (Because of the restrictions already itemized, this 415 * paragraph effectively applies only to the situation where both 416 * arrays have component types that are reference types.) 417 * 418 * @param src the source array. 419 * @param srcPos starting position in the source array. 420 * @param dest the destination array. 421 * @param destPos starting position in the destination data. 422 * @param length the number of array elements to be copied. 423 * @exception IndexOutOfBoundsException if copying would cause 424 * access of data outside array bounds. 425 * @exception ArrayStoreException if an element in the <code>src</code> 426 * array could not be stored into the <code>dest</code> array 427 * because of a type mismatch. 428 * @exception NullPointerException if either <code>src</code> or 429 * <code>dest</code> is <code>null</code>. 430 */ 431 public static native void arraycopy(Object src, int srcPos, 432 Object dest, int destPos, 433 int length); 434 435 436 // ----- BEGIN android ----- 437 /** 438 * The char array length threshold below which to use a Java 439 * (non-native) version of arraycopy() instead of the native 440 * version. See b/7103825. 441 */ 442 private static final int ARRAYCOPY_SHORT_CHAR_ARRAY_THRESHOLD = 32; 443 444 /** 445 * The char[] specialized version of arraycopy(). 446 * 447 * @hide internal use only 448 */ 449 public static void arraycopy(char[] src, int srcPos, char[] dst, int dstPos, int length) { 450 if (src == null) { 451 throw new NullPointerException("src == null"); 452 } 453 if (dst == null) { 454 throw new NullPointerException("dst == null"); 455 } 456 if (srcPos < 0 || dstPos < 0 || length < 0 || 457 srcPos > src.length - length || dstPos > dst.length - length) { 458 throw new ArrayIndexOutOfBoundsException( 459 "src.length=" + src.length + " srcPos=" + srcPos + 460 " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length); 461 } 462 if (length <= ARRAYCOPY_SHORT_CHAR_ARRAY_THRESHOLD) { 463 // Copy char by char for shorter arrays. 464 if (src == dst && srcPos < dstPos && dstPos < srcPos + length) { 465 // Copy backward (to avoid overwriting elements before 466 // they are copied in case of an overlap on the same 467 // array.) 468 for (int i = length - 1; i >= 0; --i) { 469 dst[dstPos + i] = src[srcPos + i]; 470 } 471 } else { 472 // Copy forward. 473 for (int i = 0; i < length; ++i) { 474 dst[dstPos + i] = src[srcPos + i]; 475 } 476 } 477 } else { 478 // Call the native version for longer arrays. 479 arraycopyCharUnchecked(src, srcPos, dst, dstPos, length); 480 } 481 } 482 483 /** 484 * The char[] specialized, unchecked, native version of 485 * arraycopy(). This assumes error checking has been done. 486 */ 487 private static native void arraycopyCharUnchecked(char[] src, int srcPos, 488 char[] dst, int dstPos, int length); 489 490 /** 491 * The byte array length threshold below which to use a Java 492 * (non-native) version of arraycopy() instead of the native 493 * version. See b/7103825. 494 */ 495 private static final int ARRAYCOPY_SHORT_BYTE_ARRAY_THRESHOLD = 32; 496 497 /** 498 * The byte[] specialized version of arraycopy(). 499 * 500 * @hide internal use only 501 */ 502 public static void arraycopy(byte[] src, int srcPos, byte[] dst, int dstPos, int length) { 503 if (src == null) { 504 throw new NullPointerException("src == null"); 505 } 506 if (dst == null) { 507 throw new NullPointerException("dst == null"); 508 } 509 if (srcPos < 0 || dstPos < 0 || length < 0 || 510 srcPos > src.length - length || dstPos > dst.length - length) { 511 throw new ArrayIndexOutOfBoundsException( 512 "src.length=" + src.length + " srcPos=" + srcPos + 513 " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length); 514 } 515 if (length <= ARRAYCOPY_SHORT_BYTE_ARRAY_THRESHOLD) { 516 // Copy byte by byte for shorter arrays. 517 if (src == dst && srcPos < dstPos && dstPos < srcPos + length) { 518 // Copy backward (to avoid overwriting elements before 519 // they are copied in case of an overlap on the same 520 // array.) 521 for (int i = length - 1; i >= 0; --i) { 522 dst[dstPos + i] = src[srcPos + i]; 523 } 524 } else { 525 // Copy forward. 526 for (int i = 0; i < length; ++i) { 527 dst[dstPos + i] = src[srcPos + i]; 528 } 529 } 530 } else { 531 // Call the native version for longer arrays. 532 arraycopyByteUnchecked(src, srcPos, dst, dstPos, length); 533 } 534 } 535 536 /** 537 * The byte[] specialized, unchecked, native version of 538 * arraycopy(). This assumes error checking has been done. 539 */ 540 private static native void arraycopyByteUnchecked(byte[] src, int srcPos, 541 byte[] dst, int dstPos, int length); 542 543 /** 544 * The short array length threshold below which to use a Java 545 * (non-native) version of arraycopy() instead of the native 546 * version. See b/7103825. 547 */ 548 private static final int ARRAYCOPY_SHORT_SHORT_ARRAY_THRESHOLD = 32; 549 550 /** 551 * The short[] specialized version of arraycopy(). 552 * 553 * @hide internal use only 554 */ 555 public static void arraycopy(short[] src, int srcPos, short[] dst, int dstPos, int length) { 556 if (src == null) { 557 throw new NullPointerException("src == null"); 558 } 559 if (dst == null) { 560 throw new NullPointerException("dst == null"); 561 } 562 if (srcPos < 0 || dstPos < 0 || length < 0 || 563 srcPos > src.length - length || dstPos > dst.length - length) { 564 throw new ArrayIndexOutOfBoundsException( 565 "src.length=" + src.length + " srcPos=" + srcPos + 566 " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length); 567 } 568 if (length <= ARRAYCOPY_SHORT_SHORT_ARRAY_THRESHOLD) { 569 // Copy short by short for shorter arrays. 570 if (src == dst && srcPos < dstPos && dstPos < srcPos + length) { 571 // Copy backward (to avoid overwriting elements before 572 // they are copied in case of an overlap on the same 573 // array.) 574 for (int i = length - 1; i >= 0; --i) { 575 dst[dstPos + i] = src[srcPos + i]; 576 } 577 } else { 578 // Copy forward. 579 for (int i = 0; i < length; ++i) { 580 dst[dstPos + i] = src[srcPos + i]; 581 } 582 } 583 } else { 584 // Call the native version for longer arrays. 585 arraycopyShortUnchecked(src, srcPos, dst, dstPos, length); 586 } 587 } 588 589 /** 590 * The short[] specialized, unchecked, native version of 591 * arraycopy(). This assumes error checking has been done. 592 */ 593 private static native void arraycopyShortUnchecked(short[] src, int srcPos, 594 short[] dst, int dstPos, int length); 595 596 /** 597 * The short array length threshold below which to use a Java 598 * (non-native) version of arraycopy() instead of the native 599 * version. See b/7103825. 600 */ 601 private static final int ARRAYCOPY_SHORT_INT_ARRAY_THRESHOLD = 32; 602 603 /** 604 * The int[] specialized version of arraycopy(). 605 * 606 * @hide internal use only 607 */ 608 public static void arraycopy(int[] src, int srcPos, int[] dst, int dstPos, int length) { 609 if (src == null) { 610 throw new NullPointerException("src == null"); 611 } 612 if (dst == null) { 613 throw new NullPointerException("dst == null"); 614 } 615 if (srcPos < 0 || dstPos < 0 || length < 0 || 616 srcPos > src.length - length || dstPos > dst.length - length) { 617 throw new ArrayIndexOutOfBoundsException( 618 "src.length=" + src.length + " srcPos=" + srcPos + 619 " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length); 620 } 621 if (length <= ARRAYCOPY_SHORT_INT_ARRAY_THRESHOLD) { 622 // Copy int by int for shorter arrays. 623 if (src == dst && srcPos < dstPos && dstPos < srcPos + length) { 624 // Copy backward (to avoid overwriting elements before 625 // they are copied in case of an overlap on the same 626 // array.) 627 for (int i = length - 1; i >= 0; --i) { 628 dst[dstPos + i] = src[srcPos + i]; 629 } 630 } else { 631 // Copy forward. 632 for (int i = 0; i < length; ++i) { 633 dst[dstPos + i] = src[srcPos + i]; 634 } 635 } 636 } else { 637 // Call the native version for longer arrays. 638 arraycopyIntUnchecked(src, srcPos, dst, dstPos, length); 639 } 640 } 641 642 /** 643 * The int[] specialized, unchecked, native version of 644 * arraycopy(). This assumes error checking has been done. 645 */ 646 private static native void arraycopyIntUnchecked(int[] src, int srcPos, 647 int[] dst, int dstPos, int length); 648 649 /** 650 * The short array length threshold below which to use a Java 651 * (non-native) version of arraycopy() instead of the native 652 * version. See b/7103825. 653 */ 654 private static final int ARRAYCOPY_SHORT_LONG_ARRAY_THRESHOLD = 32; 655 656 /** 657 * The long[] specialized version of arraycopy(). 658 * 659 * @hide internal use only 660 */ 661 public static void arraycopy(long[] src, int srcPos, long[] dst, int dstPos, int length) { 662 if (src == null) { 663 throw new NullPointerException("src == null"); 664 } 665 if (dst == null) { 666 throw new NullPointerException("dst == null"); 667 } 668 if (srcPos < 0 || dstPos < 0 || length < 0 || 669 srcPos > src.length - length || dstPos > dst.length - length) { 670 throw new ArrayIndexOutOfBoundsException( 671 "src.length=" + src.length + " srcPos=" + srcPos + 672 " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length); 673 } 674 if (length <= ARRAYCOPY_SHORT_LONG_ARRAY_THRESHOLD) { 675 // Copy long by long for shorter arrays. 676 if (src == dst && srcPos < dstPos && dstPos < srcPos + length) { 677 // Copy backward (to avoid overwriting elements before 678 // they are copied in case of an overlap on the same 679 // array.) 680 for (int i = length - 1; i >= 0; --i) { 681 dst[dstPos + i] = src[srcPos + i]; 682 } 683 } else { 684 // Copy forward. 685 for (int i = 0; i < length; ++i) { 686 dst[dstPos + i] = src[srcPos + i]; 687 } 688 } 689 } else { 690 // Call the native version for longer arrays. 691 arraycopyLongUnchecked(src, srcPos, dst, dstPos, length); 692 } 693 } 694 695 /** 696 * The long[] specialized, unchecked, native version of 697 * arraycopy(). This assumes error checking has been done. 698 */ 699 private static native void arraycopyLongUnchecked(long[] src, int srcPos, 700 long[] dst, int dstPos, int length); 701 702 /** 703 * The short array length threshold below which to use a Java 704 * (non-native) version of arraycopy() instead of the native 705 * version. See b/7103825. 706 */ 707 private static final int ARRAYCOPY_SHORT_FLOAT_ARRAY_THRESHOLD = 32; 708 709 /** 710 * The float[] specialized version of arraycopy(). 711 * 712 * @hide internal use only 713 */ 714 public static void arraycopy(float[] src, int srcPos, float[] dst, int dstPos, int length) { 715 if (src == null) { 716 throw new NullPointerException("src == null"); 717 } 718 if (dst == null) { 719 throw new NullPointerException("dst == null"); 720 } 721 if (srcPos < 0 || dstPos < 0 || length < 0 || 722 srcPos > src.length - length || dstPos > dst.length - length) { 723 throw new ArrayIndexOutOfBoundsException( 724 "src.length=" + src.length + " srcPos=" + srcPos + 725 " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length); 726 } 727 if (length <= ARRAYCOPY_SHORT_FLOAT_ARRAY_THRESHOLD) { 728 // Copy float by float for shorter arrays. 729 if (src == dst && srcPos < dstPos && dstPos < srcPos + length) { 730 // Copy backward (to avoid overwriting elements before 731 // they are copied in case of an overlap on the same 732 // array.) 733 for (int i = length - 1; i >= 0; --i) { 734 dst[dstPos + i] = src[srcPos + i]; 735 } 736 } else { 737 // Copy forward. 738 for (int i = 0; i < length; ++i) { 739 dst[dstPos + i] = src[srcPos + i]; 740 } 741 } 742 } else { 743 // Call the native version for floater arrays. 744 arraycopyFloatUnchecked(src, srcPos, dst, dstPos, length); 745 } 746 } 747 748 /** 749 * The float[] specialized, unchecked, native version of 750 * arraycopy(). This assumes error checking has been done. 751 */ 752 private static native void arraycopyFloatUnchecked(float[] src, int srcPos, 753 float[] dst, int dstPos, int length); 754 755 /** 756 * The short array length threshold below which to use a Java 757 * (non-native) version of arraycopy() instead of the native 758 * version. See b/7103825. 759 */ 760 private static final int ARRAYCOPY_SHORT_DOUBLE_ARRAY_THRESHOLD = 32; 761 762 /** 763 * The double[] specialized version of arraycopy(). 764 * 765 * @hide internal use only 766 */ 767 public static void arraycopy(double[] src, int srcPos, double[] dst, int dstPos, int length) { 768 if (src == null) { 769 throw new NullPointerException("src == null"); 770 } 771 if (dst == null) { 772 throw new NullPointerException("dst == null"); 773 } 774 if (srcPos < 0 || dstPos < 0 || length < 0 || 775 srcPos > src.length - length || dstPos > dst.length - length) { 776 throw new ArrayIndexOutOfBoundsException( 777 "src.length=" + src.length + " srcPos=" + srcPos + 778 " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length); 779 } 780 if (length <= ARRAYCOPY_SHORT_DOUBLE_ARRAY_THRESHOLD) { 781 // Copy double by double for shorter arrays. 782 if (src == dst && srcPos < dstPos && dstPos < srcPos + length) { 783 // Copy backward (to avoid overwriting elements before 784 // they are copied in case of an overlap on the same 785 // array.) 786 for (int i = length - 1; i >= 0; --i) { 787 dst[dstPos + i] = src[srcPos + i]; 788 } 789 } else { 790 // Copy forward. 791 for (int i = 0; i < length; ++i) { 792 dst[dstPos + i] = src[srcPos + i]; 793 } 794 } 795 } else { 796 // Call the native version for floater arrays. 797 arraycopyDoubleUnchecked(src, srcPos, dst, dstPos, length); 798 } 799 } 800 801 /** 802 * The double[] specialized, unchecked, native version of 803 * arraycopy(). This assumes error checking has been done. 804 */ 805 private static native void arraycopyDoubleUnchecked(double[] src, int srcPos, 806 double[] dst, int dstPos, int length); 807 808 /** 809 * The short array length threshold below which to use a Java 810 * (non-native) version of arraycopy() instead of the native 811 * version. See b/7103825. 812 */ 813 private static final int ARRAYCOPY_SHORT_BOOLEAN_ARRAY_THRESHOLD = 32; 814 815 /** 816 * The boolean[] specialized version of arraycopy(). 817 * 818 * @hide internal use only 819 */ 820 public static void arraycopy(boolean[] src, int srcPos, boolean[] dst, int dstPos, int length) { 821 if (src == null) { 822 throw new NullPointerException("src == null"); 823 } 824 if (dst == null) { 825 throw new NullPointerException("dst == null"); 826 } 827 if (srcPos < 0 || dstPos < 0 || length < 0 || 828 srcPos > src.length - length || dstPos > dst.length - length) { 829 throw new ArrayIndexOutOfBoundsException( 830 "src.length=" + src.length + " srcPos=" + srcPos + 831 " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length); 832 } 833 if (length <= ARRAYCOPY_SHORT_BOOLEAN_ARRAY_THRESHOLD) { 834 // Copy boolean by boolean for shorter arrays. 835 if (src == dst && srcPos < dstPos && dstPos < srcPos + length) { 836 // Copy backward (to avoid overwriting elements before 837 // they are copied in case of an overlap on the same 838 // array.) 839 for (int i = length - 1; i >= 0; --i) { 840 dst[dstPos + i] = src[srcPos + i]; 841 } 842 } else { 843 // Copy forward. 844 for (int i = 0; i < length; ++i) { 845 dst[dstPos + i] = src[srcPos + i]; 846 } 847 } 848 } else { 849 // Call the native version for floater arrays. 850 arraycopyBooleanUnchecked(src, srcPos, dst, dstPos, length); 851 } 852 } 853 854 /** 855 * The boolean[] specialized, unchecked, native version of 856 * arraycopy(). This assumes error checking has been done. 857 */ 858 private static native void arraycopyBooleanUnchecked(boolean[] src, int srcPos, 859 boolean[] dst, int dstPos, int length); 860 // ----- END android ----- 861 862 /** 863 * Returns the same hash code for the given object as 864 * would be returned by the default method hashCode(), 865 * whether or not the given object's class overrides 866 * hashCode(). 867 * The hash code for the null reference is zero. 868 * 869 * @param x object for which the hashCode is to be calculated 870 * @return the hashCode 871 * @since JDK1.1 872 */ 873 public static native int identityHashCode(Object x); 874 875 /** 876 * System properties. The following properties are guaranteed to be defined: 877 * <dl> 878 * <dt>java.version <dd>Java version number 879 * <dt>java.vendor <dd>Java vendor specific string 880 * <dt>java.vendor.url <dd>Java vendor URL 881 * <dt>java.home <dd>Java installation directory 882 * <dt>java.class.version <dd>Java class version number 883 * <dt>java.class.path <dd>Java classpath 884 * <dt>os.name <dd>Operating System Name 885 * <dt>os.arch <dd>Operating System Architecture 886 * <dt>os.version <dd>Operating System Version 887 * <dt>file.separator <dd>File separator ("/" on Unix) 888 * <dt>path.separator <dd>Path separator (":" on Unix) 889 * <dt>line.separator <dd>Line separator ("\n" on Unix) 890 * <dt>user.name <dd>User account name 891 * <dt>user.home <dd>User home directory 892 * <dt>user.dir <dd>User's current working directory 893 * </dl> 894 */ 895 896 private static Properties props; 897 private static Properties unchangeableProps; 898 899 private static native String[] specialProperties(); 900 901 static final class PropertiesWithNonOverrideableDefaults extends Properties { 902 PropertiesWithNonOverrideableDefaults(Properties defaults) { 903 super(defaults); 904 } 905 906 @Override 907 public Object put(Object key, Object value) { 908 if (defaults.containsKey(key)) { 909 logE("Ignoring attempt to set property \"" + key + 910 "\" to value \"" + value + "\"."); 911 return defaults.get(key); 912 } 913 914 return super.put(key, value); 915 } 916 917 @Override 918 public Object remove(Object key) { 919 if (defaults.containsKey(key)) { 920 logE("Ignoring attempt to remove property \"" + key + "\"."); 921 return null; 922 } 923 924 return super.remove(key); 925 } 926 } 927 928 private static void parsePropertyAssignments(Properties p, String[] assignments) { 929 for (String assignment : assignments) { 930 int split = assignment.indexOf('='); 931 String key = assignment.substring(0, split); 932 String value = assignment.substring(split + 1); 933 p.put(key, value); 934 } 935 } 936 937 private static Properties initUnchangeableSystemProperties() { 938 VMRuntime runtime = VMRuntime.getRuntime(); 939 Properties p = new Properties(); 940 941 // Set non-static properties. 942 p.put("java.boot.class.path", runtime.bootClassPath()); 943 p.put("java.class.path", runtime.classPath()); 944 945 // TODO: does this make any sense? Should we just leave java.home unset? 946 String javaHome = getenv("JAVA_HOME"); 947 if (javaHome == null) { 948 javaHome = "/system"; 949 } 950 p.put("java.home", javaHome); 951 952 p.put("java.vm.version", runtime.vmVersion()); 953 954 try { 955 StructPasswd passwd = Libcore.os.getpwuid(Libcore.os.getuid()); 956 p.put("user.name", passwd.pw_name); 957 } catch (ErrnoException exception) { 958 throw new AssertionError(exception); 959 } 960 961 StructUtsname info = Libcore.os.uname(); 962 p.put("os.arch", info.machine); 963 if (p.get("os.name") != null && !p.get("os.name").equals(info.sysname)) { 964 logE("Wrong compile-time assumption for os.name: " + p.get("os.name") + " vs " + 965 info.sysname); 966 p.put("os.name", info.sysname); 967 } 968 p.put("os.version", info.release); 969 970 // Undocumented Android-only properties. 971 p.put("android.icu.library.version", ICU.getIcuVersion()); 972 p.put("android.icu.unicode.version", ICU.getUnicodeVersion()); 973 p.put("android.icu.cldr.version", ICU.getCldrVersion()); 974 975 // Property override for ICU4J : this is the location of the ICU4C data. This 976 // is prioritized over the properties in ICUConfig.properties. The issue with using 977 // that is that it doesn't play well with jarjar and it needs complicated build rules 978 // to change its default value. 979 p.put("android.icu.impl.ICUBinary.dataPath", getenv("ANDROID_ROOT") + "/usr/icu"); 980 981 parsePropertyAssignments(p, specialProperties()); 982 983 // Override built-in properties with settings from the command line. 984 // Note: it is not possible to override hardcoded values. 985 parsePropertyAssignments(p, runtime.properties()); 986 987 988 // Set static hardcoded properties. 989 // These come last, as they must be guaranteed to agree with what a backend compiler 990 // may assume when compiling the boot image on Android. 991 for (String[] pair : AndroidHardcodedSystemProperties.STATIC_PROPERTIES) { 992 if (p.containsKey(pair[0])) { 993 logE("Ignoring command line argument: -D" + pair[0]); 994 } 995 if (pair[1] == null) { 996 p.remove(pair[0]); 997 } else { 998 p.put(pair[0], pair[1]); 999 } 1000 } 1001 1002 return p; 1003 } 1004 1005 private static Properties initProperties() { 1006 Properties p = new PropertiesWithNonOverrideableDefaults(unchangeableProps); 1007 setDefaultChangeableProperties(p); 1008 return p; 1009 } 1010 1011 private static Properties setDefaultChangeableProperties(Properties p) { 1012 // On Android, each app gets its own temporary directory. 1013 // (See android.app.ActivityThread.) This is just a fallback default, 1014 // useful only on the host. 1015 // We check first if the property has not been set already: note that it 1016 // can only be set from the command line through the '-Djava.io.tmpdir=' option. 1017 if (!unchangeableProps.containsKey("java.io.tmpdir")) { 1018 p.put("java.io.tmpdir", "/tmp"); 1019 } 1020 1021 // Android has always had an empty "user.home" (see docs for getProperty). 1022 // This is not useful for normal android apps which need to use android specific 1023 // APIs such as {@code Context.getFilesDir} and {@code Context.getCacheDir} but 1024 // we make it changeable for backward compatibility, so that they can change it 1025 // to a writeable location if required. 1026 // We check first if the property has not been set already: note that it 1027 // can only be set from the command line through the '-Duser.home=' option. 1028 if (!unchangeableProps.containsKey("user.home")) { 1029 p.put("user.home", ""); 1030 } 1031 1032 return p; 1033 } 1034 1035 /** 1036 * Inits an unchangeable system property with the given value. 1037 * 1038 * This is called from native code when the environment needs to change under native 1039 * bridge emulation. 1040 * 1041 * @hide also visible for tests. 1042 */ 1043 public static void setUnchangeableSystemProperty(String key, String value) { 1044 checkKey(key); 1045 unchangeableProps.put(key, value); 1046 } 1047 1048 private static void addLegacyLocaleSystemProperties() { 1049 final String locale = getProperty("user.locale", ""); 1050 if (!locale.isEmpty()) { 1051 Locale l = Locale.forLanguageTag(locale); 1052 setUnchangeableSystemProperty("user.language", l.getLanguage()); 1053 setUnchangeableSystemProperty("user.region", l.getCountry()); 1054 setUnchangeableSystemProperty("user.variant", l.getVariant()); 1055 } else { 1056 // If "user.locale" isn't set we fall back to our old defaults of 1057 // language="en" and region="US" (if unset) and don't attempt to set it. 1058 // The Locale class will fall back to using user.language and 1059 // user.region if unset. 1060 final String language = getProperty("user.language", ""); 1061 final String region = getProperty("user.region", ""); 1062 1063 if (language.isEmpty()) { 1064 setUnchangeableSystemProperty("user.language", "en"); 1065 } 1066 1067 if (region.isEmpty()) { 1068 setUnchangeableSystemProperty("user.region", "US"); 1069 } 1070 } 1071 } 1072 1073 /** 1074 * Determines the current system properties. 1075 * 1076 * 1077 * <p>The following properties are always provided by the Dalvik VM:</p> 1078 * <p><table BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> 1079 * <tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> 1080 * <td><b>Name</b></td> <td><b>Meaning</b></td> <td><b>Example</b></td></tr> 1081 * <tr><td>file.separator</td> <td>{@link java.io.File#separator}</td> <td>{@code /}</td></tr> 1082 * 1083 * <tr><td>java.class.path</td> <td>System class path</td> <td>{@code .}</td></tr> 1084 * <tr><td>java.class.version</td> <td>(Not useful on Android)</td> <td>{@code 50.0}</td></tr> 1085 * <tr><td>java.compiler</td> <td>(Not useful on Android)</td> <td>Empty</td></tr> 1086 * <tr><td>java.ext.dirs</td> <td>(Not useful on Android)</td> <td>Empty</td></tr> 1087 * <tr><td>java.home</td> <td>Location of the VM on the file system</td> <td>{@code /system}</td></tr> 1088 * <tr><td>java.io.tmpdir</td> <td>See {@link java.io.File#createTempFile}</td> <td>{@code /sdcard}</td></tr> 1089 * <tr><td>java.library.path</td> <td>Search path for JNI libraries</td> <td>{@code /vendor/lib:/system/lib}</td></tr> 1090 * <tr><td>java.vendor</td> <td>Human-readable VM vendor</td> <td>{@code The Android Project}</td></tr> 1091 * <tr><td>java.vendor.url</td> <td>URL for VM vendor's web site</td> <td>{@code http://www.android.com/}</td></tr> 1092 * <tr><td>java.version</td> <td>(Not useful on Android)</td> <td>{@code 0}</td></tr> 1093 * 1094 * <tr><td>java.specification.version</td> <td>VM libraries version</td> <td>{@code 0.9}</td></tr> 1095 * <tr><td>java.specification.vendor</td> <td>VM libraries vendor</td> <td>{@code The Android Project}</td></tr> 1096 * <tr><td>java.specification.name</td> <td>VM libraries name</td> <td>{@code Dalvik Core Library}</td></tr> 1097 * <tr><td>java.vm.version</td> <td>VM implementation version</td> <td>{@code 1.2.0}</td></tr> 1098 * <tr><td>java.vm.vendor</td> <td>VM implementation vendor</td> <td>{@code The Android Project}</td></tr> 1099 * <tr><td>java.vm.name</td> <td>VM implementation name</td> <td>{@code Dalvik}</td></tr> 1100 * <tr><td>java.vm.specification.version</td> <td>VM specification version</td> <td>{@code 0.9}</td></tr> 1101 * <tr><td>java.vm.specification.vendor</td> <td>VM specification vendor</td> <td>{@code The Android Project}</td></tr> 1102 * <tr><td>java.vm.specification.name</td> <td>VM specification name</td> <td>{@code Dalvik Virtual Machine Specification}</td></tr> 1103 * 1104 * <tr><td>line.separator</td> <td>The system line separator</td> <td>{@code \n}</td></tr> 1105 * 1106 * <tr><td>os.arch</td> <td>OS architecture</td> <td>{@code armv7l}</td></tr> 1107 * <tr><td>os.name</td> <td>OS (kernel) name</td> <td>{@code Linux}</td></tr> 1108 * <tr><td>os.version</td> <td>OS (kernel) version</td> <td>{@code 2.6.32.9-g103d848}</td></tr> 1109 * 1110 * <tr><td>path.separator</td> <td>See {@link java.io.File#pathSeparator}</td> <td>{@code :}</td></tr> 1111 * 1112 * <tr><td>user.dir</td> <td>Base of non-absolute paths</td> <td>{@code /}</td></tr> 1113 * <tr><td>user.home</td> <td>(Not useful on Android)</td> <td>Empty</td></tr> 1114 * <tr><td>user.name</td> <td>(Not useful on Android)</td> <td>Empty</td></tr> 1115 * 1116 * </table> 1117 * <p> 1118 * Multiple paths in a system property value are separated by the path 1119 * separator character of the platform. 1120 * 1121 * @return the system properties 1122 * @see #setProperties 1123 * @see java.util.Properties 1124 */ 1125 public static Properties getProperties() { 1126 return props; 1127 } 1128 1129 /** 1130 * Returns the system-dependent line separator string. It always 1131 * returns the same value - the initial value of the {@linkplain 1132 * #getProperty(String) system property} {@code line.separator}. 1133 * 1134 * <p>On UNIX systems, it returns {@code "\n"}; on Microsoft 1135 * Windows systems it returns {@code "\r\n"}. 1136 */ 1137 public static String lineSeparator() { 1138 return lineSeparator; 1139 } 1140 1141 private static String lineSeparator; 1142 1143 1144 // Comment replaced with android one. 1145 /** 1146 * Attempts to set all system properties. Copies all properties from 1147 * {@code p} and discards system properties that are read only and cannot 1148 * be modified. See {@link #getProperty} for a list of such properties. 1149 */ 1150 public static void setProperties(Properties props) { 1151 Properties baseProperties = new PropertiesWithNonOverrideableDefaults(unchangeableProps); 1152 if (props != null) { 1153 baseProperties.putAll(props); 1154 } else { 1155 setDefaultChangeableProperties(baseProperties); 1156 } 1157 1158 System.props = baseProperties; 1159 } 1160 1161 /** 1162 * Gets the system property indicated by the specified key. 1163 * 1164 * If there is no current set of system properties, a set of system 1165 * properties is first created and initialized in the same manner as 1166 * for the <code>getProperties</code> method. 1167 * 1168 * @param key the name of the system property. 1169 * @return the string value of the system property, 1170 * or <code>null</code> if there is no property with that key. 1171 * 1172 * @exception NullPointerException if <code>key</code> is 1173 * <code>null</code>. 1174 * @exception IllegalArgumentException if <code>key</code> is empty. 1175 * @see #setProperty 1176 * @see java.lang.System#getProperties() 1177 */ 1178 public static String getProperty(String key) { 1179 checkKey(key); 1180 1181 return props.getProperty(key); 1182 } 1183 1184 /** 1185 * Gets the system property indicated by the specified key. 1186 * <p> 1187 * First, if there is a security manager, its 1188 * <code>checkPropertyAccess</code> method is called with the 1189 * <code>key</code> as its argument. 1190 * <p> 1191 * If there is no current set of system properties, a set of system 1192 * properties is first created and initialized in the same manner as 1193 * for the <code>getProperties</code> method. 1194 * 1195 * @param key the name of the system property. 1196 * @param def a default value. 1197 * @return the string value of the system property, 1198 * or the default value if there is no property with that key. 1199 * 1200 * @exception NullPointerException if <code>key</code> is 1201 * <code>null</code>. 1202 * @exception IllegalArgumentException if <code>key</code> is empty. 1203 * @see #setProperty 1204 * @see java.lang.System#getProperties() 1205 */ 1206 public static String getProperty(String key, String def) { 1207 checkKey(key); 1208 1209 return props.getProperty(key, def); 1210 } 1211 1212 /** 1213 * Sets the system property indicated by the specified key. 1214 * 1215 * @param key the name of the system property. 1216 * @param value the value of the system property. 1217 * @return the previous value of the system property, 1218 * or <code>null</code> if it did not have one. 1219 * 1220 * @exception NullPointerException if <code>key</code> or 1221 * <code>value</code> is <code>null</code>. 1222 * @exception IllegalArgumentException if <code>key</code> is empty. 1223 * @see #getProperty 1224 * @see java.lang.System#getProperty(java.lang.String) 1225 * @see java.lang.System#getProperty(java.lang.String, java.lang.String) 1226 * @since 1.2 1227 */ 1228 public static String setProperty(String key, String value) { 1229 checkKey(key); 1230 1231 return (String) props.setProperty(key, value); 1232 } 1233 1234 /** 1235 * Removes the system property indicated by the specified key. 1236 * 1237 * @param key the name of the system property to be removed. 1238 * @return the previous string value of the system property, 1239 * or <code>null</code> if there was no property with that key. 1240 * 1241 * @exception NullPointerException if <code>key</code> is 1242 * <code>null</code>. 1243 * @exception IllegalArgumentException if <code>key</code> is empty. 1244 * @see #getProperty 1245 * @see #setProperty 1246 * @see java.util.Properties 1247 * @since 1.5 1248 */ 1249 public static String clearProperty(String key) { 1250 checkKey(key); 1251 1252 return (String) props.remove(key); 1253 } 1254 1255 private static void checkKey(String key) { 1256 if (key == null) { 1257 throw new NullPointerException("key can't be null"); 1258 } 1259 if (key.equals("")) { 1260 throw new IllegalArgumentException("key can't be empty"); 1261 } 1262 } 1263 1264 /** 1265 * Gets the value of the specified environment variable. An 1266 * environment variable is a system-dependent external named 1267 * value. 1268 * 1269 * <p>If a security manager exists, its 1270 * {@link SecurityManager#checkPermission checkPermission} 1271 * method is called with a 1272 * <code>{@link RuntimePermission}("getenv."+name)</code> 1273 * permission. This may result in a {@link SecurityException} 1274 * being thrown. If no exception is thrown the value of the 1275 * variable <code>name</code> is returned. 1276 * 1277 * <p><a name="EnvironmentVSSystemProperties"><i>System 1278 * properties</i> and <i>environment variables</i></a> are both 1279 * conceptually mappings between names and values. Both 1280 * mechanisms can be used to pass user-defined information to a 1281 * Java process. Environment variables have a more global effect, 1282 * because they are visible to all descendants of the process 1283 * which defines them, not just the immediate Java subprocess. 1284 * They can have subtly different semantics, such as case 1285 * insensitivity, on different operating systems. For these 1286 * reasons, environment variables are more likely to have 1287 * unintended side effects. It is best to use system properties 1288 * where possible. Environment variables should be used when a 1289 * global effect is desired, or when an external system interface 1290 * requires an environment variable (such as <code>PATH</code>). 1291 * 1292 * <p>On UNIX systems the alphabetic case of <code>name</code> is 1293 * typically significant, while on Microsoft Windows systems it is 1294 * typically not. For example, the expression 1295 * <code>System.getenv("FOO").equals(System.getenv("foo"))</code> 1296 * is likely to be true on Microsoft Windows. 1297 * 1298 * @param name the name of the environment variable 1299 * @return the string value of the variable, or <code>null</code> 1300 * if the variable is not defined in the system environment 1301 * @throws NullPointerException if <code>name</code> is <code>null</code> 1302 * @throws SecurityException 1303 * if a security manager exists and its 1304 * {@link SecurityManager#checkPermission checkPermission} 1305 * method doesn't allow access to the environment variable 1306 * <code>name</code> 1307 * @see #getenv() 1308 * @see ProcessBuilder#environment() 1309 */ 1310 public static String getenv(String name) { 1311 if (name == null) { 1312 throw new NullPointerException("name == null"); 1313 } 1314 1315 return Libcore.os.getenv(name); 1316 } 1317 1318 1319 /** 1320 * Returns an unmodifiable string map view of the current system environment. 1321 * The environment is a system-dependent mapping from names to 1322 * values which is passed from parent to child processes. 1323 * 1324 * <p>If the system does not support environment variables, an 1325 * empty map is returned. 1326 * 1327 * <p>The returned map will never contain null keys or values. 1328 * Attempting to query the presence of a null key or value will 1329 * throw a {@link NullPointerException}. Attempting to query 1330 * the presence of a key or value which is not of type 1331 * {@link String} will throw a {@link ClassCastException}. 1332 * 1333 * <p>The returned map and its collection views may not obey the 1334 * general contract of the {@link Object#equals} and 1335 * {@link Object#hashCode} methods. 1336 * 1337 * <p>The returned map is typically case-sensitive on all platforms. 1338 * 1339 * <p>If a security manager exists, its 1340 * {@link SecurityManager#checkPermission checkPermission} 1341 * method is called with a 1342 * <code>{@link RuntimePermission}("getenv.*")</code> 1343 * permission. This may result in a {@link SecurityException} being 1344 * thrown. 1345 * 1346 * <p>When passing information to a Java subprocess, 1347 * <a href=#EnvironmentVSSystemProperties>system properties</a> 1348 * are generally preferred over environment variables. 1349 * 1350 * @return the environment as a map of variable names to values 1351 * @throws SecurityException 1352 * if a security manager exists and its 1353 * {@link SecurityManager#checkPermission checkPermission} 1354 * method doesn't allow access to the process environment 1355 * @see #getenv(String) 1356 * @see ProcessBuilder#environment() 1357 * @since 1.5 1358 */ 1359 public static java.util.Map<String,String> getenv() { 1360 return ProcessEnvironment.getenv(); 1361 } 1362 1363 /** 1364 * Terminates the currently running Java Virtual Machine. The 1365 * argument serves as a status code; by convention, a nonzero status 1366 * code indicates abnormal termination. 1367 * <p> 1368 * This method calls the <code>exit</code> method in class 1369 * <code>Runtime</code>. This method never returns normally. 1370 * <p> 1371 * The call <code>System.exit(n)</code> is effectively equivalent to 1372 * the call: 1373 * <blockquote><pre> 1374 * Runtime.getRuntime().exit(n) 1375 * </pre></blockquote> 1376 * 1377 * @param status exit status. 1378 * @throws SecurityException 1379 * if a security manager exists and its <code>checkExit</code> 1380 * method doesn't allow exit with the specified status. 1381 * @see java.lang.Runtime#exit(int) 1382 */ 1383 public static void exit(int status) { 1384 Runtime.getRuntime().exit(status); 1385 } 1386 1387 /** 1388 * Runs the garbage collector. 1389 * <p> 1390 * Calling the <code>gc</code> method suggests that the Java Virtual 1391 * Machine expend effort toward recycling unused objects in order to 1392 * make the memory they currently occupy available for quick reuse. 1393 * When control returns from the method call, the Java Virtual 1394 * Machine has made a best effort to reclaim space from all discarded 1395 * objects. 1396 * <p> 1397 * The call <code>System.gc()</code> is effectively equivalent to the 1398 * call: 1399 * <blockquote><pre> 1400 * Runtime.getRuntime().gc() 1401 * </pre></blockquote> 1402 * 1403 * @see java.lang.Runtime#gc() 1404 */ 1405 public static void gc() { 1406 boolean shouldRunGC; 1407 synchronized (LOCK) { 1408 shouldRunGC = justRanFinalization; 1409 if (shouldRunGC) { 1410 justRanFinalization = false; 1411 } else { 1412 runGC = true; 1413 } 1414 } 1415 if (shouldRunGC) { 1416 Runtime.getRuntime().gc(); 1417 } 1418 } 1419 1420 /** 1421 * Runs the finalization methods of any objects pending finalization. 1422 * <p> 1423 * Calling this method suggests that the Java Virtual Machine expend 1424 * effort toward running the <code>finalize</code> methods of objects 1425 * that have been found to be discarded but whose <code>finalize</code> 1426 * methods have not yet been run. When control returns from the 1427 * method call, the Java Virtual Machine has made a best effort to 1428 * complete all outstanding finalizations. 1429 * <p> 1430 * The call <code>System.runFinalization()</code> is effectively 1431 * equivalent to the call: 1432 * <blockquote><pre> 1433 * Runtime.getRuntime().runFinalization() 1434 * </pre></blockquote> 1435 * 1436 * @see java.lang.Runtime#runFinalization() 1437 */ 1438 public static void runFinalization() { 1439 boolean shouldRunGC; 1440 synchronized (LOCK) { 1441 shouldRunGC = runGC; 1442 runGC = false; 1443 } 1444 if (shouldRunGC) { 1445 Runtime.getRuntime().gc(); 1446 } 1447 Runtime.getRuntime().runFinalization(); 1448 synchronized (LOCK) { 1449 justRanFinalization = true; 1450 } 1451 } 1452 1453 /** 1454 * Enable or disable finalization on exit; doing so specifies that the 1455 * finalizers of all objects that have finalizers that have not yet been 1456 * automatically invoked are to be run before the Java runtime exits. 1457 * By default, finalization on exit is disabled. 1458 * 1459 * <p>If there is a security manager, 1460 * its <code>checkExit</code> method is first called 1461 * with 0 as its argument to ensure the exit is allowed. 1462 * This could result in a SecurityException. 1463 * 1464 * @deprecated This method is inherently unsafe. It may result in 1465 * finalizers being called on live objects while other threads are 1466 * concurrently manipulating those objects, resulting in erratic 1467 * behavior or deadlock. 1468 * @param value indicating enabling or disabling of finalization 1469 * @throws SecurityException 1470 * if a security manager exists and its <code>checkExit</code> 1471 * method doesn't allow the exit. 1472 * 1473 * @see java.lang.Runtime#exit(int) 1474 * @see java.lang.Runtime#gc() 1475 * @see java.lang.SecurityManager#checkExit(int) 1476 * @since JDK1.1 1477 */ 1478 @Deprecated 1479 public static void runFinalizersOnExit(boolean value) { 1480 Runtime.getRuntime().runFinalizersOnExit(value); 1481 } 1482 1483 /** 1484 * Loads a code file with the specified filename from the local file 1485 * system as a dynamic library. The filename 1486 * argument must be a complete path name. 1487 * <p> 1488 * The call <code>System.load(name)</code> is effectively equivalent 1489 * to the call: 1490 * <blockquote><pre> 1491 * Runtime.getRuntime().load(name) 1492 * </pre></blockquote> 1493 * 1494 * @param filename the file to load. 1495 * @exception SecurityException if a security manager exists and its 1496 * <code>checkLink</code> method doesn't allow 1497 * loading of the specified dynamic library 1498 * @exception UnsatisfiedLinkError if the file does not exist. 1499 * @exception NullPointerException if <code>filename</code> is 1500 * <code>null</code> 1501 * @see java.lang.Runtime#load(java.lang.String) 1502 * @see java.lang.SecurityManager#checkLink(java.lang.String) 1503 */ 1504 public static void load(String filename) { 1505 Runtime.getRuntime().load0(VMStack.getStackClass1(), filename); 1506 } 1507 1508 /** 1509 * Loads the system library specified by the <code>libname</code> 1510 * argument. The manner in which a library name is mapped to the 1511 * actual system library is system dependent. 1512 * <p> 1513 * The call <code>System.loadLibrary(name)</code> is effectively 1514 * equivalent to the call 1515 * <blockquote><pre> 1516 * Runtime.getRuntime().loadLibrary(name) 1517 * </pre></blockquote> 1518 * 1519 * @param libname the name of the library. 1520 * @exception SecurityException if a security manager exists and its 1521 * <code>checkLink</code> method doesn't allow 1522 * loading of the specified dynamic library 1523 * @exception UnsatisfiedLinkError if the library does not exist. 1524 * @exception NullPointerException if <code>libname</code> is 1525 * <code>null</code> 1526 * @see java.lang.Runtime#loadLibrary(java.lang.String) 1527 * @see java.lang.SecurityManager#checkLink(java.lang.String) 1528 */ 1529 public static void loadLibrary(String libname) { 1530 Runtime.getRuntime().loadLibrary0(VMStack.getCallingClassLoader(), libname); 1531 } 1532 1533 /** 1534 * Maps a library name into a platform-specific string representing 1535 * a native library. 1536 * 1537 * @param libname the name of the library. 1538 * @return a platform-dependent native library name. 1539 * @exception NullPointerException if <code>libname</code> is 1540 * <code>null</code> 1541 * @see java.lang.System#loadLibrary(java.lang.String) 1542 * @see java.lang.ClassLoader#findLibrary(java.lang.String) 1543 * @since 1.2 1544 */ 1545 public static native String mapLibraryName(String libname); 1546 1547 /** 1548 * Initialize the system class. Called after thread initialization. 1549 */ 1550 static { 1551 unchangeableProps = initUnchangeableSystemProperties(); 1552 props = initProperties(); 1553 addLegacyLocaleSystemProperties(); 1554 sun.misc.Version.initSystemProperties(); 1555 1556 // TODO: Confirm that this isn't something super important. 1557 // sun.misc.VM.saveAndRemoveProperties(props); 1558 1559 lineSeparator = props.getProperty("line.separator"); 1560 1561 FileInputStream fdIn = new FileInputStream(FileDescriptor.in); 1562 FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); 1563 FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err); 1564 1565 in = new BufferedInputStream(fdIn); 1566 out = new PrintStream(fdOut); 1567 err = new PrintStream(fdErr); 1568 1569 // Initialize any miscellenous operating system settings that need to be 1570 // set for the class libraries. Currently this is no-op everywhere except 1571 // for Windows where the process-wide error mode is set before the java.io 1572 // classes are used. 1573 sun.misc.VM.initializeOSEnvironment(); 1574 1575 // Subsystems that are invoked during initialization can invoke 1576 // sun.misc.VM.isBooted() in order to avoid doing things that should 1577 // wait until the application class loader has been set up. 1578 // IMPORTANT: Ensure that this remains the last initialization action! 1579 sun.misc.VM.booted(); 1580 } 1581 1582 /** 1583 * @hide internal use only 1584 */ 1585 public static void logE(String message) { 1586 log('E', message, null); 1587 } 1588 1589 /** 1590 * @hide internal use only 1591 */ 1592 public static void logE(String message, Throwable th) { 1593 log('E', message, th); 1594 } 1595 1596 /** 1597 * @hide internal use only 1598 */ 1599 public static void logI(String message) { 1600 log('I', message, null); 1601 } 1602 1603 /** 1604 * @hide internal use only 1605 */ 1606 public static void logI(String message, Throwable th) { 1607 log('I', message, th); 1608 } 1609 1610 /** 1611 * @hide internal use only 1612 */ 1613 public static void logW(String message) { 1614 log('W', message, null); 1615 } 1616 1617 /** 1618 * @hide internal use only 1619 */ 1620 public static void logW(String message, Throwable th) { 1621 log('W', message, th); 1622 } 1623 1624 private static native void log(char type, String message, Throwable th); 1625 } 1626