Merge commit '78be0498' into manualmerge
Conflicts: libs/androidfw/ResourceTypes.cpp tools/aapt/Android.mk tools/aapt/StringPool.cpp tools/aapt/StringPool.h Change-Id: I9d69efdfb892032895ace12159d193304f02dc6c
This commit is contained in:
@@ -36,6 +36,17 @@
|
||||
|
||||
namespace android {
|
||||
|
||||
/**
|
||||
* In C++11, char16_t is defined as *at least* 16 bits. We do a lot of
|
||||
* casting on raw data and expect char16_t to be exactly 16 bits.
|
||||
*/
|
||||
#if __cplusplus >= 201103L
|
||||
struct __assertChar16Size {
|
||||
static_assert(sizeof(char16_t) == sizeof(uint16_t), "char16_t is not 16 bits");
|
||||
static_assert(alignof(char16_t) == alignof(uint16_t), "char16_t is not 16-bit aligned");
|
||||
};
|
||||
#endif
|
||||
|
||||
/** ********************************************************************
|
||||
* PNG Extensions
|
||||
*
|
||||
@@ -845,7 +856,7 @@ struct ResTable_package
|
||||
uint32_t id;
|
||||
|
||||
// Actual name of this package, \0-terminated.
|
||||
char16_t name[128];
|
||||
uint16_t name[128];
|
||||
|
||||
// Offset to a ResStringPool_header defining the resource
|
||||
// type symbol table. If zero, this package is inheriting from
|
||||
@@ -1450,7 +1461,7 @@ struct ResTable_lib_entry
|
||||
uint32_t packageId;
|
||||
|
||||
// The package name of the shared library. \0 terminated.
|
||||
char16_t packageName[128];
|
||||
uint16_t packageName[128];
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
|
||||
# libandroidfw is partially built for the host (used by obbtool and others)
|
||||
# libandroidfw is partially built for the host (used by obbtool, aapt, and others)
|
||||
# These files are common to host and target builds.
|
||||
|
||||
commonSources := \
|
||||
@@ -35,27 +35,18 @@ deviceSources := \
|
||||
BackupHelpers.cpp \
|
||||
CursorWindow.cpp
|
||||
|
||||
hostSources := \
|
||||
$(commonSources)
|
||||
hostSources := $(commonSources)
|
||||
|
||||
# For the host
|
||||
# =====================================================
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
||||
|
||||
LOCAL_SRC_FILES:= $(hostSources)
|
||||
|
||||
LOCAL_MODULE:= libandroidfw
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
external/zlib
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := liblog libziparchive-host libutils
|
||||
LOCAL_SRC_FILES:= $(hostSources)
|
||||
LOCAL_C_INCLUDES := external/zlib
|
||||
|
||||
include $(BUILD_HOST_STATIC_LIBRARY)
|
||||
|
||||
@@ -66,8 +57,13 @@ include $(BUILD_HOST_STATIC_LIBRARY)
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
||||
|
||||
LOCAL_MODULE:= libandroidfw
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_SRC_FILES:= $(deviceSources)
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
external/zlib \
|
||||
system/core/include
|
||||
LOCAL_STATIC_LIBRARIES := libziparchive
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libbinder \
|
||||
liblog \
|
||||
@@ -75,16 +71,6 @@ LOCAL_SHARED_LIBRARIES := \
|
||||
libutils \
|
||||
libz
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := libziparchive
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
external/zlib \
|
||||
system/core/include
|
||||
|
||||
LOCAL_MODULE:= libandroidfw
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
|
||||
|
||||
@@ -87,11 +87,11 @@ inline static T max(T a, T b) {
|
||||
// range checked; guaranteed to NUL-terminate within the stated number of available slots
|
||||
// NOTE: if this truncates the dst string due to running out of space, no attempt is
|
||||
// made to avoid splitting surrogate pairs.
|
||||
static void strcpy16_dtoh(char16_t* dst, const char16_t* src, size_t avail)
|
||||
static void strcpy16_dtoh(char16_t* dst, const uint16_t* src, size_t avail)
|
||||
{
|
||||
char16_t* last = dst + avail - 1;
|
||||
while (*src && (dst < last)) {
|
||||
char16_t s = dtohs(*src);
|
||||
char16_t s = dtohs(static_cast<char16_t>(*src));
|
||||
*dst++ = s;
|
||||
src++;
|
||||
}
|
||||
@@ -501,7 +501,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
|
||||
if (mHeader->flags&ResStringPool_header::UTF8_FLAG) {
|
||||
charSize = sizeof(uint8_t);
|
||||
} else {
|
||||
charSize = sizeof(char16_t);
|
||||
charSize = sizeof(uint16_t);
|
||||
}
|
||||
|
||||
// There should be at least space for the smallest string
|
||||
@@ -547,8 +547,8 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
|
||||
e[i] = dtohl(mEntries[i]);
|
||||
}
|
||||
if (!(mHeader->flags&ResStringPool_header::UTF8_FLAG)) {
|
||||
const char16_t* strings = (const char16_t*)mStrings;
|
||||
char16_t* s = const_cast<char16_t*>(strings);
|
||||
const uint16_t* strings = (const uint16_t*)mStrings;
|
||||
uint16_t* s = const_cast<uint16_t*>(strings);
|
||||
for (i=0; i<mStringPoolSize; i++) {
|
||||
s[i] = dtohs(strings[i]);
|
||||
}
|
||||
@@ -558,7 +558,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
|
||||
if ((mHeader->flags&ResStringPool_header::UTF8_FLAG &&
|
||||
((uint8_t*)mStrings)[mStringPoolSize-1] != 0) ||
|
||||
(!mHeader->flags&ResStringPool_header::UTF8_FLAG &&
|
||||
((char16_t*)mStrings)[mStringPoolSize-1] != 0)) {
|
||||
((uint16_t*)mStrings)[mStringPoolSize-1] != 0)) {
|
||||
ALOGW("Bad string block: last string is not 0-terminated\n");
|
||||
return (mError=BAD_TYPE);
|
||||
}
|
||||
@@ -656,7 +656,7 @@ void ResStringPool::uninit()
|
||||
* add it together with the next character.
|
||||
*/
|
||||
static inline size_t
|
||||
decodeLength(const char16_t** str)
|
||||
decodeLength(const uint16_t** str)
|
||||
{
|
||||
size_t len = **str;
|
||||
if ((len & 0x8000) != 0) {
|
||||
@@ -693,15 +693,15 @@ const char16_t* ResStringPool::stringAt(size_t idx, size_t* u16len) const
|
||||
{
|
||||
if (mError == NO_ERROR && idx < mHeader->stringCount) {
|
||||
const bool isUTF8 = (mHeader->flags&ResStringPool_header::UTF8_FLAG) != 0;
|
||||
const uint32_t off = mEntries[idx]/(isUTF8?sizeof(char):sizeof(char16_t));
|
||||
const uint32_t off = mEntries[idx]/(isUTF8?sizeof(uint8_t):sizeof(uint16_t));
|
||||
if (off < (mStringPoolSize-1)) {
|
||||
if (!isUTF8) {
|
||||
const char16_t* strings = (char16_t*)mStrings;
|
||||
const char16_t* str = strings+off;
|
||||
const uint16_t* strings = (uint16_t*)mStrings;
|
||||
const uint16_t* str = strings+off;
|
||||
|
||||
*u16len = decodeLength(&str);
|
||||
if ((uint32_t)(str+*u16len-strings) < mStringPoolSize) {
|
||||
return str;
|
||||
return reinterpret_cast<const char16_t*>(str);
|
||||
} else {
|
||||
ALOGW("Bad string block: string #%d extends to %d, past end at %d\n",
|
||||
(int)idx, (int)(str+*u16len-strings), (int)mStringPoolSize);
|
||||
@@ -5665,8 +5665,8 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
|
||||
if (idx == 0) {
|
||||
idx = mPackageGroups.size() + 1;
|
||||
|
||||
char16_t tmpName[sizeof(pkg->name)/sizeof(char16_t)];
|
||||
strcpy16_dtoh(tmpName, pkg->name, sizeof(pkg->name)/sizeof(char16_t));
|
||||
char16_t tmpName[sizeof(pkg->name)/sizeof(pkg->name[0])];
|
||||
strcpy16_dtoh(tmpName, pkg->name, sizeof(pkg->name)/sizeof(pkg->name[0]));
|
||||
group = new PackageGroup(this, String16(tmpName), id);
|
||||
if (group == NULL) {
|
||||
delete package;
|
||||
@@ -6036,7 +6036,10 @@ status_t ResTable::createIdmap(const ResTable& overlay,
|
||||
*outSize += 2 * sizeof(uint16_t);
|
||||
|
||||
// overlay packages are assumed to contain only one package group
|
||||
const String16 overlayPackage(overlay.mPackageGroups[0]->packages[0]->package->name);
|
||||
const ResTable_package* overlayPackageStruct = overlay.mPackageGroups[0]->packages[0]->package;
|
||||
char16_t tmpName[sizeof(overlayPackageStruct->name)/sizeof(overlayPackageStruct->name[0])];
|
||||
strcpy16_dtoh(tmpName, overlayPackageStruct->name, sizeof(overlayPackageStruct->name)/sizeof(overlayPackageStruct->name[0]));
|
||||
const String16 overlayPackage(tmpName);
|
||||
|
||||
for (size_t typeIndex = 0; typeIndex < pg->types.size(); ++typeIndex) {
|
||||
const TypeList& typeList = pg->types[typeIndex];
|
||||
@@ -6345,8 +6348,10 @@ void ResTable::print(bool inclValues) const
|
||||
// Use a package's real ID, since the ID may have been assigned
|
||||
// if this package is a shared library.
|
||||
packageId = pkg->package->id;
|
||||
char16_t tmpName[sizeof(pkg->package->name)/sizeof(pkg->package->name[0])];
|
||||
strcpy16_dtoh(tmpName, pkg->package->name, sizeof(pkg->package->name)/sizeof(pkg->package->name[0]));
|
||||
printf(" Package %d id=0x%02x name=%s\n", (int)pkgIndex,
|
||||
pkg->package->id, String8(String16(pkg->package->name)).string());
|
||||
pkg->package->id, String8(tmpName).string());
|
||||
}
|
||||
|
||||
for (size_t typeIndex=0; typeIndex < pg->types.size(); typeIndex++) {
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
#include <androidfw/misc.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <cstring>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <cstdio>
|
||||
|
||||
using namespace android;
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@ testFiles := \
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := libandroidfw_tests
|
||||
|
||||
LOCAL_SRC_FILES := $(testFiles)
|
||||
LOCAL_STATIC_LIBRARIES := \
|
||||
libandroidfw \
|
||||
@@ -55,11 +54,9 @@ ifneq ($(SDK_ONLY),true)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := libandroidfw_tests
|
||||
|
||||
LOCAL_SRC_FILES := $(testFiles) \
|
||||
BackupData_test.cpp \
|
||||
ObbFile_test.cpp
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libandroidfw \
|
||||
libcutils \
|
||||
|
||||
@@ -41,7 +41,7 @@ static String8 getStringAttributeAtIndex(const ResXMLTree& tree, ssize_t attrInd
|
||||
}
|
||||
|
||||
size_t len;
|
||||
const uint16_t* str = tree.getAttributeStringValue(attrIndex, &len);
|
||||
const char16_t* str = tree.getAttributeStringValue(attrIndex, &len);
|
||||
return str ? String8(str, len) : String8();
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ String8 getResolvedAttribute(const ResTable& resTable, const ResXMLTree& tree,
|
||||
if (tree.getAttributeValue(idx, &value) != NO_ERROR) {
|
||||
if (value.dataType == Res_value::TYPE_STRING) {
|
||||
size_t len;
|
||||
const uint16_t* str = tree.getAttributeStringValue(idx, &len);
|
||||
const char16_t* str = tree.getAttributeStringValue(idx, &len);
|
||||
return str ? String8(str, len) : String8();
|
||||
}
|
||||
resTable.resolveReference(&value, 0);
|
||||
|
||||
@@ -33,19 +33,20 @@ aaptSources := \
|
||||
Command.cpp \
|
||||
CrunchCache.cpp \
|
||||
FileFinder.cpp \
|
||||
Images.cpp \
|
||||
Package.cpp \
|
||||
StringPool.cpp \
|
||||
XMLNode.cpp \
|
||||
pseudolocalize.cpp \
|
||||
qsort_r_compat.c \
|
||||
Resource.cpp \
|
||||
ResourceFilter.cpp \
|
||||
ResourceIdCache.cpp \
|
||||
ResourceTable.cpp \
|
||||
Images.cpp \
|
||||
Resource.cpp \
|
||||
pseudolocalize.cpp \
|
||||
SourcePos.cpp \
|
||||
StringPool.cpp \
|
||||
WorkQueue.cpp \
|
||||
XMLNode.cpp \
|
||||
ZipEntry.cpp \
|
||||
ZipFile.cpp \
|
||||
ZipFile.cpp
|
||||
|
||||
aaptTests := \
|
||||
tests/AaptConfig_test.cpp \
|
||||
@@ -88,16 +89,13 @@ endif
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := libaapt
|
||||
|
||||
LOCAL_SRC_FILES := $(aaptSources)
|
||||
LOCAL_C_INCLUDES += $(aaptCIncludes)
|
||||
|
||||
LOCAL_CFLAGS += -Wno-format-y2k
|
||||
LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
|
||||
LOCAL_CFLAGS += $(aaptCFlags)
|
||||
LOCAL_CFLAGS += -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags)
|
||||
LOCAL_CPPFLAGS += $(aaptCppFlags)
|
||||
ifeq (darwin,$(HOST_OS))
|
||||
LOCAL_CFLAGS += -D_DARWIN_UNLIMITED_STREAMS
|
||||
endif
|
||||
LOCAL_C_INCLUDES += $(aaptCIncludes)
|
||||
LOCAL_SRC_FILES := $(aaptSources)
|
||||
|
||||
include $(BUILD_HOST_STATIC_LIBRARY)
|
||||
|
||||
@@ -108,15 +106,11 @@ include $(BUILD_HOST_STATIC_LIBRARY)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := aapt
|
||||
|
||||
LOCAL_SRC_FILES := $(aaptMain)
|
||||
|
||||
LOCAL_STATIC_LIBRARIES += \
|
||||
libaapt \
|
||||
$(aaptHostStaticLibs)
|
||||
|
||||
LOCAL_LDLIBS += $(aaptHostLdLibs)
|
||||
LOCAL_CFLAGS += $(aaptCFlags)
|
||||
LOCAL_CPPFLAGS += $(aaptCppFlags)
|
||||
LOCAL_LDLIBS += $(aaptHostLdLibs)
|
||||
LOCAL_SRC_FILES := $(aaptMain)
|
||||
LOCAL_STATIC_LIBRARIES += libaapt $(aaptHostStaticLibs)
|
||||
|
||||
include $(BUILD_HOST_EXECUTABLE)
|
||||
|
||||
@@ -128,16 +122,12 @@ include $(CLEAR_VARS)
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
||||
|
||||
LOCAL_MODULE := libaapt_tests
|
||||
|
||||
LOCAL_CFLAGS += $(aaptCFlags)
|
||||
LOCAL_CPPFLAGS += $(aaptCppFlags)
|
||||
LOCAL_LDLIBS += $(aaptHostLdLibs)
|
||||
LOCAL_SRC_FILES += $(aaptTests)
|
||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)
|
||||
|
||||
LOCAL_STATIC_LIBRARIES += \
|
||||
libaapt \
|
||||
$(aaptHostStaticLibs)
|
||||
|
||||
LOCAL_LDLIBS += $(aaptHostLdLibs)
|
||||
LOCAL_CFLAGS += $(aaptCFlags)
|
||||
LOCAL_STATIC_LIBRARIES += libaapt $(aaptHostStaticLibs)
|
||||
|
||||
include $(BUILD_HOST_NATIVE_TEST)
|
||||
|
||||
@@ -149,11 +139,9 @@ ifneq ($(SDK_ONLY),true)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := aapt
|
||||
|
||||
LOCAL_CFLAGS += $(aaptCFlags)
|
||||
LOCAL_SRC_FILES := $(aaptSources) $(aaptMain)
|
||||
LOCAL_C_INCLUDES += \
|
||||
$(aaptCIncludes) \
|
||||
|
||||
LOCAL_C_INCLUDES += $(aaptCIncludes)
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libandroidfw \
|
||||
libutils \
|
||||
@@ -161,13 +149,9 @@ LOCAL_SHARED_LIBRARIES := \
|
||||
libpng \
|
||||
liblog \
|
||||
libz
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := \
|
||||
libexpat_static
|
||||
|
||||
LOCAL_CFLAGS += $(aaptCFlags)
|
||||
LOCAL_CPPFLAGS += -Wno-non-virtual-dtor
|
||||
|
||||
include external/stlport/libstlport.mk
|
||||
include $(BUILD_EXECUTABLE)
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ using namespace android;
|
||||
*/
|
||||
class CacheUpdater {
|
||||
public:
|
||||
virtual ~CacheUpdater() {}
|
||||
|
||||
// Make sure all the directories along this path exist
|
||||
virtual void ensureDirectoriesExist(String8 path) = 0;
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
#include <utils/List.h>
|
||||
#include <utils/Errors.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <cstdlib>
|
||||
#include <getopt.h>
|
||||
#include <assert.h>
|
||||
#include <cassert>
|
||||
|
||||
using namespace android;
|
||||
|
||||
|
||||
@@ -523,7 +523,7 @@ static int validateAttr(const String8& path, const ResTable& table,
|
||||
}
|
||||
if (validChars) {
|
||||
for (size_t i=0; i<len; i++) {
|
||||
uint16_t c = str[i];
|
||||
char16_t c = str[i];
|
||||
const char* p = validChars;
|
||||
bool okay = false;
|
||||
while (*p) {
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
// Set to true for noisy debug output.
|
||||
static const bool kIsDebug = false;
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
void strcpy16_htod(char16_t* dst, const char16_t* src)
|
||||
{
|
||||
while (*src) {
|
||||
@@ -35,6 +36,17 @@ void strcpy16_htod(char16_t* dst, const char16_t* src)
|
||||
}
|
||||
*dst = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void strcpy16_htod(uint16_t* dst, const char16_t* src)
|
||||
{
|
||||
while (*src) {
|
||||
uint16_t s = htods(static_cast<uint16_t>(*src));
|
||||
*dst++ = s;
|
||||
src++;
|
||||
}
|
||||
*dst = 0;
|
||||
}
|
||||
|
||||
void printStringPool(const ResStringPool* pool)
|
||||
{
|
||||
@@ -434,7 +446,7 @@ status_t StringPool::writeStringBlock(const sp<AaptFile>& pool)
|
||||
return NO_MEMORY;
|
||||
}
|
||||
|
||||
const size_t charSize = mUTF8 ? sizeof(uint8_t) : sizeof(char16_t);
|
||||
const size_t charSize = mUTF8 ? sizeof(uint8_t) : sizeof(uint16_t);
|
||||
|
||||
size_t strPos = 0;
|
||||
for (i=0; i<STRINGS; i++) {
|
||||
|
||||
@@ -26,7 +26,10 @@ using namespace android;
|
||||
|
||||
#define PRINT_STRING_METRICS 0
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
void strcpy16_htod(char16_t* dst, const char16_t* src);
|
||||
#endif
|
||||
void strcpy16_htod(uint16_t* dst, const char16_t* src);
|
||||
|
||||
void printStringPool(const ResStringPool* pool);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user