diff options
31 files changed, 309 insertions, 215 deletions
diff --git a/cmds/app_process/Android.mk b/cmds/app_process/Android.mk index cb7e1a0..7c25354 100644 --- a/cmds/app_process/Android.mk +++ b/cmds/app_process/Android.mk @@ -14,30 +14,11 @@ LOCAL_SHARED_LIBRARIES := \ libandroid_runtime LOCAL_MODULE:= app_process -LOCAL_32_BIT_ONLY := true +LOCAL_MULTILIB := both +LOCAL_MODULE_STEM_32 := app_process +LOCAL_MODULE_STEM_64 := app_process64 include $(BUILD_EXECUTABLE) -ifeq ($(TARGET_IS_64_BIT),true) - -# 64-bit app_process64 -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= \ - app_main.cpp - -LOCAL_SHARED_LIBRARIES := \ - libcutils \ - libutils \ - liblog \ - libbinder \ - libandroid_runtime - -LOCAL_MODULE:= app_process64 -LOCAL_NO_2ND_ARCH := true -include $(BUILD_EXECUTABLE) - -endif # TARGET_IS_64_BIT - # Build a variant of app_process binary linked with ASan runtime. # ARM-only at the moment. ifeq ($(TARGET_ARCH),arm) diff --git a/core/java/android/net/http/CertificateChainValidator.java b/core/java/android/net/http/CertificateChainValidator.java index a28b5a7..d06355d 100644 --- a/core/java/android/net/http/CertificateChainValidator.java +++ b/core/java/android/net/http/CertificateChainValidator.java @@ -22,6 +22,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.lang.reflect.Method; import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; import java.security.cert.CertificateException; @@ -74,13 +76,16 @@ public class CertificateChainValidator { private CertificateChainValidator() { try { TrustManagerFactory tmf = TrustManagerFactory.getInstance("X.509"); + tmf.init((KeyStore) null); for (TrustManager tm : tmf.getTrustManagers()) { if (tm instanceof X509ExtendedTrustManager) { mTrustManager = (X509ExtendedTrustManager) tm; } } } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("X.509 TrustManager factory must be available", e); + throw new RuntimeException("X.509 TrustManagerFactory must be available", e); + } catch (KeyStoreException e) { + throw new RuntimeException("X.509 TrustManagerFactory cannot be initialized", e); } if (mTrustManager == null) { @@ -166,9 +171,13 @@ public class CertificateChainValidator { TrustManagerFactory tmf; try { tmf = TrustManagerFactory.getInstance("X.509"); + tmf.init((KeyStore) null); } catch (NoSuchAlgorithmException e) { Slog.w(TAG, "Couldn't find default X.509 TrustManagerFactory"); return; + } catch (KeyStoreException e) { + Slog.w(TAG, "Couldn't initialize default X.509 TrustManagerFactory", e); + return; } TrustManager[] tms = tmf.getTrustManagers(); diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 92d253f..e2c78b1 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -69,7 +69,7 @@ void TextLayoutCache::operator()(TextLayoutCacheKey& text, sp<TextLayoutValue>& size_t totalSizeToDelete = text.getSize() + desc->getSize(); mSize -= totalSizeToDelete; if (mDebugEnabled) { - ALOGD("Cache value %p deleted, size = %d", desc.get(), totalSizeToDelete); + ALOGD("Cache value %p deleted, size = %zu", desc.get(), totalSizeToDelete); } } @@ -129,7 +129,7 @@ sp<TextLayoutValue> TextLayoutCache::getValue(const SkPaint* paint, bool removedOne = mCache.removeOldest(); LOG_ALWAYS_FATAL_IF(!removedOne, "The cache is non-empty but we " "failed to remove the oldest entry. " - "mSize = %u, size = %u, mMaxSize = %u, mCache.size() = %u", + "mSize = %u, size = %zu, mMaxSize = %u, mCache.size() = %zu", mSize, size, mMaxSize, mCache.size()); } } @@ -148,7 +148,7 @@ sp<TextLayoutValue> TextLayoutCache::getValue(const SkPaint* paint, nsecs_t totalTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime; ALOGD("CACHE MISS: Added entry %p " "with start = %d, count = %d, contextCount = %d, " - "entry size %d bytes, remaining space %d bytes" + "entry size %zu bytes, remaining space %d bytes" " - Compute time %0.6f ms - Put time %0.6f ms - Text = '%s'", value.get(), start, count, contextCount, size, mMaxSize - mSize, value->getElapsedTime() * 0.000001f, @@ -159,7 +159,7 @@ sp<TextLayoutValue> TextLayoutCache::getValue(const SkPaint* paint, if (mDebugEnabled) { ALOGD("CACHE MISS: Calculated but not storing entry because it is too big " "with start = %d, count = %d, contextCount = %d, " - "entry size %d bytes, remaining space %d bytes" + "entry size %zu bytes, remaining space %d bytes" " - Compute time %0.6f ms - Text = '%s'", start, count, contextCount, size, mMaxSize - mSize, value->getElapsedTime() * 0.000001f, @@ -204,7 +204,7 @@ void TextLayoutCache::dumpCacheStats() { ALOGD("------------------------------------------------"); ALOGD("pid : %d", getpid()); ALOGD("running : %.0f seconds", timeRunningInSec); - ALOGD("entries : %d", cacheSize); + ALOGD("entries : %zu", cacheSize); ALOGD("max size : %d bytes", mMaxSize); ALOGD("used : %d bytes according to mSize", mSize); ALOGD("remaining : %d bytes or %2.2f percent", mMaxSize - mSize, remainingPercent); diff --git a/core/jni/android_net_LocalSocketImpl.cpp b/core/jni/android_net_LocalSocketImpl.cpp index 9f79f74..98f4bed 100644 --- a/core/jni/android_net_LocalSocketImpl.cpp +++ b/core/jni/android_net_LocalSocketImpl.cpp @@ -111,7 +111,7 @@ socket_bind_local (JNIEnv *env, jobject object, jobject fileDescriptor, /* private native void listen_native(int fd, int backlog) throws IOException; */ static void -socket_listen (JNIEnv *env, jobject object, jobject fileDescriptor, int backlog) +socket_listen (JNIEnv *env, jobject object, jobject fileDescriptor, jint backlog) { int ret; int fd; @@ -231,7 +231,7 @@ java_opt_to_real(int optID, int* opt, int* level) } static jint -socket_getOption(JNIEnv *env, jobject object, jobject fileDescriptor, int optID) +socket_getOption(JNIEnv *env, jobject object, jobject fileDescriptor, jint optID) { int ret, value; int opt, level; @@ -279,7 +279,7 @@ socket_getOption(JNIEnv *env, jobject object, jobject fileDescriptor, int optID) } static void socket_setOption( - JNIEnv *env, jobject object, jobject fileDescriptor, int optID, + JNIEnv *env, jobject object, jobject fileDescriptor, jint optID, jint boolValue, jint intValue) { int ret; int optname; diff --git a/core/jni/android_nio_utils.cpp b/core/jni/android_nio_utils.cpp index 7cbbe12..59d6e41 100644 --- a/core/jni/android_nio_utils.cpp +++ b/core/jni/android_nio_utils.cpp @@ -37,7 +37,7 @@ void* android::nio_getPointer(JNIEnv *_env, jobject buffer, jarray *array) { gNioJNI.getBasePointerID, buffer); if (pointer != 0L) { *array = NULL; - return (void *) (jint) pointer; + return reinterpret_cast<void *>(pointer); } *array = (jarray) _env->CallStaticObjectMethod(gNioJNI.nioAccessClass, diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index a041693..d4873d6 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -800,7 +800,7 @@ static void dumpNativeHeap(FILE* fp) fprintf(fp, "Total memory: %zu\n", totalMemory); fprintf(fp, "Allocation records: %zd\n", recordCount); if (backtraceSize != BACKTRACE_SIZE) { - fprintf(fp, "WARNING: mismatched backtrace sizes (%d vs. %d)\n", + fprintf(fp, "WARNING: mismatched backtrace sizes (%zu vs. %d)\n", backtraceSize, BACKTRACE_SIZE); } fprintf(fp, "\n"); @@ -823,7 +823,11 @@ static void dumpNativeHeap(FILE* fp) if (backtrace[bt] == 0) { break; } else { +#ifdef __LP64__ + fprintf(fp, " %016x", backtrace[bt]); +#else fprintf(fp, " %08x", backtrace[bt]); +#endif } } fprintf(fp, "\n"); diff --git a/core/jni/android_server_NetworkManagementSocketTagger.cpp b/core/jni/android_server_NetworkManagementSocketTagger.cpp index 12beff7..7e12b1e 100644 --- a/core/jni/android_server_NetworkManagementSocketTagger.cpp +++ b/core/jni/android_server_NetworkManagementSocketTagger.cpp @@ -47,8 +47,8 @@ static jint QTagUid_tagSocketFd(JNIEnv* env, jclass, return (jint)res; } -static int QTagUid_untagSocketFd(JNIEnv* env, jclass, - jobject fileDescriptor) { +static jint QTagUid_untagSocketFd(JNIEnv* env, jclass, + jobject fileDescriptor) { int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor); if (env->ExceptionOccurred() != NULL) { diff --git a/core/jni/android_text_AndroidBidi.cpp b/core/jni/android_text_AndroidBidi.cpp index d50a69f..6f7ee49 100644 --- a/core/jni/android_text_AndroidBidi.cpp +++ b/core/jni/android_text_AndroidBidi.cpp @@ -26,7 +26,7 @@ namespace android { static jint runBidi(JNIEnv* env, jobject obj, jint dir, jcharArray chsArray, - jbyteArray infoArray, int n, jboolean haveInfo) + jbyteArray infoArray, jint n, jboolean haveInfo) { // Parameters are checked on java side // Failures from GetXXXArrayElements indicate a serious out-of-memory condition diff --git a/core/jni/android_text_AndroidCharacter.cpp b/core/jni/android_text_AndroidCharacter.cpp index 8b85a7b7..94bd40f 100644 --- a/core/jni/android_text_AndroidCharacter.cpp +++ b/core/jni/android_text_AndroidCharacter.cpp @@ -51,7 +51,8 @@ static int directionality_map[U_CHAR_DIRECTION_COUNT] = { namespace android { -static void getDirectionalities(JNIEnv* env, jobject obj, jcharArray srcArray, jbyteArray destArray, int count) +static void getDirectionalities(JNIEnv* env, jobject obj, jcharArray srcArray, + jbyteArray destArray, jint count) { ScopedCharArrayRO src(env, srcArray); if (src.get() == NULL) { @@ -102,7 +103,7 @@ static jint getEastAsianWidth(JNIEnv* env, jobject obj, jchar input) } static void getEastAsianWidths(JNIEnv* env, jobject obj, jcharArray srcArray, - int start, int count, jbyteArray destArray) + jint start, jint count, jbyteArray destArray) { ScopedCharArrayRO src(env, srcArray); if (src.get() == NULL) { @@ -144,20 +145,20 @@ static void getEastAsianWidths(JNIEnv* env, jobject obj, jcharArray srcArray, } } -static jboolean mirror(JNIEnv* env, jobject obj, jcharArray charArray, int start, int count) +static jboolean mirror(JNIEnv* env, jobject obj, jcharArray charArray, jint start, jint count) { ScopedCharArrayRW data(env, charArray); if (data.get() == NULL) { - return false; + return JNI_FALSE; } if (start < 0 || start > start + count || env->GetArrayLength(charArray) < start + count) { jniThrowException(env, "java/lang/ArrayIndexOutOfBoundsException", NULL); - return false; + return JNI_FALSE; } - bool ret = false; + jboolean ret = JNI_FALSE; for (int i = start; i < start + count; i++) { // XXX this thinks it knows that surrogates are never mirrored @@ -166,7 +167,7 @@ static jboolean mirror(JNIEnv* env, jobject obj, jcharArray charArray, int start if (c1 != c2) { data[i] = c2; - ret = true; + ret = JNI_TRUE; } } return ret; diff --git a/core/jni/android_text_format_Time.cpp b/core/jni/android_text_format_Time.cpp index aa2c5f39..28a8a5d 100644 --- a/core/jni/android_text_format_Time.cpp +++ b/core/jni/android_text_format_Time.cpp @@ -117,7 +117,7 @@ static jlong android_text_format_Time_normalize(JNIEnv* env, jobject This, time2java(env, This, t); RELEASE_TIMEZONE(This, t) - return result; + return static_cast<jlong>(result); } static void android_text_format_Time_switchTimezone(JNIEnv* env, jobject This, @@ -155,7 +155,7 @@ static jint android_text_format_Time_compare(JNIEnv* env, jobject clazz, RELEASE_TIMEZONE(aObject, a) RELEASE_TIMEZONE(bObject, b) - return result; + return static_cast<jint>(result); } static jstring android_text_format_Time_format2445(JNIEnv* env, jobject This) @@ -346,7 +346,7 @@ static jlong android_text_format_Time_toMillis(JNIEnv* env, jobject This, RELEASE_TIMEZONE(This, t) - return result; + return static_cast<jlong>(result); } static void android_text_format_Time_set(JNIEnv* env, jobject This, jlong millis) @@ -400,10 +400,10 @@ static jboolean android_text_format_Time_parse(JNIEnv* env, jobject This, jstrin if (len < 8) { jniThrowException(env, "android/util/TimeFormatException", "String too short -- expected at least 8 characters."); - return false; + return JNI_FALSE; } - jboolean inUtc = false; + jboolean inUtc = JNI_FALSE; ScopedStringChars s(env, strObj); @@ -414,49 +414,49 @@ static jboolean android_text_format_Time_parse(JNIEnv* env, jobject This, jstrin n += get_char(env, s, 1, 100, &thrown); n += get_char(env, s, 2, 10, &thrown); n += get_char(env, s, 3, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_yearField, n); // month n = get_char(env, s, 4, 10, &thrown); n += get_char(env, s, 5, 1, &thrown); n--; - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_monField, n); // day of month n = get_char(env, s, 6, 10, &thrown); n += get_char(env, s, 7, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_mdayField, n); if (len > 8) { // T - if (!check_char(env, s, 8, 'T')) return false; + if (!check_char(env, s, 8, 'T')) return JNI_FALSE; env->SetBooleanField(This, g_allDayField, JNI_FALSE); // hour n = get_char(env, s, 9, 10, &thrown); n += get_char(env, s, 10, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_hourField, n); // min n = get_char(env, s, 11, 10, &thrown); n += get_char(env, s, 12, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_minField, n); // sec n = get_char(env, s, 13, 10, &thrown); n += get_char(env, s, 14, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_secField, n); if (len > 15) { // Z - if (!check_char(env, s, 15, 'Z')) return false; - inUtc = true; + if (!check_char(env, s, 15, 'Z')) return JNI_FALSE; + inUtc = JNI_TRUE; } } else { env->SetBooleanField(This, g_allDayField, JNI_TRUE); @@ -481,10 +481,10 @@ static jboolean android_text_format_Time_parse3339(JNIEnv* env, if (len < 10) { jniThrowException(env, "android/util/TimeFormatException", "String too short --- expected at least 10 characters."); - return false; + return JNI_FALSE; } - jboolean inUtc = false; + jboolean inUtc = JNI_FALSE; ScopedStringChars s(env, strObj); @@ -495,57 +495,57 @@ static jboolean android_text_format_Time_parse3339(JNIEnv* env, n += get_char(env, s, 1, 100, &thrown); n += get_char(env, s, 2, 10, &thrown); n += get_char(env, s, 3, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_yearField, n); // - - if (!check_char(env, s, 4, '-')) return false; + if (!check_char(env, s, 4, '-')) return JNI_FALSE; // month n = get_char(env, s, 5, 10, &thrown); n += get_char(env, s, 6, 1, &thrown); --n; - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_monField, n); // - - if (!check_char(env, s, 7, '-')) return false; + if (!check_char(env, s, 7, '-')) return JNI_FALSE; // day n = get_char(env, s, 8, 10, &thrown); n += get_char(env, s, 9, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_mdayField, n); if (len >= 19) { // T - if (!check_char(env, s, 10, 'T')) return false; + if (!check_char(env, s, 10, 'T')) return JNI_FALSE; env->SetBooleanField(This, g_allDayField, JNI_FALSE); // hour n = get_char(env, s, 11, 10, &thrown); n += get_char(env, s, 12, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; int hour = n; // env->SetIntField(This, g_hourField, n); // : - if (!check_char(env, s, 13, ':')) return false; + if (!check_char(env, s, 13, ':')) return JNI_FALSE; // minute n = get_char(env, s, 14, 10, &thrown); n += get_char(env, s, 15, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; int minute = n; // env->SetIntField(This, g_minField, n); // : - if (!check_char(env, s, 16, ':')) return false; + if (!check_char(env, s, 16, ':')) return JNI_FALSE; // second n = get_char(env, s, 17, 10, &thrown); n += get_char(env, s, 18, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; env->SetIntField(This, g_secField, n); // skip the '.XYZ' -- we don't care about subsecond precision. @@ -579,32 +579,32 @@ static jboolean android_text_format_Time_parse3339(JNIEnv* env, jniThrowExceptionFmt(env, "android/util/TimeFormatException", "Unexpected character 0x%02x at position %d. Expected + or -", c, tz_index); - return false; + return JNI_FALSE; } - inUtc = true; + inUtc = JNI_TRUE; if (offset != 0) { if (len < tz_index + 6) { jniThrowExceptionFmt(env, "android/util/TimeFormatException", "Unexpected length; should be %d characters", tz_index + 6); - return false; + return JNI_FALSE; } // hour n = get_char(env, s, tz_index + 1, 10, &thrown); n += get_char(env, s, tz_index + 2, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; n *= offset; hour += n; // : - if (!check_char(env, s, tz_index + 3, ':')) return false; + if (!check_char(env, s, tz_index + 3, ':')) return JNI_FALSE; // minute n = get_char(env, s, tz_index + 4, 10, &thrown); n += get_char(env, s, tz_index + 5, 1, &thrown); - if (thrown) return false; + if (thrown) return JNI_FALSE; n *= offset; minute += n; } diff --git a/core/jni/android_util_Log.cpp b/core/jni/android_util_Log.cpp index 536a582..93dcbef 100644 --- a/core/jni/android_util_Log.cpp +++ b/core/jni/android_util_Log.cpp @@ -85,7 +85,7 @@ static jboolean android_util_Log_isLoggable(JNIEnv* env, jobject clazz, jstring jboolean result = false; if ((strlen(chars)+sizeof(LOG_NAMESPACE)) > PROPERTY_KEY_MAX) { char buf2[200]; - snprintf(buf2, sizeof(buf2), "Log tag \"%s\" exceeds limit of %d characters\n", + snprintf(buf2, sizeof(buf2), "Log tag \"%s\" exceeds limit of %zu characters\n", chars, PROPERTY_KEY_MAX - sizeof(LOG_NAMESPACE)); jniThrowException(env, "java/lang/IllegalArgumentException", buf2); diff --git a/libs/androidfw/BackupData.cpp b/libs/androidfw/BackupData.cpp index 2d0f755..bd9dc76 100644 --- a/libs/androidfw/BackupData.cpp +++ b/libs/androidfw/BackupData.cpp @@ -78,7 +78,7 @@ BackupDataWriter::write_padding_for(int n) paddingSize = padding_extra(n); if (paddingSize > 0) { uint32_t padding = 0xbcbcbcbc; - if (DEBUG) ALOGI("writing %d padding bytes for %d", paddingSize, n); + if (DEBUG) ALOGI("writing %zd padding bytes for %d", paddingSize, n); amt = write(m_fd, &padding, paddingSize); if (amt != paddingSize) { m_status = errno; @@ -112,7 +112,7 @@ BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize) k = key; } if (DEBUG) { - ALOGD("Writing header: prefix='%s' key='%s' dataSize=%d", m_keyPrefix.string(), + ALOGD("Writing header: prefix='%s' key='%s' dataSize=%zu", m_keyPrefix.string(), key.string(), dataSize); } @@ -125,7 +125,7 @@ BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize) header.keyLen = tolel(keyLen); header.dataSize = tolel(dataSize); - if (DEBUG) ALOGI("writing entity header, %d bytes", sizeof(entity_header_v1)); + if (DEBUG) ALOGI("writing entity header, %zu bytes", sizeof(entity_header_v1)); amt = write(m_fd, &header, sizeof(entity_header_v1)); if (amt != sizeof(entity_header_v1)) { m_status = errno; @@ -133,7 +133,7 @@ BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize) } m_pos += amt; - if (DEBUG) ALOGI("writing entity header key, %d bytes", keyLen+1); + if (DEBUG) ALOGI("writing entity header key, %zd bytes", keyLen+1); amt = write(m_fd, k.string(), keyLen+1); if (amt != keyLen+1) { m_status = errno; diff --git a/libs/androidfw/BackupHelpers.cpp b/libs/androidfw/BackupHelpers.cpp index ab837ad..52dce9f 100644 --- a/libs/androidfw/BackupHelpers.cpp +++ b/libs/androidfw/BackupHelpers.cpp @@ -639,7 +639,7 @@ int write_tarfile(const String8& packageName, const String8& domain, // size header -- calc len in digits by actually rendering the number // to a string - brute force but simple - snprintf(sizeStr, sizeof(sizeStr), "%lld", s.st_size); + snprintf(sizeStr, sizeof(sizeStr), "%lld", (long long)s.st_size); p += write_pax_header_entry(p, "size", sizeStr); // fullname was generated above with the ustar paths @@ -661,7 +661,7 @@ int write_tarfile(const String8& packageName, const String8& domain, // [ 124 : 12 ] size of pax extended header data memset(paxHeader + 124, 0, 12); - snprintf(paxHeader + 124, 12, "%011o", p - paxData); + snprintf(paxHeader + 124, 12, "%011o", (unsigned int)(p - paxData)); // Checksum and write the pax block header calc_tar_checksum(paxHeader); @@ -681,7 +681,10 @@ int write_tarfile(const String8& packageName, const String8& domain, if (!isdir) { off64_t toWrite = s.st_size; while (toWrite > 0) { - size_t toRead = (toWrite < BUFSIZE) ? toWrite : BUFSIZE; + size_t toRead = toWrite; + if (toRead > BUFSIZE) { + toRead = BUFSIZE; + } ssize_t nRead = read(fd, buf, toRead); if (nRead < 0) { err = errno; @@ -1095,8 +1098,8 @@ backup_helper_test_four() if (name != filenames[i] || states[i].modTime_sec != state.modTime_sec || states[i].modTime_nsec != state.modTime_nsec || states[i].mode != state.mode || states[i].size != state.size || states[i].crc32 != states[i].crc32) { - fprintf(stderr, "state %zu expected={%d/%d, 0x%08x, %04o, 0x%08x, %3d} '%s'\n" - " actual={%d/%d, 0x%08x, %04o, 0x%08x, %3zu} '%s'\n", i, + fprintf(stderr, "state %zu expected={%d/%d, %04o, 0x%08x, 0x%08x, %3zu} '%s'\n" + " actual={%d/%d, %04o, 0x%08x, 0x%08x, %3d} '%s'\n", i, states[i].modTime_sec, states[i].modTime_nsec, states[i].mode, states[i].size, states[i].crc32, name.length(), filenames[i].string(), state.modTime_sec, state.modTime_nsec, state.mode, state.size, state.crc32, @@ -1194,7 +1197,7 @@ int test_read_header_and_entity(BackupDataReader& reader, const char* str) { int err; - int bufSize = strlen(str)+1; + size_t bufSize = strlen(str)+1; char* buf = (char*)malloc(bufSize); String8 string; int cookie = 0x11111111; @@ -1229,9 +1232,9 @@ test_read_header_and_entity(BackupDataReader& reader, const char* str) err = EINVAL; goto finished; } - if ((int)actualSize != bufSize) { - fprintf(stderr, "ReadEntityHeader expected dataSize 0x%08x got 0x%08zx\n", bufSize, - actualSize); + if (actualSize != bufSize) { + fprintf(stderr, "ReadEntityHeader expected dataSize %zu got %zu\n", + bufSize, actualSize); err = EINVAL; goto finished; } diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp index 2b74a33..166863c 100644 --- a/libs/androidfw/CursorWindow.cpp +++ b/libs/androidfw/CursorWindow.cpp @@ -210,8 +210,8 @@ uint32_t CursorWindow::alloc(size_t size, bool aligned) { uint32_t offset = mHeader->freeOffset + padding; uint32_t nextFreeOffset = offset + size; if (nextFreeOffset > mSize) { - ALOGW("Window is full: requested allocation %d bytes, " - "free space %d bytes, window size %d bytes", + ALOGW("Window is full: requested allocation %zu bytes, " + "free space %zu bytes, window size %zu bytes", size, freeSpace(), mSize); return 0; } diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 652cd4a..1ffe665 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -5996,12 +5996,12 @@ void ResTable::print(bool inclValues) const uintptr_t esize = dtohs(ent->size); if ((esize&0x3) != 0) { - printf("NON-INTEGER ResTable_entry SIZE: 0x%x\n", esize); + printf("NON-INTEGER ResTable_entry SIZE: %p\n", (void *)esize); continue; } if ((thisOffset+esize) > typeSize) { - printf("ResTable_entry OUT OF BOUNDS: 0x%x+0x%x+0x%x (size is 0x%x)\n", - entriesStart, thisOffset, esize, typeSize); + printf("ResTable_entry OUT OF BOUNDS: 0x%x+0x%x+%p (size is 0x%x)\n", + entriesStart, thisOffset, (void *)esize, typeSize); continue; } diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index d276a29..77292bf 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -31,9 +31,9 @@ void ResourceCache::logCache() { ALOGD("ResourceCache: cacheReport:"); for (size_t i = 0; i < mCache->size(); ++i) { ResourceReference* ref = mCache->valueAt(i); - ALOGD(" ResourceCache: mCache(%d): resource, ref = 0x%p, 0x%p", + ALOGD(" ResourceCache: mCache(%zu): resource, ref = 0x%p, 0x%p", i, mCache->keyAt(i), mCache->valueAt(i)); - ALOGD(" ResourceCache: mCache(%d): refCount, recycled, destroyed, type = %d, %d, %d, %d", + ALOGD(" ResourceCache: mCache(%zu): refCount, recycled, destroyed, type = %d, %d, %d, %d", i, ref->refCount, ref->recycled, ref->destroyed, ref->resourceType); } } diff --git a/libs/usb/tests/AccessoryChat/accessorychat/accessorychat.c b/libs/usb/tests/AccessoryChat/accessorychat/accessorychat.c index 06b477f..57c0320 100644 --- a/libs/usb/tests/AccessoryChat/accessorychat/accessorychat.c +++ b/libs/usb/tests/AccessoryChat/accessorychat/accessorychat.c @@ -32,7 +32,7 @@ struct usb_device *sDevice = NULL; static void* read_thread(void* arg) { - int endpoint = (int)arg; + int endpoint = (int)(uintptr_t)arg; int ret = 0; while (sDevice && ret >= 0) { @@ -52,7 +52,7 @@ static void* read_thread(void* arg) { } static void* write_thread(void* arg) { - int endpoint = (int)arg; + int endpoint = (int)(uintptr_t)arg; int ret = 0; while (ret >= 0) { @@ -136,11 +136,11 @@ static int usb_device_added(const char *devname, void* client_data) { } if ((ep1->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) { - pthread_create(&th, NULL, read_thread, (void *)ep1->bEndpointAddress); - pthread_create(&th, NULL, write_thread, (void *)ep2->bEndpointAddress); + pthread_create(&th, NULL, read_thread, (void *)(uintptr_t)ep1->bEndpointAddress); + pthread_create(&th, NULL, write_thread, (void *)(uintptr_t)ep2->bEndpointAddress); } else { - pthread_create(&th, NULL, read_thread, (void *)ep2->bEndpointAddress); - pthread_create(&th, NULL, write_thread, (void *)ep1->bEndpointAddress); + pthread_create(&th, NULL, read_thread, (void *)(uintptr_t)ep2->bEndpointAddress); + pthread_create(&th, NULL, write_thread, (void *)(uintptr_t)ep1->bEndpointAddress); } } else { printf("Found possible android device - attempting to switch to accessory mode\n"); diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index 72ce3cc..8129c0d 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -17,11 +17,12 @@ #define LOG_TAG "MtpDatabaseJNI" #include "utils/Log.h" -#include <stdio.h> #include <assert.h> +#include <fcntl.h> +#include <inttypes.h> #include <limits.h> +#include <stdio.h> #include <unistd.h> -#include <fcntl.h> #include "jni.h" #include "JNIHelp.h" @@ -388,7 +389,7 @@ MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle, // release date is stored internally as just the year if (property == MTP_PROPERTY_ORIGINAL_RELEASE_DATE) { char date[20]; - snprintf(date, sizeof(date), "%04lld0101T000000", longValue); + snprintf(date, sizeof(date), "%04" PRId64 "0101T000000", longValue); packet.putString(date); goto out; } @@ -645,7 +646,7 @@ MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property return result; } -MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty property) { +MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty /*property*/) { return -1; } @@ -1090,7 +1091,7 @@ android_mtp_MtpDatabase_finalize(JNIEnv *env, jobject thiz) } static jstring -android_mtp_MtpPropertyGroup_format_date_time(JNIEnv *env, jobject thiz, jlong seconds) +android_mtp_MtpPropertyGroup_format_date_time(JNIEnv *env, jobject /*thiz*/, jlong seconds) { char date[20]; formatDateTime(seconds, date, sizeof(date)); diff --git a/services/common_time/common_time_server.cpp b/services/common_time/common_time_server.cpp index 21e706f..3e11987 100644 --- a/services/common_time/common_time_server.cpp +++ b/services/common_time/common_time_server.cpp @@ -590,7 +590,7 @@ static void hexDumpToString(const uint8_t* src, size_t src_len, for (i = 0; (i < src_len) && (offset < dst_len); ++i) { int res; if (0 == (i % 16)) { - res = snprintf(dst + offset, dst_len - offset, "\n%04x :", i); + res = snprintf(dst + offset, dst_len - offset, "\n%04zx :", i); if (res < 0) break; offset += res; diff --git a/services/common_time/utils.cpp b/services/common_time/utils.cpp index ed2c77d..ddcdfe7 100644 --- a/services/common_time/utils.cpp +++ b/services/common_time/utils.cpp @@ -56,7 +56,7 @@ LogRing::LogRing(const char* header, size_t entries) , mHeader(header) { mRingBuffer = new Entry[mSize]; if (NULL == mRingBuffer) - ALOGE("Failed to allocate log ring with %u entries.", mSize); + ALOGE("Failed to allocate log ring with %zu entries.", mSize); } LogRing::~LogRing() { @@ -150,7 +150,7 @@ void LogRing::dumpLog(int fd) { localtime_r(&mRingBuffer[ndx].first_ts.tv_sec, &t); strftime(timebuf, sizeof(timebuf), kTimeFmt, &t); - res = snprintf(buf, sizeof(buf), "[%2d] %s.%03ld :: %s%s\n", + res = snprintf(buf, sizeof(buf), "[%2zu] %s.%03ld :: %s%s\n", i, timebuf, mRingBuffer[ndx].first_ts.tv_usec / 1000, mRingBuffer[ndx].s.string(), diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp index fc64656..e3a3e17 100644 --- a/services/input/EventHub.cpp +++ b/services/input/EventHub.cpp @@ -759,7 +759,7 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz if (readSize == 0 || (readSize < 0 && errno == ENODEV)) { // Device was removed before INotify noticed. ALOGW("could not get event, removed? (fd: %d size: %d bufferSize: %d " - "capacity: %d errno: %d)\n", + "capacity: %zu errno: %d)\n", device->fd, readSize, bufferSize, capacity, errno); deviceChanged = true; closeDeviceLocked(device); diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp index 10a639e..06a57d5 100644 --- a/services/input/InputDispatcher.cpp +++ b/services/input/InputDispatcher.cpp @@ -147,7 +147,7 @@ static bool validateMotionEvent(int32_t action, size_t pointerCount, return false; } if (pointerCount < 1 || pointerCount > MAX_POINTERS) { - ALOGE("Motion event has invalid pointer count %d; value must be between 1 and %d.", + ALOGE("Motion event has invalid pointer count %zu; value must be between 1 and %d.", pointerCount, MAX_POINTERS); return false; } @@ -3107,7 +3107,7 @@ void InputDispatcher::dumpDispatchStateLocked(String8& dump) { dump.append(INDENT "TouchedWindows:\n"); for (size_t i = 0; i < mTouchState.windows.size(); i++) { const TouchedWindow& touchedWindow = mTouchState.windows[i]; - dump.appendFormat(INDENT2 "%d: name='%s', pointerIds=0x%0x, targetFlags=0x%x\n", + dump.appendFormat(INDENT2 "%zu: name='%s', pointerIds=0x%0x, targetFlags=0x%x\n", i, touchedWindow.windowHandle->getName().string(), touchedWindow.pointerIds.value, touchedWindow.targetFlags); @@ -3122,7 +3122,7 @@ void InputDispatcher::dumpDispatchStateLocked(String8& dump) { const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i); const InputWindowInfo* windowInfo = windowHandle->getInfo(); - dump.appendFormat(INDENT2 "%d: name='%s', displayId=%d, " + dump.appendFormat(INDENT2 "%zu: name='%s', displayId=%d, " "paused=%s, hasFocus=%s, hasWallpaper=%s, " "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, " "frame=[%d,%d][%d,%d], scale=%f, " @@ -3152,7 +3152,7 @@ void InputDispatcher::dumpDispatchStateLocked(String8& dump) { dump.append(INDENT "MonitoringChannels:\n"); for (size_t i = 0; i < mMonitoringChannels.size(); i++) { const sp<InputChannel>& channel = mMonitoringChannels[i]; - dump.appendFormat(INDENT2 "%d: '%s'\n", i, channel->getName().string()); + dump.appendFormat(INDENT2 "%zu: '%s'\n", i, channel->getName().string()); } } else { dump.append(INDENT "MonitoringChannels: <none>\n"); @@ -3201,7 +3201,7 @@ void InputDispatcher::dumpDispatchStateLocked(String8& dump) { dump.append(INDENT "Connections:\n"); for (size_t i = 0; i < mConnectionsByFd.size(); i++) { const sp<Connection>& connection = mConnectionsByFd.valueAt(i); - dump.appendFormat(INDENT2 "%d: channelName='%s', windowName='%s', " + dump.appendFormat(INDENT2 "%zu: channelName='%s', windowName='%s', " "status=%s, monitor=%s, inputPublisherBlocked=%s\n", i, connection->getInputChannelName(), connection->getWindowName(), connection->getStatusLabel(), toString(connection->monitor), diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp index 03852a5..d86fa4f 100644 --- a/services/input/InputReader.cpp +++ b/services/input/InputReader.cpp @@ -1992,7 +1992,7 @@ void KeyboardInputMapper::dump(String8& dump) { dumpParameters(dump); dump.appendFormat(INDENT3 "KeyboardType: %d\n", mKeyboardType); dump.appendFormat(INDENT3 "Orientation: %d\n", mOrientation); - dump.appendFormat(INDENT3 "KeyDowns: %d keys currently down\n", mKeyDowns.size()); + dump.appendFormat(INDENT3 "KeyDowns: %zu keys currently down\n", mKeyDowns.size()); dump.appendFormat(INDENT3 "MetaState: 0x%0x\n", mMetaState); dump.appendFormat(INDENT3 "DownTime: %lld\n", mDownTime); } @@ -3372,7 +3372,7 @@ void TouchInputMapper::dumpVirtualKeys(String8& dump) { for (size_t i = 0; i < mVirtualKeys.size(); i++) { const VirtualKey& virtualKey = mVirtualKeys.itemAt(i); - dump.appendFormat(INDENT4 "%d: scanCode=%d, keyCode=%d, " + dump.appendFormat(INDENT4 "%zu: scanCode=%d, keyCode=%d, " "hitLeft=%d, hitRight=%d, hitTop=%d, hitBottom=%d\n", i, virtualKey.scanCode, virtualKey.keyCode, virtualKey.hitLeft, virtualKey.hitRight, @@ -6119,8 +6119,8 @@ void MultiTouchInputMapper::configureRawPointerAxes() { && mRawPointerAxes.slot.minValue == 0 && mRawPointerAxes.slot.maxValue > 0) { size_t slotCount = mRawPointerAxes.slot.maxValue + 1; if (slotCount > MAX_SLOTS) { - ALOGW("MultiTouch Device %s reported %d slots but the framework " - "only supports a maximum of %d slots at this time.", + ALOGW("MultiTouch Device %s reported %zu slots but the framework " + "only supports a maximum of %zu slots at this time.", getDeviceName().string(), slotCount, MAX_SLOTS); slotCount = MAX_SLOTS; } @@ -6292,7 +6292,7 @@ void JoystickInputMapper::configure(nsecs_t when, // If there are too many axes, start dropping them. // Prefer to keep explicitly mapped axes. if (mAxes.size() > PointerCoords::MAX_AXES) { - ALOGI("Joystick '%s' has %d axes but the framework only supports a maximum of %d.", + ALOGI("Joystick '%s' has %zu axes but the framework only supports a maximum of %d.", getDeviceName().string(), mAxes.size(), PointerCoords::MAX_AXES); pruneAxes(true); pruneAxes(false); diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index d651a62..b42bce2 100755 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -1142,6 +1142,7 @@ final class ActivityStack { // At this point, nothing else needs to be shown if (DEBUG_VISBILITY) Slog.v(TAG, "Fullscreen: at " + r); behindFullscreen = true; + showHomeBehindStack = false; } else if (isActivityOverHome(r)) { if (DEBUG_VISBILITY) Slog.v(TAG, "Showing home: at " + r); showHomeBehindStack = true; diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java index e599409..ed025e1 100644 --- a/services/java/com/android/server/pm/Settings.java +++ b/services/java/com/android/server/pm/Settings.java @@ -1427,6 +1427,7 @@ final class Settings { // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES: // system/core/run-as/run-as.c // system/core/sdcard/sdcard.c + // external/libselinux/src/android.c:package_info_init() // sb.setLength(0); sb.append(ai.packageName); diff --git a/services/jni/com_android_server_AlarmManagerService.cpp b/services/jni/com_android_server_AlarmManagerService.cpp index c26a516..a58b00bce 100644 --- a/services/jni/com_android_server_AlarmManagerService.cpp +++ b/services/jni/com_android_server_AlarmManagerService.cpp @@ -365,7 +365,9 @@ static void android_server_AlarmManagerService_set(JNIEnv*, jobject, jlong nativ int result = impl->set(type, &ts); if (result < 0) { - ALOGE("Unable to set alarm to %lld.%09lld: %s\n", seconds, nanoseconds, strerror(errno)); + ALOGE("Unable to set alarm to %lld.%09lld: %s\n", + static_cast<long long>(seconds), + static_cast<long long>(nanoseconds), strerror(errno)); } } diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java index 323e0ac..1c75658 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -101,8 +101,93 @@ public class DisconnectCause { /** Unknown error or not specified */ public static final int ERROR_UNSPECIFIED = 36; + /** Smallest valid value for call disconnect codes. */ + public static final int MINIMUM_VALID_VALUE = NOT_DISCONNECTED; + /** Largest valid value for call disconnect codes. */ + public static final int MAXIMUM_VALID_VALUE = ERROR_UNSPECIFIED; + /** Private constructor to avoid class instantiation. */ private DisconnectCause() { // Do nothing. } + + /** Returns descriptive string for the specified disconnect cause. */ + public static String toString(int cause) { + switch (cause) { + case NOT_DISCONNECTED: + return "NOT_DISCONNECTED"; + case INCOMING_MISSED: + return "INCOMING_MISSED"; + case NORMAL: + return "NORMAL"; + case LOCAL: + return "LOCAL"; + case BUSY: + return "BUSY"; + case CONGESTION: + return "CONGESTION"; + case INVALID_NUMBER: + return "INVALID_NUMBER"; + case NUMBER_UNREACHABLE: + return "NUMBER_UNREACHABLE"; + case SERVER_UNREACHABLE: + return "SERVER_UNREACHABLE"; + case INVALID_CREDENTIALS: + return "INVALID_CREDENTIALS"; + case OUT_OF_NETWORK: + return "OUT_OF_NETWORK"; + case SERVER_ERROR: + return "SERVER_ERROR"; + case TIMED_OUT: + return "TIMED_OUT"; + case LOST_SIGNAL: + return "LOST_SIGNAL"; + case LIMIT_EXCEEDED: + return "LIMIT_EXCEEDED"; + case INCOMING_REJECTED: + return "INCOMING_REJECTED"; + case POWER_OFF: + return "POWER_OFF"; + case OUT_OF_SERVICE: + return "OUT_OF_SERVICE"; + case ICC_ERROR: + return "ICC_ERROR"; + case CALL_BARRED: + return "CALL_BARRED"; + case FDN_BLOCKED: + return "FDN_BLOCKED"; + case CS_RESTRICTED: + return "CS_RESTRICTED"; + case CS_RESTRICTED_NORMAL: + return "CS_RESTRICTED_NORMAL"; + case CS_RESTRICTED_EMERGENCY: + return "CS_RESTRICTED_EMERGENCY"; + case UNOBTAINABLE_NUMBER: + return "UNOBTAINABLE_NUMBER"; + case CDMA_LOCKED_UNTIL_POWER_CYCLE: + return "CDMA_LOCKED_UNTIL_POWER_CYCLE"; + case CDMA_DROP: + return "CDMA_DROP"; + case CDMA_INTERCEPT: + return "CDMA_INTERCEPT"; + case CDMA_REORDER: + return "CDMA_REORDER"; + case CDMA_SO_REJECT: + return "CDMA_SO_REJECT"; + case CDMA_RETRY_ORDER: + return "CDMA_RETRY_ORDER"; + case CDMA_ACCESS_FAILURE: + return "CDMA_ACCESS_FAILURE"; + case CDMA_PREEMPTED: + return "CDMA_PREEMPTED"; + case CDMA_NOT_EMERGENCY: + return "CDMA_NOT_EMERGENCY"; + case CDMA_ACCESS_BLOCKED: + return "CDMA_ACCESS_BLOCKED"; + case ERROR_UNSPECIFIED: + return "ERROR_UNSPECIFIED"; + default: + return "INVALID"; + } + } } diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index 38bf540..0b1f985 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -1317,9 +1317,9 @@ status_t compileResourceFile(Bundle* bundle, curIsFormatted = false; // Untranslatable strings must only exist in the default [empty] locale if (locale.size() > 0) { - fprintf(stderr, "aapt: warning: string '%s' in %s marked untranslatable but exists" - " in locale '%s'\n", String8(name).string(), - bundle->getResourceSourceDirs()[0], + SourcePos(in->getPrintableSource(), block.getLineNumber()).warning( + "string '%s' marked untranslatable but exists in locale '%s'\n", + String8(name).string(), locale.string()); // hasErrors = localHasErrors = true; } else { @@ -1330,7 +1330,10 @@ status_t compileResourceFile(Bundle* bundle, // having no default translation. } } else { - outTable->addLocalization(name, locale); + outTable->addLocalization( + name, + locale, + SourcePos(in->getPrintableSource(), block.getLineNumber())); } if (formatted == false16) { @@ -2570,9 +2573,9 @@ status_t ResourceTable::addSymbols(const sp<AaptSymbols>& outSymbols) { void -ResourceTable::addLocalization(const String16& name, const String8& locale) +ResourceTable::addLocalization(const String16& name, const String8& locale, const SourcePos& src) { - mLocalizations[name].insert(locale); + mLocalizations[name][locale] = src; } @@ -2592,21 +2595,22 @@ ResourceTable::validateLocalizations(void) const String8 defaultLocale; // For all strings... - for (map<String16, set<String8> >::iterator nameIter = mLocalizations.begin(); + for (map<String16, map<String8, SourcePos> >::iterator nameIter = mLocalizations.begin(); nameIter != mLocalizations.end(); nameIter++) { - const set<String8>& configSet = nameIter->second; // naming convenience + const map<String8, SourcePos>& configSrcMap = nameIter->second; // Look for strings with no default localization - if (configSet.count(defaultLocale) == 0) { - fprintf(stdout, "aapt: warning: string '%s' has no default translation in %s; found:", - String8(nameIter->first).string(), mBundle->getResourceSourceDirs()[0]); - for (set<String8>::const_iterator locales = configSet.begin(); - locales != configSet.end(); - locales++) { - fprintf(stdout, " %s", (*locales).string()); - } - fprintf(stdout, "\n"); + if (configSrcMap.count(defaultLocale) == 0) { + SourcePos().warning("string '%s' has no default translation.", + String8(nameIter->first).string()); + if (mBundle->getVerbose()) { + for (map<String8, SourcePos>::const_iterator locales = configSrcMap.begin(); + locales != configSrcMap.end(); + locales++) { + locales->second.printf("locale %s found", locales->first.string()); + } + } // !!! TODO: throw an error here in some circumstances } @@ -2616,6 +2620,8 @@ ResourceTable::validateLocalizations(void) const char* start = allConfigs; const char* comma; + set<String8> missingConfigs; + AaptLocaleValue locale; do { String8 config; comma = strchr(start, ','); @@ -2626,27 +2632,38 @@ ResourceTable::validateLocalizations(void) config.setTo(start); } + if (!locale.initFromFilterString(config)) { + continue; + } + // don't bother with the pseudolocale "zz_ZZ" if (config != "zz_ZZ") { - if (configSet.find(config) == configSet.end()) { + if (configSrcMap.find(config) == configSrcMap.end()) { // okay, no specific localization found. it's possible that we are // requiring a specific regional localization [e.g. de_DE] but there is an // available string in the generic language localization [e.g. de]; // consider that string to have fulfilled the localization requirement. String8 region(config.string(), 2); - if (configSet.find(region) == configSet.end()) { - if (configSet.count(defaultLocale) == 0) { - fprintf(stdout, "aapt: warning: " - "**** string '%s' has no default or required localization " - "for '%s' in %s\n", - String8(nameIter->first).string(), - config.string(), - mBundle->getResourceSourceDirs()[0]); - } + if (configSrcMap.find(region) == configSrcMap.end() && + configSrcMap.count(defaultLocale) == 0) { + missingConfigs.insert(config); } } } - } while (comma != NULL); + } while (comma != NULL); + + if (!missingConfigs.empty()) { + String8 configStr; + for (set<String8>::iterator iter = missingConfigs.begin(); + iter != missingConfigs.end(); + iter++) { + configStr.appendFormat(" %s", iter->string()); + } + SourcePos().warning("string '%s' is missing %u required localizations:%s", + String8(nameIter->first).string(), + (unsigned int)missingConfigs.size(), + configStr.string()); + } } } diff --git a/tools/aapt/ResourceTable.h b/tools/aapt/ResourceTable.h index a3e0666..75005cd 100644 --- a/tools/aapt/ResourceTable.h +++ b/tools/aapt/ResourceTable.h @@ -220,7 +220,7 @@ public: status_t assignResourceIds(); status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL); - void addLocalization(const String16& name, const String8& locale); + void addLocalization(const String16& name, const String8& locale, const SourcePos& src); status_t validateLocalizations(void); status_t flatten(Bundle*, const sp<AaptFile>& dest); @@ -551,7 +551,7 @@ private: Bundle* mBundle; // key = string resource name, value = set of locales in which that name is defined - map<String16, set<String8> > mLocalizations; + map<String16, map<String8, SourcePos> > mLocalizations; }; #endif diff --git a/tools/aapt/SourcePos.cpp b/tools/aapt/SourcePos.cpp index e2a921c..ae25047 100644 --- a/tools/aapt/SourcePos.cpp +++ b/tools/aapt/SourcePos.cpp @@ -10,17 +10,20 @@ using namespace std; // ============================================================================= struct ErrorPos { + enum Level { + NOTE, + WARNING, + ERROR + }; + String8 file; int line; String8 error; - bool fatal; + Level level; ErrorPos(); ErrorPos(const ErrorPos& that); - ErrorPos(const String8& file, int line, const String8& error, bool fatal); - ~ErrorPos(); - bool operator<(const ErrorPos& rhs) const; - bool operator==(const ErrorPos& rhs) const; + ErrorPos(const String8& file, int line, const String8& error, Level level); ErrorPos& operator=(const ErrorPos& rhs); void print(FILE* to) const; @@ -29,7 +32,7 @@ struct ErrorPos static vector<ErrorPos> g_errors; ErrorPos::ErrorPos() - :line(-1), fatal(false) + :line(-1), level(NOTE) { } @@ -37,41 +40,16 @@ ErrorPos::ErrorPos(const ErrorPos& that) :file(that.file), line(that.line), error(that.error), - fatal(that.fatal) + level(that.level) { } -ErrorPos::ErrorPos(const String8& f, int l, const String8& e, bool fat) +ErrorPos::ErrorPos(const String8& f, int l, const String8& e, Level lev) :file(f), line(l), error(e), - fatal(fat) -{ -} - -ErrorPos::~ErrorPos() -{ -} - -bool -ErrorPos::operator<(const ErrorPos& rhs) const -{ - if (this->file < rhs.file) return true; - if (this->file == rhs.file) { - if (this->line < rhs.line) return true; - if (this->line == rhs.line) { - if (this->error < rhs.error) return true; - } - } - return false; -} - -bool -ErrorPos::operator==(const ErrorPos& rhs) const + level(lev) { - return this->file == rhs.file - && this->line == rhs.line - && this->error == rhs.error; } ErrorPos& @@ -80,18 +58,34 @@ ErrorPos::operator=(const ErrorPos& rhs) this->file = rhs.file; this->line = rhs.line; this->error = rhs.error; + this->level = rhs.level; return *this; } void ErrorPos::print(FILE* to) const { - const char* type = fatal ? "error:" : "warning:"; + const char* type = ""; + switch (level) { + case NOTE: + type = "note: "; + break; + case WARNING: + type = "warning: "; + break; + case ERROR: + type = "error: "; + break; + } - if (this->line >= 0) { - fprintf(to, "%s:%d: %s %s\n", this->file.string(), this->line, type, this->error.string()); + if (!this->file.isEmpty()) { + if (this->line >= 0) { + fprintf(to, "%s:%d: %s%s\n", this->file.string(), this->line, type, this->error.string()); + } else { + fprintf(to, "%s: %s%s\n", this->file.string(), type, this->error.string()); + } } else { - fprintf(to, "%s: %s %s\n", this->file.string(), type, this->error.string()); + fprintf(to, "%s%s\n", type, this->error.string()); } } @@ -116,40 +110,34 @@ SourcePos::~SourcePos() { } -int +void SourcePos::error(const char* fmt, ...) const { - int retval=0; - char buf[1024]; va_list ap; va_start(ap, fmt); - retval = vsnprintf(buf, sizeof(buf), fmt, ap); + String8 msg = String8::formatV(fmt, ap); va_end(ap); - char* p = buf + retval - 1; - while (p > buf && *p == '\n') { - *p = '\0'; - p--; - } - g_errors.push_back(ErrorPos(this->file, this->line, String8(buf), true)); - return retval; + g_errors.push_back(ErrorPos(this->file, this->line, msg, ErrorPos::ERROR)); } -int +void SourcePos::warning(const char* fmt, ...) const { - int retval=0; - char buf[1024]; va_list ap; va_start(ap, fmt); - retval = vsnprintf(buf, sizeof(buf), fmt, ap); + String8 msg = String8::formatV(fmt, ap); va_end(ap); - char* p = buf + retval - 1; - while (p > buf && *p == '\n') { - *p = '\0'; - p--; - } - ErrorPos(this->file, this->line, String8(buf), false).print(stderr); - return retval; + ErrorPos(this->file, this->line, msg, ErrorPos::WARNING).print(stderr); +} + +void +SourcePos::printf(const char* fmt, ...) const +{ + va_list ap; + va_start(ap, fmt); + String8 msg = String8::formatV(fmt, ap); + va_end(ap); + ErrorPos(this->file, this->line, msg, ErrorPos::NOTE).print(stderr); } bool diff --git a/tools/aapt/SourcePos.h b/tools/aapt/SourcePos.h index 33f72a9..4ce817f 100644 --- a/tools/aapt/SourcePos.h +++ b/tools/aapt/SourcePos.h @@ -17,8 +17,9 @@ public: SourcePos(); ~SourcePos(); - int error(const char* fmt, ...) const; - int warning(const char* fmt, ...) const; + void error(const char* fmt, ...) const; + void warning(const char* fmt, ...) const; + void printf(const char* fmt, ...) const; static bool hasErrors(); static void printErrors(FILE* to); |