Merge "Set flags in RS JNI calls for rsObj creation"
diff --git a/Android.mk b/Android.mk
index a94414d..731440f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -426,7 +426,7 @@
$(framework_res_source_path)/com/android/internal/R.java
LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES := core-oj core-libart conscrypt okhttp core-junit bouncycastle ext
+LOCAL_JAVA_LIBRARIES := core-oj core-libart core-lambda-stubs conscrypt okhttp core-junit bouncycastle ext
LOCAL_MODULE := framework
diff --git a/api/current.txt b/api/current.txt
index af6dec3..7c758b2 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -48341,6 +48341,7 @@
method public static long doubleToRawLongBits(double);
method public double doubleValue();
method public float floatValue();
+ method public static int hashCode(double);
method public int intValue();
method public static boolean isInfinite(double);
method public boolean isInfinite();
@@ -48348,11 +48349,15 @@
method public boolean isNaN();
method public static double longBitsToDouble(long);
method public long longValue();
+ method public static double max(double, double);
+ method public static double min(double, double);
method public static double parseDouble(java.lang.String) throws java.lang.NumberFormatException;
+ method public static double sum(double, double);
method public static java.lang.String toHexString(double);
method public static java.lang.String toString(double);
method public static java.lang.Double valueOf(java.lang.String) throws java.lang.NumberFormatException;
method public static java.lang.Double valueOf(double);
+ field public static final int BYTES = 8; // 0x8
field public static final int MAX_EXPONENT = 1023; // 0x3ff
field public static final double MAX_VALUE = 1.7976931348623157E308;
field public static final int MIN_EXPONENT = -1022; // 0xfffffc02
@@ -48515,10 +48520,13 @@
method public static java.lang.Integer getInteger(java.lang.String);
method public static java.lang.Integer getInteger(java.lang.String, int);
method public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer);
+ method public static int hashCode(int);
method public static int highestOneBit(int);
method public int intValue();
method public long longValue();
method public static int lowestOneBit(int);
+ method public static int max(int, int);
+ method public static int min(int, int);
method public static int numberOfLeadingZeros(int);
method public static int numberOfTrailingZeros(int);
method public static int parseInt(java.lang.String, int) throws java.lang.NumberFormatException;
@@ -48528,6 +48536,7 @@
method public static int rotateLeft(int, int);
method public static int rotateRight(int, int);
method public static int signum(int);
+ method public static int sum(int, int);
method public static java.lang.String toBinaryString(int);
method public static java.lang.String toHexString(int);
method public static java.lang.String toOctalString(int);
@@ -48536,6 +48545,7 @@
method public static java.lang.Integer valueOf(java.lang.String, int) throws java.lang.NumberFormatException;
method public static java.lang.Integer valueOf(java.lang.String) throws java.lang.NumberFormatException;
method public static java.lang.Integer valueOf(int);
+ field public static final int BYTES = 4; // 0x4
field public static final int MAX_VALUE = 2147483647; // 0x7fffffff
field public static final int MIN_VALUE = -2147483648; // 0x80000000
field public static final int SIZE = 32; // 0x20
@@ -48555,6 +48565,7 @@
}
public abstract interface Iterable {
+ method public default void forEach(java.util.function.Consumer<? super T>);
method public abstract java.util.Iterator<T> iterator();
}
@@ -48576,10 +48587,13 @@
method public static java.lang.Long getLong(java.lang.String);
method public static java.lang.Long getLong(java.lang.String, long);
method public static java.lang.Long getLong(java.lang.String, java.lang.Long);
+ method public static int hashCode(long);
method public static long highestOneBit(long);
method public int intValue();
method public long longValue();
method public static long lowestOneBit(long);
+ method public static long max(long, long);
+ method public static long min(long, long);
method public static int numberOfLeadingZeros(long);
method public static int numberOfTrailingZeros(long);
method public static long parseLong(java.lang.String, int) throws java.lang.NumberFormatException;
@@ -48589,6 +48603,7 @@
method public static long rotateLeft(long, int);
method public static long rotateRight(long, int);
method public static int signum(long);
+ method public static long sum(long, long);
method public static java.lang.String toBinaryString(long);
method public static java.lang.String toHexString(long);
method public static java.lang.String toOctalString(long);
@@ -51008,7 +51023,7 @@
ctor public ConnectionPendingException();
}
- public abstract class DatagramChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ByteChannel java.nio.channels.GatheringByteChannel java.nio.channels.ScatteringByteChannel {
+ public abstract class DatagramChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ByteChannel java.nio.channels.GatheringByteChannel java.nio.channels.NetworkChannel java.nio.channels.ScatteringByteChannel {
ctor protected DatagramChannel(java.nio.channels.spi.SelectorProvider);
method public abstract java.nio.channels.DatagramChannel bind(java.net.SocketAddress) throws java.io.IOException;
method public abstract java.nio.channels.DatagramChannel connect(java.net.SocketAddress) throws java.io.IOException;
@@ -52031,6 +52046,7 @@
public abstract class Provider extends java.util.Properties {
ctor protected Provider(java.lang.String, double, java.lang.String);
+ method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>);
method public java.lang.String getInfo();
method public java.lang.String getName();
method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String);
@@ -54982,6 +54998,7 @@
ctor public ArrayList(java.util.Collection<? extends E>);
method public java.lang.Object clone();
method public void ensureCapacity(int);
+ method public void forEach(java.util.function.Consumer<? super E>);
method public E get(int);
method public int size();
method public void trimToSize();
@@ -55545,6 +55562,7 @@
ctor public HashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
}
public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
@@ -55569,6 +55587,7 @@
method public boolean containsValue(java.lang.Object);
method public synchronized java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public synchronized V get(java.lang.Object);
method public synchronized boolean isEmpty();
method public java.util.Set<K> keySet();
@@ -55587,6 +55606,7 @@
ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
}
public class IllegalFormatCodePointException extends java.util.IllegalFormatException {
@@ -55826,6 +55846,7 @@
method public abstract boolean containsValue(java.lang.Object);
method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet();
method public abstract boolean equals(java.lang.Object);
+ method public default void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public abstract V get(java.lang.Object);
method public abstract int hashCode();
method public abstract boolean isEmpty();
@@ -55914,8 +55935,11 @@
method public static boolean equals(java.lang.Object, java.lang.Object);
method public static int hash(java.lang.Object...);
method public static int hashCode(java.lang.Object);
+ method public static boolean isNull(java.lang.Object);
+ method public static boolean nonNull(java.lang.Object);
method public static T requireNonNull(T);
method public static T requireNonNull(T, java.lang.String);
+ method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
method public static java.lang.String toString(java.lang.Object);
method public static java.lang.String toString(java.lang.Object, java.lang.String);
}
@@ -56284,6 +56308,7 @@
method public K firstKey();
method public java.util.Map.Entry<K, V> floorEntry(K);
method public K floorKey(K);
+ method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public java.util.NavigableMap<K, V> headMap(K, boolean);
method public java.util.SortedMap<K, V> headMap(K);
method public java.util.Map.Entry<K, V> higherEntry(K);
@@ -56366,6 +56391,7 @@
method public java.util.Enumeration<E> elements();
method public synchronized void ensureCapacity(int);
method public synchronized E firstElement();
+ method public synchronized void forEach(java.util.function.Consumer<? super E>);
method public synchronized E get(int);
method public synchronized int indexOf(java.lang.Object, int);
method public synchronized void insertElementAt(E, int);
@@ -56389,6 +56415,7 @@
ctor public WeakHashMap();
ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>);
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
}
}
@@ -57620,6 +57647,217 @@
}
+package java.util.function {
+
+ public abstract interface BiConsumer {
+ method public abstract void accept(T, U);
+ method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>);
+ }
+
+ public abstract interface BiFunction {
+ method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
+ method public abstract R apply(T, U);
+ }
+
+ public abstract interface BiPredicate {
+ method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>);
+ method public default java.util.function.BiPredicate<T, U> negate();
+ method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>);
+ method public abstract boolean test(T, U);
+ }
+
+ public abstract interface BinaryOperator implements java.util.function.BiFunction {
+ method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
+ method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
+ }
+
+ public abstract interface BooleanSupplier {
+ method public abstract boolean getAsBoolean();
+ }
+
+ public abstract interface Consumer {
+ method public abstract void accept(T);
+ method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>);
+ }
+
+ public abstract interface DoubleBinaryOperator {
+ method public abstract double applyAsDouble(double, double);
+ }
+
+ public abstract interface DoubleConsumer {
+ method public abstract void accept(double);
+ method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);
+ }
+
+ public abstract interface DoubleFunction {
+ method public abstract R apply(double);
+ }
+
+ public abstract interface DoublePredicate {
+ method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate);
+ method public default java.util.function.DoublePredicate negate();
+ method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate);
+ method public abstract boolean test(double);
+ }
+
+ public abstract interface DoubleSupplier {
+ method public abstract double getAsDouble();
+ }
+
+ public abstract interface DoubleToIntFunction {
+ method public abstract int applyAsInt(double);
+ }
+
+ public abstract interface DoubleToLongFunction {
+ method public abstract long applyAsLong(double);
+ }
+
+ public abstract interface DoubleUnaryOperator {
+ method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator);
+ method public abstract double applyAsDouble(double);
+ method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator);
+ method public static java.util.function.DoubleUnaryOperator identity();
+ }
+
+ public abstract interface Function {
+ method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
+ method public abstract R apply(T);
+ method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
+ method public static java.util.function.Function<T, T> identity();
+ }
+
+ public abstract interface IntBinaryOperator {
+ method public abstract int applyAsInt(int, int);
+ }
+
+ public abstract interface IntConsumer {
+ method public abstract void accept(int);
+ method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer);
+ }
+
+ public abstract interface IntFunction {
+ method public abstract R apply(int);
+ }
+
+ public abstract interface IntPredicate {
+ method public default java.util.function.IntPredicate and(java.util.function.IntPredicate);
+ method public default java.util.function.IntPredicate negate();
+ method public default java.util.function.IntPredicate or(java.util.function.IntPredicate);
+ method public abstract boolean test(int);
+ }
+
+ public abstract interface IntSupplier {
+ method public abstract int getAsInt();
+ }
+
+ public abstract interface IntToDoubleFunction {
+ method public abstract double applyAsDouble(int);
+ }
+
+ public abstract interface IntToLongFunction {
+ method public abstract long applyAsLong(int);
+ }
+
+ public abstract interface IntUnaryOperator {
+ method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator);
+ method public abstract int applyAsInt(int);
+ method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator);
+ method public static java.util.function.IntUnaryOperator identity();
+ }
+
+ public abstract interface LongBinaryOperator {
+ method public abstract long applyAsLong(long, long);
+ }
+
+ public abstract interface LongConsumer {
+ method public abstract void accept(long);
+ method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer);
+ }
+
+ public abstract interface LongFunction {
+ method public abstract R apply(long);
+ }
+
+ public abstract interface LongPredicate {
+ method public default java.util.function.LongPredicate and(java.util.function.LongPredicate);
+ method public default java.util.function.LongPredicate negate();
+ method public default java.util.function.LongPredicate or(java.util.function.LongPredicate);
+ method public abstract boolean test(long);
+ }
+
+ public abstract interface LongSupplier {
+ method public abstract long getAsLong();
+ }
+
+ public abstract interface LongToDoubleFunction {
+ method public abstract double applyAsDouble(long);
+ }
+
+ public abstract interface LongToIntFunction {
+ method public abstract int applyAsInt(long);
+ }
+
+ public abstract interface LongUnaryOperator {
+ method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator);
+ method public abstract long applyAsLong(long);
+ method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator);
+ method public static java.util.function.LongUnaryOperator identity();
+ }
+
+ public abstract interface ObjDoubleConsumer {
+ method public abstract void accept(T, double);
+ }
+
+ public abstract interface ObjIntConsumer {
+ method public abstract void accept(T, int);
+ }
+
+ public abstract interface ObjLongConsumer {
+ method public abstract void accept(T, long);
+ }
+
+ public abstract interface Predicate {
+ method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>);
+ method public static java.util.function.Predicate<T> isEqual(java.lang.Object);
+ method public default java.util.function.Predicate<T> negate();
+ method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>);
+ method public abstract boolean test(T);
+ }
+
+ public abstract interface Supplier {
+ method public abstract T get();
+ }
+
+ public abstract interface ToDoubleBiFunction {
+ method public abstract double applyAsDouble(T, U);
+ }
+
+ public abstract interface ToDoubleFunction {
+ method public abstract double applyAsDouble(T);
+ }
+
+ public abstract interface ToIntBiFunction {
+ method public abstract int applyAsInt(T, U);
+ }
+
+ public abstract interface ToIntFunction {
+ method public abstract int applyAsInt(T);
+ }
+
+ public abstract interface ToLongBiFunction {
+ method public abstract long applyAsLong(T, U);
+ }
+
+ public abstract interface ToLongFunction {
+ method public abstract long applyAsLong(T);
+ }
+
+ public abstract interface UnaryOperator implements java.util.function.Function {
+ method public static java.util.function.UnaryOperator<T> identity();
+ }
+
+}
+
package java.util.jar {
public class Attributes implements java.lang.Cloneable java.util.Map {
diff --git a/api/system-current.txt b/api/system-current.txt
index 8f6ee67..b78f7e7 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -50959,6 +50959,7 @@
method public static long doubleToRawLongBits(double);
method public double doubleValue();
method public float floatValue();
+ method public static int hashCode(double);
method public int intValue();
method public static boolean isInfinite(double);
method public boolean isInfinite();
@@ -50966,11 +50967,15 @@
method public boolean isNaN();
method public static double longBitsToDouble(long);
method public long longValue();
+ method public static double max(double, double);
+ method public static double min(double, double);
method public static double parseDouble(java.lang.String) throws java.lang.NumberFormatException;
+ method public static double sum(double, double);
method public static java.lang.String toHexString(double);
method public static java.lang.String toString(double);
method public static java.lang.Double valueOf(java.lang.String) throws java.lang.NumberFormatException;
method public static java.lang.Double valueOf(double);
+ field public static final int BYTES = 8; // 0x8
field public static final int MAX_EXPONENT = 1023; // 0x3ff
field public static final double MAX_VALUE = 1.7976931348623157E308;
field public static final int MIN_EXPONENT = -1022; // 0xfffffc02
@@ -51133,10 +51138,13 @@
method public static java.lang.Integer getInteger(java.lang.String);
method public static java.lang.Integer getInteger(java.lang.String, int);
method public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer);
+ method public static int hashCode(int);
method public static int highestOneBit(int);
method public int intValue();
method public long longValue();
method public static int lowestOneBit(int);
+ method public static int max(int, int);
+ method public static int min(int, int);
method public static int numberOfLeadingZeros(int);
method public static int numberOfTrailingZeros(int);
method public static int parseInt(java.lang.String, int) throws java.lang.NumberFormatException;
@@ -51146,6 +51154,7 @@
method public static int rotateLeft(int, int);
method public static int rotateRight(int, int);
method public static int signum(int);
+ method public static int sum(int, int);
method public static java.lang.String toBinaryString(int);
method public static java.lang.String toHexString(int);
method public static java.lang.String toOctalString(int);
@@ -51154,6 +51163,7 @@
method public static java.lang.Integer valueOf(java.lang.String, int) throws java.lang.NumberFormatException;
method public static java.lang.Integer valueOf(java.lang.String) throws java.lang.NumberFormatException;
method public static java.lang.Integer valueOf(int);
+ field public static final int BYTES = 4; // 0x4
field public static final int MAX_VALUE = 2147483647; // 0x7fffffff
field public static final int MIN_VALUE = -2147483648; // 0x80000000
field public static final int SIZE = 32; // 0x20
@@ -51173,6 +51183,7 @@
}
public abstract interface Iterable {
+ method public default void forEach(java.util.function.Consumer<? super T>);
method public abstract java.util.Iterator<T> iterator();
}
@@ -51194,10 +51205,13 @@
method public static java.lang.Long getLong(java.lang.String);
method public static java.lang.Long getLong(java.lang.String, long);
method public static java.lang.Long getLong(java.lang.String, java.lang.Long);
+ method public static int hashCode(long);
method public static long highestOneBit(long);
method public int intValue();
method public long longValue();
method public static long lowestOneBit(long);
+ method public static long max(long, long);
+ method public static long min(long, long);
method public static int numberOfLeadingZeros(long);
method public static int numberOfTrailingZeros(long);
method public static long parseLong(java.lang.String, int) throws java.lang.NumberFormatException;
@@ -51207,6 +51221,7 @@
method public static long rotateLeft(long, int);
method public static long rotateRight(long, int);
method public static int signum(long);
+ method public static long sum(long, long);
method public static java.lang.String toBinaryString(long);
method public static java.lang.String toHexString(long);
method public static java.lang.String toOctalString(long);
@@ -53626,7 +53641,7 @@
ctor public ConnectionPendingException();
}
- public abstract class DatagramChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ByteChannel java.nio.channels.GatheringByteChannel java.nio.channels.ScatteringByteChannel {
+ public abstract class DatagramChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ByteChannel java.nio.channels.GatheringByteChannel java.nio.channels.NetworkChannel java.nio.channels.ScatteringByteChannel {
ctor protected DatagramChannel(java.nio.channels.spi.SelectorProvider);
method public abstract java.nio.channels.DatagramChannel bind(java.net.SocketAddress) throws java.io.IOException;
method public abstract java.nio.channels.DatagramChannel connect(java.net.SocketAddress) throws java.io.IOException;
@@ -54649,6 +54664,7 @@
public abstract class Provider extends java.util.Properties {
ctor protected Provider(java.lang.String, double, java.lang.String);
+ method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>);
method public java.lang.String getInfo();
method public java.lang.String getName();
method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String);
@@ -57600,6 +57616,7 @@
ctor public ArrayList(java.util.Collection<? extends E>);
method public java.lang.Object clone();
method public void ensureCapacity(int);
+ method public void forEach(java.util.function.Consumer<? super E>);
method public E get(int);
method public int size();
method public void trimToSize();
@@ -58163,6 +58180,7 @@
ctor public HashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
}
public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
@@ -58187,6 +58205,7 @@
method public boolean containsValue(java.lang.Object);
method public synchronized java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public synchronized V get(java.lang.Object);
method public synchronized boolean isEmpty();
method public java.util.Set<K> keySet();
@@ -58205,6 +58224,7 @@
ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
}
public class IllegalFormatCodePointException extends java.util.IllegalFormatException {
@@ -58444,6 +58464,7 @@
method public abstract boolean containsValue(java.lang.Object);
method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet();
method public abstract boolean equals(java.lang.Object);
+ method public default void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public abstract V get(java.lang.Object);
method public abstract int hashCode();
method public abstract boolean isEmpty();
@@ -58532,8 +58553,11 @@
method public static boolean equals(java.lang.Object, java.lang.Object);
method public static int hash(java.lang.Object...);
method public static int hashCode(java.lang.Object);
+ method public static boolean isNull(java.lang.Object);
+ method public static boolean nonNull(java.lang.Object);
method public static T requireNonNull(T);
method public static T requireNonNull(T, java.lang.String);
+ method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
method public static java.lang.String toString(java.lang.Object);
method public static java.lang.String toString(java.lang.Object, java.lang.String);
}
@@ -58902,6 +58926,7 @@
method public K firstKey();
method public java.util.Map.Entry<K, V> floorEntry(K);
method public K floorKey(K);
+ method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public java.util.NavigableMap<K, V> headMap(K, boolean);
method public java.util.SortedMap<K, V> headMap(K);
method public java.util.Map.Entry<K, V> higherEntry(K);
@@ -58984,6 +59009,7 @@
method public java.util.Enumeration<E> elements();
method public synchronized void ensureCapacity(int);
method public synchronized E firstElement();
+ method public synchronized void forEach(java.util.function.Consumer<? super E>);
method public synchronized E get(int);
method public synchronized int indexOf(java.lang.Object, int);
method public synchronized void insertElementAt(E, int);
@@ -59007,6 +59033,7 @@
ctor public WeakHashMap();
ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>);
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
}
}
@@ -60238,6 +60265,217 @@
}
+package java.util.function {
+
+ public abstract interface BiConsumer {
+ method public abstract void accept(T, U);
+ method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>);
+ }
+
+ public abstract interface BiFunction {
+ method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
+ method public abstract R apply(T, U);
+ }
+
+ public abstract interface BiPredicate {
+ method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>);
+ method public default java.util.function.BiPredicate<T, U> negate();
+ method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>);
+ method public abstract boolean test(T, U);
+ }
+
+ public abstract interface BinaryOperator implements java.util.function.BiFunction {
+ method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
+ method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
+ }
+
+ public abstract interface BooleanSupplier {
+ method public abstract boolean getAsBoolean();
+ }
+
+ public abstract interface Consumer {
+ method public abstract void accept(T);
+ method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>);
+ }
+
+ public abstract interface DoubleBinaryOperator {
+ method public abstract double applyAsDouble(double, double);
+ }
+
+ public abstract interface DoubleConsumer {
+ method public abstract void accept(double);
+ method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);
+ }
+
+ public abstract interface DoubleFunction {
+ method public abstract R apply(double);
+ }
+
+ public abstract interface DoublePredicate {
+ method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate);
+ method public default java.util.function.DoublePredicate negate();
+ method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate);
+ method public abstract boolean test(double);
+ }
+
+ public abstract interface DoubleSupplier {
+ method public abstract double getAsDouble();
+ }
+
+ public abstract interface DoubleToIntFunction {
+ method public abstract int applyAsInt(double);
+ }
+
+ public abstract interface DoubleToLongFunction {
+ method public abstract long applyAsLong(double);
+ }
+
+ public abstract interface DoubleUnaryOperator {
+ method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator);
+ method public abstract double applyAsDouble(double);
+ method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator);
+ method public static java.util.function.DoubleUnaryOperator identity();
+ }
+
+ public abstract interface Function {
+ method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
+ method public abstract R apply(T);
+ method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
+ method public static java.util.function.Function<T, T> identity();
+ }
+
+ public abstract interface IntBinaryOperator {
+ method public abstract int applyAsInt(int, int);
+ }
+
+ public abstract interface IntConsumer {
+ method public abstract void accept(int);
+ method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer);
+ }
+
+ public abstract interface IntFunction {
+ method public abstract R apply(int);
+ }
+
+ public abstract interface IntPredicate {
+ method public default java.util.function.IntPredicate and(java.util.function.IntPredicate);
+ method public default java.util.function.IntPredicate negate();
+ method public default java.util.function.IntPredicate or(java.util.function.IntPredicate);
+ method public abstract boolean test(int);
+ }
+
+ public abstract interface IntSupplier {
+ method public abstract int getAsInt();
+ }
+
+ public abstract interface IntToDoubleFunction {
+ method public abstract double applyAsDouble(int);
+ }
+
+ public abstract interface IntToLongFunction {
+ method public abstract long applyAsLong(int);
+ }
+
+ public abstract interface IntUnaryOperator {
+ method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator);
+ method public abstract int applyAsInt(int);
+ method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator);
+ method public static java.util.function.IntUnaryOperator identity();
+ }
+
+ public abstract interface LongBinaryOperator {
+ method public abstract long applyAsLong(long, long);
+ }
+
+ public abstract interface LongConsumer {
+ method public abstract void accept(long);
+ method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer);
+ }
+
+ public abstract interface LongFunction {
+ method public abstract R apply(long);
+ }
+
+ public abstract interface LongPredicate {
+ method public default java.util.function.LongPredicate and(java.util.function.LongPredicate);
+ method public default java.util.function.LongPredicate negate();
+ method public default java.util.function.LongPredicate or(java.util.function.LongPredicate);
+ method public abstract boolean test(long);
+ }
+
+ public abstract interface LongSupplier {
+ method public abstract long getAsLong();
+ }
+
+ public abstract interface LongToDoubleFunction {
+ method public abstract double applyAsDouble(long);
+ }
+
+ public abstract interface LongToIntFunction {
+ method public abstract int applyAsInt(long);
+ }
+
+ public abstract interface LongUnaryOperator {
+ method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator);
+ method public abstract long applyAsLong(long);
+ method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator);
+ method public static java.util.function.LongUnaryOperator identity();
+ }
+
+ public abstract interface ObjDoubleConsumer {
+ method public abstract void accept(T, double);
+ }
+
+ public abstract interface ObjIntConsumer {
+ method public abstract void accept(T, int);
+ }
+
+ public abstract interface ObjLongConsumer {
+ method public abstract void accept(T, long);
+ }
+
+ public abstract interface Predicate {
+ method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>);
+ method public static java.util.function.Predicate<T> isEqual(java.lang.Object);
+ method public default java.util.function.Predicate<T> negate();
+ method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>);
+ method public abstract boolean test(T);
+ }
+
+ public abstract interface Supplier {
+ method public abstract T get();
+ }
+
+ public abstract interface ToDoubleBiFunction {
+ method public abstract double applyAsDouble(T, U);
+ }
+
+ public abstract interface ToDoubleFunction {
+ method public abstract double applyAsDouble(T);
+ }
+
+ public abstract interface ToIntBiFunction {
+ method public abstract int applyAsInt(T, U);
+ }
+
+ public abstract interface ToIntFunction {
+ method public abstract int applyAsInt(T);
+ }
+
+ public abstract interface ToLongBiFunction {
+ method public abstract long applyAsLong(T, U);
+ }
+
+ public abstract interface ToLongFunction {
+ method public abstract long applyAsLong(T);
+ }
+
+ public abstract interface UnaryOperator implements java.util.function.Function {
+ method public static java.util.function.UnaryOperator<T> identity();
+ }
+
+}
+
package java.util.jar {
public class Attributes implements java.lang.Cloneable java.util.Map {
diff --git a/cmds/app_process/Android.mk b/cmds/app_process/Android.mk
index 51bbb81..3ae9e12 100644
--- a/cmds/app_process/Android.mk
+++ b/cmds/app_process/Android.mk
@@ -20,6 +20,7 @@
libutils \
liblog \
libbinder \
+ libnativeloader \
libandroid_runtime \
$(app_process_common_shared_libs) \
@@ -52,6 +53,7 @@
libutils \
liblog \
libbinder \
+ libnativeloader \
libandroid_runtime \
$(app_process_common_shared_libs) \
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 2e02382..8bcbf51 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -21,6 +21,7 @@
#include <cutils/properties.h>
#include <cutils/trace.h>
#include <android_runtime/AndroidRuntime.h>
+#include <nativeloader/native_loader.h>
#include <private/android_filesystem_config.h> // for AID_SYSTEM
namespace android {
@@ -304,6 +305,7 @@
}
if (zygote) {
+ PreloadPublicNativeLibraries();
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} else if (className) {
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 436aed1..79c7929 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -941,18 +941,19 @@
@Override
public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin,
- boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) {
+ boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly,
+ boolean dumpUnreachable, String[] args) {
FileOutputStream fout = new FileOutputStream(fd);
PrintWriter pw = new FastPrintWriter(fout);
try {
- dumpMemInfo(pw, mem, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly);
+ dumpMemInfo(pw, mem, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly, dumpUnreachable);
} finally {
pw.flush();
}
}
private void dumpMemInfo(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin,
- boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly) {
+ boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable) {
long nativeMax = Debug.getNativeHeapSize() / 1024;
long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024;
long nativeFree = Debug.getNativeHeapFreeSize() / 1024;
@@ -1066,6 +1067,16 @@
pw.println(" Asset Allocations");
pw.print(assetAlloc);
}
+
+ // Unreachable native memory
+ if (dumpUnreachable) {
+ boolean showContents = ((mBoundApplication != null)
+ && ((mBoundApplication.appInfo.flags&ApplicationInfo.FLAG_DEBUGGABLE) != 0))
+ || android.os.Build.IS_DEBUGGABLE;
+ pw.println(" ");
+ pw.println(" Unreachable memory");
+ pw.print(Debug.getUnreachableMemory(100, showContents));
+ }
}
@Override
diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java
index b9ebd9f..1330d1c 100644
--- a/core/java/android/app/ApplicationThreadNative.java
+++ b/core/java/android/app/ApplicationThreadNative.java
@@ -534,11 +534,12 @@
boolean dumpInfo = data.readInt() != 0;
boolean dumpDalvik = data.readInt() != 0;
boolean dumpSummaryOnly = data.readInt() != 0;
+ boolean dumpUnreachable = data.readInt() != 0;
String[] args = data.readStringArray();
if (fd != null) {
try {
dumpMemInfo(fd.getFileDescriptor(), mi, checkin, dumpInfo,
- dumpDalvik, dumpSummaryOnly, args);
+ dumpDalvik, dumpSummaryOnly, dumpUnreachable, args);
} finally {
try {
fd.close();
@@ -1261,7 +1262,8 @@
}
public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin,
- boolean dumpInfo, boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) throws RemoteException {
+ boolean dumpInfo, boolean dumpDalvik, boolean dumpSummaryOnly,
+ boolean dumpUnreachable, String[] args) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
@@ -1271,6 +1273,7 @@
data.writeInt(dumpInfo ? 1 : 0);
data.writeInt(dumpDalvik ? 1 : 0);
data.writeInt(dumpSummaryOnly ? 1 : 0);
+ data.writeInt(dumpUnreachable ? 1 : 0);
data.writeStringArray(args);
mRemote.transact(DUMP_MEM_INFO_TRANSACTION, data, reply, 0);
reply.readException();
diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java
index e204d50..e9a5796 100644
--- a/core/java/android/app/IApplicationThread.java
+++ b/core/java/android/app/IApplicationThread.java
@@ -132,7 +132,8 @@
void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) throws RemoteException;
void scheduleTrimMemory(int level) throws RemoteException;
void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, boolean dumpInfo,
- boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) throws RemoteException;
+ boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable,
+ String[] args) throws RemoteException;
void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException;
void dumpDbInfo(FileDescriptor fd, String[] args) throws RemoteException;
void unstableProviderDied(IBinder provider) throws RemoteException;
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 9819a97..82c4604 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -261,147 +261,148 @@
return mClassLoader;
}
- if (mIncludeCode && !mPackageName.equals("android")) {
- // Avoid the binder call when the package is the current application package.
- // The activity manager will perform ensure that dexopt is performed before
- // spinning up the process.
- if (!Objects.equals(mPackageName, ActivityThread.currentPackageName())) {
- final String isa = VMRuntime.getRuntime().vmInstructionSet();
- try {
- ActivityThread.getPackageManager().performDexOptIfNeeded(mPackageName, isa);
- } catch (RemoteException re) {
- // Ignored.
- }
- }
-
- final List<String> zipPaths = new ArrayList<>();
- final List<String> apkPaths = new ArrayList<>();
- final List<String> libPaths = new ArrayList<>();
-
- if (mRegisterPackage) {
- try {
- ActivityManagerNative.getDefault().addPackageDependency(mPackageName);
- } catch (RemoteException e) {
- }
- }
-
- zipPaths.add(mAppDir);
- if (mSplitAppDirs != null) {
- Collections.addAll(zipPaths, mSplitAppDirs);
- }
-
- libPaths.add(mLibDir);
-
- /*
- * The following is a bit of a hack to inject
- * instrumentation into the system: If the app
- * being started matches one of the instrumentation names,
- * then we combine both the "instrumentation" and
- * "instrumented" app into the path, along with the
- * concatenation of both apps' shared library lists.
- */
-
- String instrumentationPackageName = mActivityThread.mInstrumentationPackageName;
- String instrumentationAppDir = mActivityThread.mInstrumentationAppDir;
- String[] instrumentationSplitAppDirs = mActivityThread.mInstrumentationSplitAppDirs;
- String instrumentationLibDir = mActivityThread.mInstrumentationLibDir;
-
- String instrumentedAppDir = mActivityThread.mInstrumentedAppDir;
- String[] instrumentedSplitAppDirs = mActivityThread.mInstrumentedSplitAppDirs;
- String instrumentedLibDir = mActivityThread.mInstrumentedLibDir;
- String[] instrumentationLibs = null;
-
- if (mAppDir.equals(instrumentationAppDir)
- || mAppDir.equals(instrumentedAppDir)) {
- zipPaths.clear();
- zipPaths.add(instrumentationAppDir);
- if (instrumentationSplitAppDirs != null) {
- Collections.addAll(zipPaths, instrumentationSplitAppDirs);
- }
- zipPaths.add(instrumentedAppDir);
- if (instrumentedSplitAppDirs != null) {
- Collections.addAll(zipPaths, instrumentedSplitAppDirs);
- }
-
- libPaths.clear();
- libPaths.add(instrumentationLibDir);
- libPaths.add(instrumentedLibDir);
-
- if (!instrumentedAppDir.equals(instrumentationAppDir)) {
- instrumentationLibs = getLibrariesFor(instrumentationPackageName);
- }
- }
-
- apkPaths.addAll(zipPaths);
-
- if (mSharedLibraries != null) {
- for (String lib : mSharedLibraries) {
- if (!zipPaths.contains(lib)) {
- zipPaths.add(0, lib);
- }
- }
- }
-
- if (instrumentationLibs != null) {
- for (String lib : instrumentationLibs) {
- if (!zipPaths.contains(lib)) {
- zipPaths.add(0, lib);
- }
- }
- }
-
- final String zip = TextUtils.join(File.pathSeparator, zipPaths);
-
- // Add path to libraries in apk for current abi
- if (mApplicationInfo.primaryCpuAbi != null) {
- for (String apk : apkPaths) {
- libPaths.add(apk + "!/lib/" + mApplicationInfo.primaryCpuAbi);
- }
- }
-
- String libraryPermittedPath = mDataDir;
- boolean isBundledApp = false;
-
- if (mApplicationInfo.isSystemApp()) {
- isBundledApp = true;
- // Add path to system libraries to libPaths;
- // Access to system libs should be limited
- // to bundled applications; this is why updated
- // system apps are not included.
- libPaths.add(System.getProperty("java.library.path"));
-
- // This is necessary to grant bundled apps access to
- // libraries located in subdirectories of /system/lib
- libraryPermittedPath += File.pathSeparator +
- System.getProperty("java.library.path");
- }
-
- final String librarySearchPath = TextUtils.join(File.pathSeparator, libPaths);
-
- /*
- * With all the combination done (if necessary, actually
- * create the class loader.
- */
-
- if (ActivityThread.localLOGV)
- Slog.v(ActivityThread.TAG, "Class path: " + zip +
- ", JNI path: " + librarySearchPath);
-
- // Temporarily disable logging of disk reads on the Looper thread
- // as this is early and necessary.
- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
-
- mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, isBundledApp,
- librarySearchPath, libraryPermittedPath, mBaseClassLoader);
-
- StrictMode.setThreadPolicy(oldPolicy);
- } else {
+ if (mPackageName.equals("android")) {
if (mBaseClassLoader == null) {
mClassLoader = ClassLoader.getSystemClassLoader();
} else {
mClassLoader = mBaseClassLoader;
}
+ return mClassLoader;
}
+
+ // Avoid the binder call when the package is the current application package.
+ // The activity manager will perform ensure that dexopt is performed before
+ // spinning up the process.
+ if (!Objects.equals(mPackageName, ActivityThread.currentPackageName())) {
+ final String isa = VMRuntime.getRuntime().vmInstructionSet();
+ try {
+ ActivityThread.getPackageManager().performDexOptIfNeeded(mPackageName, isa);
+ } catch (RemoteException re) {
+ // Ignored.
+ }
+ }
+
+ final List<String> zipPaths = new ArrayList<>();
+ final List<String> apkPaths = new ArrayList<>();
+ final List<String> libPaths = new ArrayList<>();
+
+ if (mRegisterPackage) {
+ try {
+ ActivityManagerNative.getDefault().addPackageDependency(mPackageName);
+ } catch (RemoteException e) {
+ }
+ }
+
+ zipPaths.add(mAppDir);
+ if (mSplitAppDirs != null) {
+ Collections.addAll(zipPaths, mSplitAppDirs);
+ }
+
+ libPaths.add(mLibDir);
+
+ /*
+ * The following is a bit of a hack to inject
+ * instrumentation into the system: If the app
+ * being started matches one of the instrumentation names,
+ * then we combine both the "instrumentation" and
+ * "instrumented" app into the path, along with the
+ * concatenation of both apps' shared library lists.
+ */
+
+ String instrumentationPackageName = mActivityThread.mInstrumentationPackageName;
+ String instrumentationAppDir = mActivityThread.mInstrumentationAppDir;
+ String[] instrumentationSplitAppDirs = mActivityThread.mInstrumentationSplitAppDirs;
+ String instrumentationLibDir = mActivityThread.mInstrumentationLibDir;
+
+ String instrumentedAppDir = mActivityThread.mInstrumentedAppDir;
+ String[] instrumentedSplitAppDirs = mActivityThread.mInstrumentedSplitAppDirs;
+ String instrumentedLibDir = mActivityThread.mInstrumentedLibDir;
+ String[] instrumentationLibs = null;
+
+ if (mAppDir.equals(instrumentationAppDir)
+ || mAppDir.equals(instrumentedAppDir)) {
+ zipPaths.clear();
+ zipPaths.add(instrumentationAppDir);
+ if (instrumentationSplitAppDirs != null) {
+ Collections.addAll(zipPaths, instrumentationSplitAppDirs);
+ }
+ zipPaths.add(instrumentedAppDir);
+ if (instrumentedSplitAppDirs != null) {
+ Collections.addAll(zipPaths, instrumentedSplitAppDirs);
+ }
+
+ libPaths.clear();
+ libPaths.add(instrumentationLibDir);
+ libPaths.add(instrumentedLibDir);
+
+ if (!instrumentedAppDir.equals(instrumentationAppDir)) {
+ instrumentationLibs = getLibrariesFor(instrumentationPackageName);
+ }
+ }
+
+ apkPaths.addAll(zipPaths);
+
+ if (mSharedLibraries != null) {
+ for (String lib : mSharedLibraries) {
+ if (!zipPaths.contains(lib)) {
+ zipPaths.add(0, lib);
+ }
+ }
+ }
+
+ if (instrumentationLibs != null) {
+ for (String lib : instrumentationLibs) {
+ if (!zipPaths.contains(lib)) {
+ zipPaths.add(0, lib);
+ }
+ }
+ }
+
+ final String zip = mIncludeCode ? TextUtils.join(File.pathSeparator, zipPaths) : "";
+
+ // Add path to libraries in apk for current abi
+ if (mApplicationInfo.primaryCpuAbi != null) {
+ for (String apk : apkPaths) {
+ libPaths.add(apk + "!/lib/" + mApplicationInfo.primaryCpuAbi);
+ }
+ }
+
+ String libraryPermittedPath = mDataDir;
+ boolean isBundledApp = false;
+
+ if (mApplicationInfo.isSystemApp()) {
+ isBundledApp = true;
+ // Add path to system libraries to libPaths;
+ // Access to system libs should be limited
+ // to bundled applications; this is why updated
+ // system apps are not included.
+ libPaths.add(System.getProperty("java.library.path"));
+
+ // This is necessary to grant bundled apps access to
+ // libraries located in subdirectories of /system/lib
+ libraryPermittedPath += File.pathSeparator +
+ System.getProperty("java.library.path");
+ }
+
+ final String librarySearchPath = TextUtils.join(File.pathSeparator, libPaths);
+
+ /*
+ * With all the combination done (if necessary, actually
+ * create the class loader.
+ */
+
+ if (ActivityThread.localLOGV)
+ Slog.v(ActivityThread.TAG, "Class path: " + zip +
+ ", JNI path: " + librarySearchPath);
+
+ // Temporarily disable logging of disk reads on the Looper thread
+ // as this is early and necessary.
+ StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
+
+ mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, isBundledApp,
+ librarySearchPath, libraryPermittedPath, mBaseClassLoader);
+
+ StrictMode.setThreadPolicy(oldPolicy);
return mClassLoader;
}
}
diff --git a/core/java/android/app/NativeActivity.java b/core/java/android/app/NativeActivity.java
index b0f6bfe..20f9893 100644
--- a/core/java/android/app/NativeActivity.java
+++ b/core/java/android/app/NativeActivity.java
@@ -158,7 +158,8 @@
String path = classLoader.findLibrary(libname);
if (path == null) {
- throw new IllegalArgumentException("Unable to find native library: " + libname);
+ throw new IllegalArgumentException("Unable to find native library " + libname +
+ " using classloader: " + classLoader.toString());
}
byte[] nativeSavedState = savedInstanceState != null
diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
index b8d6960..e7b7bee 100644
--- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
+++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
@@ -1268,6 +1268,11 @@
private Size[] getInternalFormatSizes(int format, int dataspace,
boolean output, boolean highRes) {
+ // All depth formats are non-high-res.
+ if (dataspace == HAL_DATASPACE_DEPTH && highRes) {
+ return new Size[0];
+ }
+
SparseIntArray formatsMap =
!output ? mInputFormats :
dataspace == HAL_DATASPACE_DEPTH ? mDepthOutputFormats :
@@ -1286,6 +1291,8 @@
StreamConfiguration[] configurations =
(dataspace == HAL_DATASPACE_DEPTH) ? mDepthConfigurations : mConfigurations;
+ StreamConfigurationDuration[] minFrameDurations =
+ (dataspace == HAL_DATASPACE_DEPTH) ? mDepthMinFrameDurations : mMinFrameDurations;
for (StreamConfiguration config : configurations) {
int fmt = config.getFormat();
@@ -1294,8 +1301,8 @@
// Filter slow high-res output formats; include for
// highRes, remove for !highRes
long duration = 0;
- for (int i = 0; i < mMinFrameDurations.length; i++) {
- StreamConfigurationDuration d = mMinFrameDurations[i];
+ for (int i = 0; i < minFrameDurations.length; i++) {
+ StreamConfigurationDuration d = minFrameDurations[i];
if (d.getFormat() == fmt &&
d.getWidth() == config.getSize().getWidth() &&
d.getHeight() == config.getSize().getHeight()) {
@@ -1303,7 +1310,8 @@
break;
}
}
- if (highRes != (duration > DURATION_20FPS_NS)) {
+ if (dataspace != HAL_DATASPACE_DEPTH &&
+ highRes != (duration > DURATION_20FPS_NS)) {
continue;
}
}
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index fdd34f5..0489354 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -2112,6 +2112,14 @@
public static native void dumpNativeBacktraceToFile(int pid, String file);
/**
+ * Get description of unreachable native memory.
+ * @param limit the number of leaks to provide info on, 0 to only get a summary.
+ * @param contents true to include a hex dump of the contents of unreachable memory.
+ * @return the String containing a description of unreachable memory.
+ * @hide */
+ public static native String getUnreachableMemory(int limit, boolean contents);
+
+ /**
* Return a String describing the calling method and location at a particular stack depth.
* @param callStack the Thread stack
* @param depth the depth of stack to return information for.
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index d9ede93..34aa877 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -253,7 +253,8 @@
libprocessgroup \
libnativebridge \
libradio_metadata \
- libnativeloader
+ libnativeloader \
+ libmemunreachable \
LOCAL_SHARED_LIBRARIES += \
libhwui \
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index 1ee7ea8..e205e32 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -21,6 +21,7 @@
#include "utils/misc.h"
#include "cutils/debugger.h"
#include <memtrack/memtrack.h>
+#include <memunreachable/memunreachable.h>
#include <cutils/log.h>
#include <fcntl.h>
@@ -36,6 +37,9 @@
#include <ctype.h>
#include <malloc.h>
+#include <iomanip>
+#include <string>
+
namespace android
{
@@ -971,6 +975,13 @@
close(fd);
}
+static jstring android_os_Debug_getUnreachableMemory(JNIEnv* env, jobject clazz,
+ jint limit, jboolean contents)
+{
+ std::string s = GetUnreachableMemoryString(contents, limit);
+ return env->NewStringUTF(s.c_str());
+}
+
/*
* JNI registration.
*/
@@ -1006,6 +1017,8 @@
(void*)android_os_Debug_getDeathObjectCount },
{ "dumpNativeBacktraceToFile", "(ILjava/lang/String;)V",
(void*)android_os_Debug_dumpNativeBacktraceToFile },
+ { "getUnreachableMemory", "(IZ)Ljava/lang/String;",
+ (void*)android_os_Debug_getUnreachableMemory },
};
int register_android_os_Debug(JNIEnv *env)
diff --git a/core/tests/inputmethodtests/Android.mk b/core/tests/inputmethodtests/Android.mk
index 4631e65..da336af 100644
--- a/core/tests/inputmethodtests/Android.mk
+++ b/core/tests/inputmethodtests/Android.mk
@@ -10,6 +10,7 @@
LOCAL_DX_FLAGS := --core-library
LOCAL_STATIC_JAVA_LIBRARIES := core-tests android-common frameworks-core-util-lib
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_PACKAGE_NAME := FrameworksCoreInputMethodTests
diff --git a/core/tests/systemproperties/Android.mk b/core/tests/systemproperties/Android.mk
index 9f01a28..0c20876 100644
--- a/core/tests/systemproperties/Android.mk
+++ b/core/tests/systemproperties/Android.mk
@@ -12,6 +12,7 @@
LOCAL_STATIC_JAVA_LIBRARIES := core-tests android-common frameworks-core-util-lib
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_PACKAGE_NAME := FrameworksCoreSystemPropertiesTests
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_CERTIFICATE := platform
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index 3ffdb17..52e4b09 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -1243,6 +1243,14 @@
int readerHalFormat = android_view_Surface_mapPublicFormatToHalFormat(
static_cast<PublicFormat>(readerFormat));
int32_t fmt = applyFormatOverrides(buffer->flexFormat, readerHalFormat);
+ // Override the image format to HAL_PIXEL_FORMAT_YCbCr_420_888 if the actual format is
+ // NV21 or YV12. This could only happen when the Gralloc HAL version is v0.1 thus doesn't
+ // support lockycbcr(), the CpuConsumer need to use the lock() method in the
+ // lockNextBuffer() call. For Gralloc HAL v0.2 or newer, this format should already be
+ // overridden to HAL_PIXEL_FORMAT_YCbCr_420_888 for the flexible YUV compatible formats.
+ if (fmt == HAL_PIXEL_FORMAT_YCrCb_420_SP || fmt == HAL_PIXEL_FORMAT_YV12) {
+ fmt = HAL_PIXEL_FORMAT_YCbCr_420_888;
+ }
PublicFormat publicFmt = android_view_Surface_mapHalFormatDataspaceToPublicFormat(
fmt, buffer->dataSpace);
return static_cast<jint>(publicFmt);
diff --git a/media/tests/MediaFrameworkTest/Android.mk b/media/tests/MediaFrameworkTest/Android.mk
index 42da48d..6fc624b 100644
--- a/media/tests/MediaFrameworkTest/Android.mk
+++ b/media/tests/MediaFrameworkTest/Android.mk
@@ -8,6 +8,7 @@
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_STATIC_JAVA_LIBRARIES := easymocklib mockito-target core-tests android-support-test
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_PACKAGE_NAME := mediaframeworktest
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 9ff86eb..35362e0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -442,6 +442,10 @@
public void onListenerConnected() {
if (DEBUG) Log.d(TAG, "onListenerConnected");
final StatusBarNotification[] notifications = getActiveNotifications();
+ if (notifications == null) {
+ Log.w(TAG, "onListenerConnected unable to get active notifications.");
+ return;
+ }
final RankingMap currentRanking = getCurrentRanking();
mHandler.post(new Runnable() {
@Override
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index a2b1aa8..1e91a2c 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -1831,14 +1831,21 @@
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+ String errorMsg = null;
if (mBluetoothBinder == null) {
- writer.println("Bluetooth Service not connected");
+ errorMsg = "Bluetooth Service not connected";
} else {
try {
mBluetoothBinder.dump(fd, args);
} catch (RemoteException re) {
- writer.println("RemoteException while calling Bluetooth Service");
+ errorMsg = "RemoteException while calling Bluetooth Service";
}
}
+ if (errorMsg != null) {
+ // Silently return if we are extracting metrics in Protobuf format
+ if ((args.length > 0) && args[0].startsWith("--proto"))
+ return;
+ writer.println(errorMsg);
+ }
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index c589da4..18d0d0b 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -14693,6 +14693,7 @@
boolean dumpFullDetails = false;
boolean dumpDalvik = false;
boolean dumpSummaryOnly = false;
+ boolean dumpUnreachable = false;
boolean oomOnly = false;
boolean isCompact = false;
boolean localOnly = false;
@@ -14716,6 +14717,8 @@
} else if ("-s".equals(opt)) {
dumpDetails = true;
dumpSummaryOnly = true;
+ } else if ("--unreachable".equals(opt)) {
+ dumpUnreachable = true;
} else if ("--oom".equals(opt)) {
oomOnly = true;
} else if ("--local".equals(opt)) {
@@ -14862,7 +14865,7 @@
try {
pw.flush();
thread.dumpMemInfo(fd, mi, isCheckinRequest, dumpFullDetails,
- dumpDalvik, dumpSummaryOnly, innerArgs);
+ dumpDalvik, dumpSummaryOnly, dumpUnreachable, innerArgs);
} catch (RemoteException e) {
if (!isCheckinRequest) {
pw.println("Got RemoteException!");
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 6d3d5d6..68d6de4 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -11982,6 +11982,7 @@
@Override
public void waitForAllWindowsDrawn(Runnable callback, long timeout) {
+ boolean allWindowsDrawn = false;
synchronized (mWindowMap) {
mWaitingForDrawnCallback = callback;
final WindowList windows = getDefaultWindowListLocked();
@@ -12002,13 +12003,16 @@
}
}
requestTraversalLocked();
+ mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT);
+ if (mWaitingForDrawn.isEmpty()) {
+ allWindowsDrawn = true;
+ } else {
+ mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout);
+ checkDrawnWindowsLocked();
+ }
}
- mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT);
- if (mWaitingForDrawn.isEmpty()) {
+ if (allWindowsDrawn) {
callback.run();
- } else {
- mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout);
- checkDrawnWindowsLocked();
}
}
diff --git a/tools/layoutlib/.idea/inspectionProfiles/Project_Default.xml b/tools/layoutlib/.idea/inspectionProfiles/Project_Default.xml
index 5bb3e3e..3681f2a 100644
--- a/tools/layoutlib/.idea/inspectionProfiles/Project_Default.xml
+++ b/tools/layoutlib/.idea/inspectionProfiles/Project_Default.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
<component name="InspectionProjectProfileManager">
<profile version="1.0" is_locked="false">
<option name="myName" value="Project Default" />
@@ -8,6 +7,15 @@
<option name="CHECK_TRY_CATCH_SECTION" value="true" />
<option name="CHECK_METHOD_BODY" value="true" />
</inspection_tool>
+ <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
+ <option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
+ <option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
+ </inspection_tool>
<inspection_tool class="ToArrayCallWithZeroLengthArrayArgument" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="WeakerAccess" enabled="true" level="WARNING" enabled_by_default="true">
+ <option name="SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS" value="false" />
+ <option name="SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES" value="false" />
+ <option name="SUGGEST_PRIVATE_FOR_INNERS" value="true" />
+ </inspection_tool>
</profile>
</component>
\ No newline at end of file
diff --git a/tools/layoutlib/.idea/misc.xml b/tools/layoutlib/.idea/misc.xml
index b474bdc..44b47f2 100644
--- a/tools/layoutlib/.idea/misc.xml
+++ b/tools/layoutlib/.idea/misc.xml
@@ -37,7 +37,7 @@
</value>
</option>
</component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" default="false" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
diff --git a/tools/layoutlib/.idea/runConfigurations/Bridge_quick.xml b/tools/layoutlib/.idea/runConfigurations/Bridge_quick.xml
index 4f0eb8d..b402849 100644
--- a/tools/layoutlib/.idea/runConfigurations/Bridge_quick.xml
+++ b/tools/layoutlib/.idea/runConfigurations/Bridge_quick.xml
@@ -26,4 +26,4 @@
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
-</component>
\ No newline at end of file
+</component>
diff --git a/tools/layoutlib/Android.mk b/tools/layoutlib/Android.mk
index 53bfc15..c2ad9ef 100644
--- a/tools/layoutlib/Android.mk
+++ b/tools/layoutlib/Android.mk
@@ -16,7 +16,7 @@
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
-LOCAL_JAVACFLAGS := -source 6 -target 6
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
#
# Define rules to build temp_layoutlib.jar, which contains a subset of
diff --git a/tools/layoutlib/bridge/Android.mk b/tools/layoutlib/bridge/Android.mk
index 0dbdd56..16e5913 100644
--- a/tools/layoutlib/bridge/Android.mk
+++ b/tools/layoutlib/bridge/Android.mk
@@ -18,8 +18,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_JAVA_RESOURCE_DIRS := resources
-LOCAL_JAVACFLAGS := -source 6 -target 6
-
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_JAVA_LIBRARIES := \
layoutlib_api-prebuilt \
diff --git a/tools/layoutlib/bridge/tests/Android.mk b/tools/layoutlib/bridge/tests/Android.mk
index 5eef24a..5c062d0 100644
--- a/tools/layoutlib/bridge/tests/Android.mk
+++ b/tools/layoutlib/bridge/tests/Android.mk
@@ -16,10 +16,11 @@
include $(CLEAR_VARS)
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
+
# Only compile source java files in this lib.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_RESOURCE_DIRS := res
-LOCAL_JAVACFLAGS := -source 6 -target 6
LOCAL_MODULE := layoutlib-tests
LOCAL_MODULE_TAGS := optional
diff --git a/tools/layoutlib/create/Android.mk b/tools/layoutlib/create/Android.mk
index c7f2c41..47377ae 100644
--- a/tools/layoutlib/create/Android.mk
+++ b/tools/layoutlib/create/Android.mk
@@ -16,6 +16,8 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
+
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_JAR_MANIFEST := manifest.txt
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AbstractClassAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AbstractClassAdapter.java
index 758bd48..01c940a 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AbstractClassAdapter.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AbstractClassAdapter.java
@@ -176,17 +176,6 @@
}
}
- /* Java 7 verifies the StackMapTable of a class if its version number is greater than 50.0.
- * However, the check is disabled if the class version number is 50.0 or less. Generation
- * of the StackMapTable requires a rewrite using the tree API of ASM. As a workaround,
- * we rewrite the version number of the class to be 50.0
- *
- * http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6693236
- */
- if (version > 50) {
- version = 50;
- }
-
super.visit(version, access, name, signature, superName, interfaces);
}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/StubMethodAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/StubMethodAdapter.java
index b5ab738..4ba7237 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/StubMethodAdapter.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/StubMethodAdapter.java
@@ -103,6 +103,7 @@
mParentVisitor.visitInsn(Opcodes.ICONST_1);
mParentVisitor.visitInsn(Opcodes.IRETURN);
mParentVisitor.visitLabel(l1);
+ mParentVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mParentVisitor.visitInsn(Opcodes.ICONST_0);
break;
case Type.CHAR:
diff --git a/tools/layoutlib/create/tests/Android.mk b/tools/layoutlib/create/tests/Android.mk
index dafb9c6..c59528e 100644
--- a/tools/layoutlib/create/tests/Android.mk
+++ b/tools/layoutlib/create/tests/Android.mk
@@ -15,6 +15,8 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
+
# Only compile source java files in this lib.
LOCAL_SRC_FILES := $(call all-java-files-under, com)
diff --git a/tools/preload2/src/com/android/preload/DeviceUtils.java b/tools/preload2/src/com/android/preload/DeviceUtils.java
index 72de7b5..803a7f1 100644
--- a/tools/preload2/src/com/android/preload/DeviceUtils.java
+++ b/tools/preload2/src/com/android/preload/DeviceUtils.java
@@ -285,7 +285,7 @@
if (device == null) {
try {
- wait(timeout);
+ wfdl.wait(timeout);
} catch (InterruptedException e) {
// Ignore spurious wakeups.
}
@@ -304,7 +304,7 @@
if (!device.hasClients()) {
try {
- wait(timeout);
+ wfcl.wait(timeout);
} catch (InterruptedException e) {
// Ignore spurious wakeups.
}