Merge "Fixed statuses on Battery Saver column."
diff --git a/api/current.txt b/api/current.txt
index 7b184bf..195b640 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -50485,6 +50485,7 @@
method public java.lang.Object[] getSigners();
method public java.lang.String getSimpleName();
method public java.lang.Class<? super T> getSuperclass();
+ method public java.lang.String getTypeName();
method public synchronized java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
method public boolean isAnnotation();
method public boolean isAnonymousClass();
@@ -51866,24 +51867,34 @@
method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
}
- public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
- method public A getAnnotation(java.lang.Class<A>);
+ public final class Constructor extends java.lang.reflect.Executable {
method public java.lang.Class<T> getDeclaringClass();
method public java.lang.Class<?>[] getExceptionTypes();
- method public java.lang.reflect.Type[] getGenericExceptionTypes();
- method public java.lang.reflect.Type[] getGenericParameterTypes();
method public int getModifiers();
method public java.lang.String getName();
method public java.lang.annotation.Annotation[][] getParameterAnnotations();
method public java.lang.Class<?>[] getParameterTypes();
method public java.lang.reflect.TypeVariable<java.lang.reflect.Constructor<T>>[] getTypeParameters();
- method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
- method public boolean isSynthetic();
- method public boolean isVarArgs();
method public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
method public java.lang.String toGenericString();
}
+ public abstract class Executable extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
+ method public abstract java.lang.Class<?> getDeclaringClass();
+ method public abstract java.lang.Class<?>[] getExceptionTypes();
+ method public java.lang.reflect.Type[] getGenericExceptionTypes();
+ method public java.lang.reflect.Type[] getGenericParameterTypes();
+ method public abstract int getModifiers();
+ method public abstract java.lang.String getName();
+ method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
+ method public int getParameterCount();
+ method public abstract java.lang.Class<?>[] getParameterTypes();
+ method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters();
+ method public boolean isSynthetic();
+ method public boolean isVarArgs();
+ method public abstract java.lang.String toGenericString();
+ }
+
public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member {
method public java.lang.Object get(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public A getAnnotation(java.lang.Class<A>);
@@ -51900,7 +51911,6 @@
method public java.lang.String getName();
method public short getShort(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public java.lang.Class<?> getType();
- method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
method public boolean isEnumConstant();
method public boolean isSynthetic();
method public void set(java.lang.Object, java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
@@ -51951,13 +51961,10 @@
field public static final int PUBLIC = 0; // 0x0
}
- public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
- method public A getAnnotation(java.lang.Class<A>);
+ public final class Method extends java.lang.reflect.Executable {
method public java.lang.Class<?> getDeclaringClass();
method public java.lang.Object getDefaultValue();
method public java.lang.Class<?>[] getExceptionTypes();
- method public java.lang.reflect.Type[] getGenericExceptionTypes();
- method public java.lang.reflect.Type[] getGenericParameterTypes();
method public java.lang.reflect.Type getGenericReturnType();
method public int getModifiers();
method public java.lang.String getName();
@@ -51968,8 +51975,6 @@
method public java.lang.Object invoke(java.lang.Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
method public boolean isBridge();
method public boolean isDefault();
- method public boolean isSynthetic();
- method public boolean isVarArgs();
method public java.lang.String toGenericString();
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 01a872a..54f987a 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -53841,6 +53841,7 @@
method public java.lang.Object[] getSigners();
method public java.lang.String getSimpleName();
method public java.lang.Class<? super T> getSuperclass();
+ method public java.lang.String getTypeName();
method public synchronized java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
method public boolean isAnnotation();
method public boolean isAnonymousClass();
@@ -55222,24 +55223,34 @@
method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
}
- public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
- method public A getAnnotation(java.lang.Class<A>);
+ public final class Constructor extends java.lang.reflect.Executable {
method public java.lang.Class<T> getDeclaringClass();
method public java.lang.Class<?>[] getExceptionTypes();
- method public java.lang.reflect.Type[] getGenericExceptionTypes();
- method public java.lang.reflect.Type[] getGenericParameterTypes();
method public int getModifiers();
method public java.lang.String getName();
method public java.lang.annotation.Annotation[][] getParameterAnnotations();
method public java.lang.Class<?>[] getParameterTypes();
method public java.lang.reflect.TypeVariable<java.lang.reflect.Constructor<T>>[] getTypeParameters();
- method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
- method public boolean isSynthetic();
- method public boolean isVarArgs();
method public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
method public java.lang.String toGenericString();
}
+ public abstract class Executable extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
+ method public abstract java.lang.Class<?> getDeclaringClass();
+ method public abstract java.lang.Class<?>[] getExceptionTypes();
+ method public java.lang.reflect.Type[] getGenericExceptionTypes();
+ method public java.lang.reflect.Type[] getGenericParameterTypes();
+ method public abstract int getModifiers();
+ method public abstract java.lang.String getName();
+ method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
+ method public int getParameterCount();
+ method public abstract java.lang.Class<?>[] getParameterTypes();
+ method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters();
+ method public boolean isSynthetic();
+ method public boolean isVarArgs();
+ method public abstract java.lang.String toGenericString();
+ }
+
public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member {
method public java.lang.Object get(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public A getAnnotation(java.lang.Class<A>);
@@ -55256,7 +55267,6 @@
method public java.lang.String getName();
method public short getShort(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public java.lang.Class<?> getType();
- method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
method public boolean isEnumConstant();
method public boolean isSynthetic();
method public void set(java.lang.Object, java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
@@ -55307,13 +55317,10 @@
field public static final int PUBLIC = 0; // 0x0
}
- public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
- method public A getAnnotation(java.lang.Class<A>);
+ public final class Method extends java.lang.reflect.Executable {
method public java.lang.Class<?> getDeclaringClass();
method public java.lang.Object getDefaultValue();
method public java.lang.Class<?>[] getExceptionTypes();
- method public java.lang.reflect.Type[] getGenericExceptionTypes();
- method public java.lang.reflect.Type[] getGenericParameterTypes();
method public java.lang.reflect.Type getGenericReturnType();
method public int getModifiers();
method public java.lang.String getName();
@@ -55324,8 +55331,6 @@
method public java.lang.Object invoke(java.lang.Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
method public boolean isBridge();
method public boolean isDefault();
- method public boolean isSynthetic();
- method public boolean isVarArgs();
method public java.lang.String toGenericString();
}
diff --git a/api/test-current.txt b/api/test-current.txt
index d936c27..d06e5cf 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -50565,6 +50565,7 @@
method public java.lang.Object[] getSigners();
method public java.lang.String getSimpleName();
method public java.lang.Class<? super T> getSuperclass();
+ method public java.lang.String getTypeName();
method public synchronized java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
method public boolean isAnnotation();
method public boolean isAnonymousClass();
@@ -51946,24 +51947,34 @@
method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
}
- public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
- method public A getAnnotation(java.lang.Class<A>);
+ public final class Constructor extends java.lang.reflect.Executable {
method public java.lang.Class<T> getDeclaringClass();
method public java.lang.Class<?>[] getExceptionTypes();
- method public java.lang.reflect.Type[] getGenericExceptionTypes();
- method public java.lang.reflect.Type[] getGenericParameterTypes();
method public int getModifiers();
method public java.lang.String getName();
method public java.lang.annotation.Annotation[][] getParameterAnnotations();
method public java.lang.Class<?>[] getParameterTypes();
method public java.lang.reflect.TypeVariable<java.lang.reflect.Constructor<T>>[] getTypeParameters();
- method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
- method public boolean isSynthetic();
- method public boolean isVarArgs();
method public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
method public java.lang.String toGenericString();
}
+ public abstract class Executable extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
+ method public abstract java.lang.Class<?> getDeclaringClass();
+ method public abstract java.lang.Class<?>[] getExceptionTypes();
+ method public java.lang.reflect.Type[] getGenericExceptionTypes();
+ method public java.lang.reflect.Type[] getGenericParameterTypes();
+ method public abstract int getModifiers();
+ method public abstract java.lang.String getName();
+ method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
+ method public int getParameterCount();
+ method public abstract java.lang.Class<?>[] getParameterTypes();
+ method public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters();
+ method public boolean isSynthetic();
+ method public boolean isVarArgs();
+ method public abstract java.lang.String toGenericString();
+ }
+
public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member {
method public java.lang.Object get(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public A getAnnotation(java.lang.Class<A>);
@@ -51980,7 +51991,6 @@
method public java.lang.String getName();
method public short getShort(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public java.lang.Class<?> getType();
- method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
method public boolean isEnumConstant();
method public boolean isSynthetic();
method public void set(java.lang.Object, java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
@@ -52031,13 +52041,10 @@
field public static final int PUBLIC = 0; // 0x0
}
- public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
- method public A getAnnotation(java.lang.Class<A>);
+ public final class Method extends java.lang.reflect.Executable {
method public java.lang.Class<?> getDeclaringClass();
method public java.lang.Object getDefaultValue();
method public java.lang.Class<?>[] getExceptionTypes();
- method public java.lang.reflect.Type[] getGenericExceptionTypes();
- method public java.lang.reflect.Type[] getGenericParameterTypes();
method public java.lang.reflect.Type getGenericReturnType();
method public int getModifiers();
method public java.lang.String getName();
@@ -52048,8 +52055,6 @@
method public java.lang.Object invoke(java.lang.Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
method public boolean isBridge();
method public boolean isDefault();
- method public boolean isSynthetic();
- method public boolean isVarArgs();
method public java.lang.String toGenericString();
}
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index bb09d00..7213414 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -280,7 +280,7 @@
if (size) {
jchar* data = static_cast<jchar*>(env->GetPrimitiveArrayCritical(dataObj, NULL));
utf8_to_utf16_no_null_terminator(reinterpret_cast<const uint8_t*>(str), len,
- reinterpret_cast<char16_t*>(data));
+ reinterpret_cast<char16_t*>(data), (size_t) size);
env->ReleasePrimitiveArrayCritical(dataObj, data, 0);
}
env->SetIntField(bufferObj, gCharArrayBufferClassInfo.sizeCopied, size);
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 4448677..c91b27d 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -776,7 +776,7 @@
if (kDebugStringPoolNoisy) {
ALOGI("Caching UTF8 string: %s", u8str);
}
- utf8_to_utf16(u8str, u8len, u16str);
+ utf8_to_utf16(u8str, u8len, u16str, *u16len + 1);
mCache[idx] = u16str;
return u16str;
} else {
@@ -877,7 +877,8 @@
// the ordering, we need to convert strings in the pool to UTF-16.
// But we don't want to hit the cache, so instead we will have a
// local temporary allocation for the conversions.
- char16_t* convBuffer = (char16_t*)malloc(strLen+4);
+ size_t convBufferLen = strLen + 4;
+ char16_t* convBuffer = (char16_t*)calloc(convBufferLen, sizeof(char16_t));
ssize_t l = 0;
ssize_t h = mHeader->stringCount-1;
@@ -887,8 +888,7 @@
const uint8_t* s = (const uint8_t*)string8At(mid, &len);
int c;
if (s != NULL) {
- char16_t* end = utf8_to_utf16_n(s, len, convBuffer, strLen+3);
- *end = 0;
+ char16_t* end = utf8_to_utf16(s, len, convBuffer, convBufferLen);
c = strzcmp16(convBuffer, end-convBuffer, str, strLen);
} else {
c = -1;
diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h
index 4536bef..a48469c 100644
--- a/libs/hwui/tests/common/TestUtils.h
+++ b/libs/hwui/tests/common/TestUtils.h
@@ -48,10 +48,10 @@
EXPECT_TRUE(TestUtils::matricesAreApproxEqual(a, b))
#define EXPECT_RECT_APPROX_EQ(a, b) \
- EXPECT_TRUE(MathUtils::areEqual(a.left, b.left) \
- && MathUtils::areEqual(a.top, b.top) \
- && MathUtils::areEqual(a.right, b.right) \
- && MathUtils::areEqual(a.bottom, b.bottom));
+ EXPECT_TRUE(MathUtils::areEqual((a).left, (b).left) \
+ && MathUtils::areEqual((a).top, (b).top) \
+ && MathUtils::areEqual((a).right, (b).right) \
+ && MathUtils::areEqual((a).bottom, (b).bottom));
#define EXPECT_CLIP_RECT(expRect, clipStatePtr) \
EXPECT_NE(nullptr, (clipStatePtr)) << "Op is unclipped"; \
diff --git a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java
index d2e9885..b3db037 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java
@@ -22,6 +22,7 @@
import android.annotation.Nullable;
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
import android.os.UserHandle;
import android.preference.PreferenceManager;
@@ -85,6 +86,15 @@
public @interface PermissionStatus {}
/**
+ * Clears all preferences associated with a given package.
+ *
+ * <p>Typically called when a package is removed or when user asked to clear its data.
+ */
+ static void clearPackagePreferences(Context context, String packageName) {
+ clearScopedAccessPreferences(context, packageName);
+ }
+
+ /**
* Methods below are used to keep track of denied user requests on scoped directory access so
* the dialog is not offered when user checked the 'Do not ask again' box
*
@@ -108,6 +118,23 @@
getPrefs(context).edit().putInt(key, status).apply();
}
+ private static void clearScopedAccessPreferences(Context context, String packageName) {
+ final String keySubstring = "|" + packageName + "|";
+ final SharedPreferences prefs = getPrefs(context);
+ Editor editor = null;
+ for (final String key : prefs.getAll().keySet()) {
+ if (key.contains(keySubstring)) {
+ if (editor == null) {
+ editor = prefs.edit();
+ }
+ editor.remove(key);
+ }
+ }
+ if (editor != null) {
+ editor.apply();
+ }
+ }
+
private static String getScopedAccessDenialsKey(String packageName, String uuid,
String directory) {
final int userId = UserHandle.myUserId();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java
index aef63af..fd1183f 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java
@@ -23,7 +23,7 @@
import android.net.Uri;
/**
- * Clean up {@link RecentsProvider} when packages are removed.
+ * Cleans up {@link RecentsProvider} and {@link LocalPreferences} when packages are removed.
*/
public class PackageReceiver extends BroadcastReceiver {
@Override
@@ -31,15 +31,19 @@
final ContentResolver resolver = context.getContentResolver();
final String action = intent.getAction();
+ final Uri data = intent.getData();
+ final String packageName = data == null ? null : data.getSchemeSpecificPart();
+
if (Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(action)) {
resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE, null, null);
-
+ if (packageName != null) {
+ LocalPreferences.clearPackagePreferences(context, packageName);
+ }
} else if (Intent.ACTION_PACKAGE_DATA_CLEARED.equals(action)) {
- final Uri data = intent.getData();
- if (data != null) {
- final String packageName = data.getSchemeSpecificPart();
+ if (packageName != null) {
resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE_PACKAGE,
packageName, null);
+ LocalPreferences.clearPackagePreferences(context, packageName);
}
}
}
diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java
index a16fcd2..2541050 100644
--- a/services/core/java/com/android/server/display/ColorFade.java
+++ b/services/core/java/com/android/server/display/ColorFade.java
@@ -547,6 +547,11 @@
logEglError("eglChooseConfig");
return false;
}
+ if (numEglConfigs[0] <= 0) {
+ Slog.e(TAG, "no valid config found");
+ return false;
+ }
+
mEglConfig = eglConfigs[0];
}
diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java
index a6350fe..5c46ca0 100644
--- a/services/core/java/com/android/server/pm/SELinuxMMAC.java
+++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java
@@ -323,9 +323,8 @@
*/
public static boolean isRestoreconNeeded(File file) {
try {
- final byte[] buf = new byte[20];
- final int len = Os.getxattr(file.getAbsolutePath(), XATTR_SEAPP_HASH, buf);
- if ((len == 20) && Arrays.equals(SEAPP_CONTEXTS_HASH, buf)) {
+ final byte[] buf = Os.getxattr(file.getAbsolutePath(), XATTR_SEAPP_HASH);
+ if ((buf.length == 20) && Arrays.equals(SEAPP_CONTEXTS_HASH, buf)) {
return false;
}
} catch (ErrnoException e) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index d8a1c77..4faa506 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -2958,9 +2958,8 @@
*/
private static int getSerialNumber(File file) throws IOException {
try {
- final byte[] buf = new byte[256];
- final int len = Os.getxattr(file.getAbsolutePath(), XATTR_SERIAL, buf);
- final String serial = new String(buf, 0, len);
+ final byte[] buf = Os.getxattr(file.getAbsolutePath(), XATTR_SERIAL);
+ final String serial = new String(buf);
try {
return Integer.parseInt(serial);
} catch (NumberFormatException e) {
diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk
index b701445..04f46d9 100644
--- a/tools/aapt/Android.mk
+++ b/tools/aapt/Android.mk
@@ -57,11 +57,11 @@
aaptHostStaticLibs := \
libandroidfw \
libpng \
- liblog \
libutils \
+ liblog \
libcutils \
libexpat \
- libziparchive-host \
+ libziparchive \
libbase
aaptCFlags := -DAAPT_VERSION=\"$(BUILD_NUMBER_FROM_FILE)\"
diff --git a/tools/aapt2/Android.mk b/tools/aapt2/Android.mk
index be2f88d..2e5fbdc 100644
--- a/tools/aapt2/Android.mk
+++ b/tools/aapt2/Android.mk
@@ -126,7 +126,7 @@
liblog \
libcutils \
libexpat \
- libziparchive-host \
+ libziparchive \
libpng \
libbase \
libprotobuf-cpp-lite
diff --git a/tools/aapt2/util/Util.cpp b/tools/aapt2/util/Util.cpp
index 7b0c71d..e07c88e 100644
--- a/tools/aapt2/util/Util.cpp
+++ b/tools/aapt2/util/Util.cpp
@@ -430,7 +430,11 @@
std::u16string utf16;
utf16.resize(utf16Length);
- utf8_to_utf16(reinterpret_cast<const uint8_t*>(utf8.data()), utf8.length(), &*utf16.begin());
+ utf8_to_utf16(
+ reinterpret_cast<const uint8_t*>(utf8.data()),
+ utf8.length(),
+ &*utf16.begin(),
+ (size_t) utf16Length + 1);
return utf16;
}
@@ -441,8 +445,10 @@
}
std::string utf8;
+ // Make room for '\0' explicitly.
+ utf8.resize(utf8Length + 1);
+ utf16_to_utf8(utf16.data(), utf16.length(), &*utf8.begin(), utf8Length + 1);
utf8.resize(utf8Length);
- utf16_to_utf8(utf16.data(), utf16.length(), &*utf8.begin());
return utf8;
}
diff --git a/tools/split-select/Android.mk b/tools/split-select/Android.mk
index 239bed5..199fafa 100644
--- a/tools/split-select/Android.mk
+++ b/tools/split-select/Android.mk
@@ -47,11 +47,11 @@
libaapt \
libandroidfw \
libpng \
- liblog \
libutils \
+ liblog \
libcutils \
libexpat \
- libziparchive-host \
+ libziparchive \
libbase
cFlags := -Wall -Werror