summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/aapt/Android.mk51
-rw-r--r--tools/aapt/Command.cpp40
-rw-r--r--tools/aapt/Main.cpp6
-rw-r--r--tools/aapt/ResourceTable.cpp4
-rw-r--r--tools/aapt/ResourceTable.h10
-rw-r--r--tools/aapt/SourcePos.cpp17
-rw-r--r--tools/aapt/XMLNode.cpp9
7 files changed, 132 insertions, 5 deletions
diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk
index fdc859c..a8a9c1c 100644
--- a/tools/aapt/Android.mk
+++ b/tools/aapt/Android.mk
@@ -5,9 +5,8 @@
#
LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := \
+commonSources:= \
AaptAssets.cpp \
Command.cpp \
Main.cpp \
@@ -17,8 +16,18 @@ LOCAL_SRC_FILES := \
ResourceTable.cpp \
Images.cpp \
Resource.cpp \
- SourcePos.cpp
+ SourcePos.cpp
+
+
+# For the host
+# =====================================================
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(commonSources)
+
+LOCAL_CFLAGS += -DHOST_LIB=1
+LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
LOCAL_CFLAGS += -Wno-format-y2k
LOCAL_C_INCLUDES += external/expat/lib
@@ -50,3 +59,39 @@ LOCAL_MODULE := aapt
include $(BUILD_HOST_EXECUTABLE)
+
+# For the device
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= $(commonSources)
+
+ifeq ($(TARGET_OS),linux)
+# Use the futex based mutex and condition variable
+# implementation from android-arm because it's shared mem safe
+LOCAL_LDLIBS += -lrt -ldl
+endif
+
+LOCAL_C_INCLUDES += external/expat/lib
+LOCAL_C_INCLUDES += external/libpng
+LOCAL_C_INCLUDES += external/zlib
+LOCAL_C_INCLUDES += external/icu4c/common
+
+LOCAL_SHARED_LIBRARIES := \
+ libz \
+ libutils \
+ libcutils \
+ libexpat \
+ libsgl
+
+ifneq ($(TARGET_SIMULATOR),true)
+ifeq ($(TARGET_OS)-$(TARGET_ARCH),linux-x86)
+# This is needed on x86 to bring in dl_iterate_phdr for CallStack.cpp
+LOCAL_SHARED_LIBRARIES += \
+ libdl
+endif # linux-x86
+endif # sim
+
+LOCAL_MODULE := aapt
+
+include $(BUILD_EXECUTABLE)
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index 6f3461d..39acc42 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -21,9 +21,11 @@ using namespace android;
*/
int doVersion(Bundle* bundle)
{
+#ifdef HOST_LIB
if (bundle->getFileSpecCount() != 0)
printf("(ignoring extra arguments)\n");
printf("Android Asset Packaging Tool, v0.2\n");
+#endif // HOST_LIB
return 0;
}
@@ -42,13 +44,15 @@ ZipFile* openReadOnly(const char* fileName)
zip = new ZipFile;
result = zip->open(fileName, ZipFile::kOpenReadOnly);
if (result != NO_ERROR) {
- if (result == NAME_NOT_FOUND)
+#ifdef HOST_LIB
+ if (result == NAME_NOT_FOUND)
fprintf(stderr, "ERROR: '%s' not found\n", fileName);
else if (result == PERMISSION_DENIED)
fprintf(stderr, "ERROR: '%s' access denied\n", fileName);
else
fprintf(stderr, "ERROR: failed opening '%s' as Zip file\n",
fileName);
+#endif // HOST_LIB
delete zip;
return NULL;
}
@@ -119,6 +123,7 @@ int calcPercent(long uncompressedLen, long compressedLen)
int doList(Bundle* bundle)
{
int result = 1;
+#ifdef HOST_LIB
ZipFile* zip = NULL;
const ZipEntry* entry;
long totalUncLen, totalCompLen;
@@ -217,6 +222,7 @@ int doList(Bundle* bundle)
bail:
delete zip;
+#endif // HOST_LIB
return result;
}
@@ -341,6 +347,7 @@ const char *getComponentName(String8 &pkgName, String8 &componentName) {
int doDump(Bundle* bundle)
{
status_t result = UNKNOWN_ERROR;
+#ifdef HOST_LIB
Asset* asset = NULL;
if (bundle->getFileSpecCount() < 1) {
@@ -690,6 +697,7 @@ bail:
if (asset) {
delete asset;
}
+#endif // HOST_LIB
return (result != NO_ERROR);
}
@@ -706,24 +714,32 @@ int doAdd(Bundle* bundle)
if (bundle->getUpdate()) {
/* avoid confusion */
+#ifdef HOST_LIB
fprintf(stderr, "ERROR: can't use '-u' with add\n");
+#endif // HOST_LIB
goto bail;
}
if (bundle->getFileSpecCount() < 1) {
+#ifdef HOST_LIB
fprintf(stderr, "ERROR: must specify zip file name\n");
+#endif // HOST_LIB
goto bail;
}
zipFileName = bundle->getFileSpecEntry(0);
if (bundle->getFileSpecCount() < 2) {
+#ifdef HOST_LIB
fprintf(stderr, "NOTE: nothing to do\n");
+#endif // HOST_LIB
goto bail;
}
zip = openReadWrite(zipFileName, true);
if (zip == NULL) {
+#ifdef HOST_LIB
fprintf(stderr, "ERROR: failed opening/creating '%s' as Zip file\n", zipFileName);
+#endif // HOST_LIB
goto bail;
}
@@ -731,13 +747,18 @@ int doAdd(Bundle* bundle)
const char* fileName = bundle->getFileSpecEntry(i);
if (strcasecmp(String8(fileName).getPathExtension().string(), ".gz") == 0) {
+#ifdef HOST_LIB
printf(" '%s'... (from gzip)\n", fileName);
+#endif // HOST_LIB
result = zip->addGzip(fileName, String8(fileName).getBasePath().string(), NULL);
} else {
+#ifdef HOST_LIB
printf(" '%s'...\n", fileName);
+#endif // HOST_LIB
result = zip->add(fileName, bundle->getCompressionMethod(), NULL);
}
if (result != NO_ERROR) {
+#ifdef HOST_LIB
fprintf(stderr, "Unable to add '%s' to '%s'", bundle->getFileSpecEntry(i), zipFileName);
if (result == NAME_NOT_FOUND)
fprintf(stderr, ": file not found\n");
@@ -745,6 +766,7 @@ int doAdd(Bundle* bundle)
fprintf(stderr, ": already exists in archive\n");
else
fprintf(stderr, "\n");
+#endif // HOST_LIB
goto bail;
}
}
@@ -767,20 +789,26 @@ int doRemove(Bundle* bundle)
const char* zipFileName;
if (bundle->getFileSpecCount() < 1) {
+#ifdef HOST_LIB
fprintf(stderr, "ERROR: must specify zip file name\n");
+#endif // HOST_LIB
goto bail;
}
zipFileName = bundle->getFileSpecEntry(0);
if (bundle->getFileSpecCount() < 2) {
+#ifdef HOST_LIB
fprintf(stderr, "NOTE: nothing to do\n");
+#endif // HOST_LIB
goto bail;
}
zip = openReadWrite(zipFileName, false);
if (zip == NULL) {
+#ifdef HOST_LIB
fprintf(stderr, "ERROR: failed opening Zip archive '%s'\n",
zipFileName);
+#endif // HOST_LIB
goto bail;
}
@@ -790,15 +818,19 @@ int doRemove(Bundle* bundle)
entry = zip->getEntryByName(fileName);
if (entry == NULL) {
+#ifdef HOST_LIB
printf(" '%s' NOT FOUND\n", fileName);
+#endif // HOST_LIB
continue;
}
result = zip->remove(entry);
if (result != NO_ERROR) {
+#ifdef HOST_LIB
fprintf(stderr, "Unable to delete '%s' from '%s'\n",
bundle->getFileSpecEntry(i), zipFileName);
+#endif // HOST_LIB
goto bail;
}
}
@@ -836,7 +868,9 @@ int doPackage(Bundle* bundle)
N = bundle->getFileSpecCount();
if (N < 1 && bundle->getResourceSourceDirs().size() == 0 && bundle->getJarFiles().size() == 0
&& bundle->getAndroidManifestFile() == NULL && bundle->getAssetSourceDir() == NULL) {
+#ifdef HOST_LIB
fprintf(stderr, "ERROR: no input files\n");
+#endif // HOST_LIB
goto bail;
}
@@ -847,9 +881,11 @@ int doPackage(Bundle* bundle)
FileType type;
type = getFileType(outputAPKFile);
if (type != kFileTypeNonexistent && type != kFileTypeRegular) {
+#ifdef HOST_LIB
fprintf(stderr,
"ERROR: output file '%s' exists but is not regular file\n",
outputAPKFile);
+#endif // HOST_LIB
goto bail;
}
}
@@ -900,7 +936,9 @@ int doPackage(Bundle* bundle)
if (outputAPKFile) {
err = writeAPK(bundle, assets, String8(outputAPKFile));
if (err != NO_ERROR) {
+#ifdef HOST_LIB
fprintf(stderr, "ERROR: packaging of '%s' failed\n", outputAPKFile);
+#endif // HOST_LIB
goto bail;
}
}
diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp
index 71b1a3c..552ff24 100644
--- a/tools/aapt/Main.cpp
+++ b/tools/aapt/Main.cpp
@@ -129,9 +129,11 @@ int handleCommand(Bundle* bundle)
// printf(" %d: '%s'\n", i, bundle->getFileSpecEntry(i));
switch (bundle->getCommand()) {
+#ifdef HOST_LIB
case kCommandVersion: return doVersion(bundle);
case kCommandList: return doList(bundle);
case kCommandDump: return doDump(bundle);
+#endif // HOST_LIB
case kCommandAdd: return doAdd(bundle);
case kCommandRemove: return doRemove(bundle);
case kCommandPackage: return doPackage(bundle);
@@ -364,6 +366,8 @@ bail:
result = 2;
}
- //printf("--> returning %d\n", result);
+#ifndef HOST_LIB
+ printf("--> returning %d\n", result);
+#endif
return result;
}
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index a09b1a6..943bbeb 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -2117,7 +2117,9 @@ status_t ResourceTable::addSymbols(const sp<AaptSymbols>& outSymbols) {
void
ResourceTable::addLocalization(const String16& name, const String8& locale)
{
+#ifdef HOST_LIB
mLocalizations[name].insert(locale);
+#endif // HOST_LIB
}
@@ -2136,6 +2138,7 @@ ResourceTable::validateLocalizations(void)
status_t err = NO_ERROR;
const String8 defaultLocale;
+#ifdef HOST_LIB
// For all strings...
for (map<String16, set<String8> >::iterator nameIter = mLocalizations.begin();
nameIter != mLocalizations.end();
@@ -2195,6 +2198,7 @@ ResourceTable::validateLocalizations(void)
} while (comma != NULL);
}
}
+#endif // HOST_LIB
return err;
}
diff --git a/tools/aapt/ResourceTable.h b/tools/aapt/ResourceTable.h
index 74ba326..cacc980 100644
--- a/tools/aapt/ResourceTable.h
+++ b/tools/aapt/ResourceTable.h
@@ -4,14 +4,22 @@
// Build resource files from raw assets.
//
+// WARNING: Since arm compiler runtime does not include STL, we can't include <map> and <set> types.
+// Unless we want to provide our own implementation of these (which should not be too difficult,
+// since what we need is a simple hash table which keys are unicode strings and values are sets
+// of ASCII chars). On the other hand, since maps/sets are used only to validate localized strings,
+// I decided to disable this feature when code is executed on a device.
+
#ifndef RESOURCE_TABLE_H
#define RESOURCE_TABLE_H
#include "StringPool.h"
#include "SourcePos.h"
+#ifdef HOST_LIB
#include <set>
#include <map>
+#endif //HOST_LIB
using namespace std;
@@ -514,8 +522,10 @@ private:
SourcePos mCurrentXmlPos;
Bundle* mBundle;
+#ifdef HOST_LIB
// key = string resource name, value = set of locales in which that name is defined
map<String16, set<String8> > mLocalizations;
+#endif //HOST_LIB
};
class ResourceFilter
diff --git a/tools/aapt/SourcePos.cpp b/tools/aapt/SourcePos.cpp
index 2761d18..e69b126 100644
--- a/tools/aapt/SourcePos.cpp
+++ b/tools/aapt/SourcePos.cpp
@@ -1,7 +1,12 @@
+// WARNING! Since arm compiler does not have STL library,
+// error reporting is disabled. We need to figure out how do we report errors.
+
#include "SourcePos.h"
#include <stdarg.h>
+#ifdef HOST_LIB
#include <vector>
+#endif //HOST_LIB
using namespace std;
@@ -26,7 +31,9 @@ struct ErrorPos
void print(FILE* to) const;
};
+#ifdef HOST_LIB
static vector<ErrorPos> g_errors;
+#endif //HOST_LIB
ErrorPos::ErrorPos()
:line(-1), fatal(false)
@@ -86,6 +93,7 @@ ErrorPos::operator=(const ErrorPos& rhs)
void
ErrorPos::print(FILE* to) const
{
+#ifdef HOST_LIB
const char* type = fatal ? "ERROR" : "WARNING";
if (this->line >= 0) {
@@ -93,6 +101,7 @@ ErrorPos::print(FILE* to) const
} else {
fprintf(to, "%s: %s %s\n", this->file.string(), type, this->error.string());
}
+#endif // HOST_LIB
}
// SourcePos
@@ -120,6 +129,7 @@ int
SourcePos::error(const char* fmt, ...) const
{
int retval=0;
+#ifdef HOST_LIB
char buf[1024];
va_list ap;
va_start(ap, fmt);
@@ -131,6 +141,7 @@ SourcePos::error(const char* fmt, ...) const
p--;
}
g_errors.push_back(ErrorPos(this->file, this->line, String8(buf), true));
+#endif // HOST_LIB
return retval;
}
@@ -155,16 +166,22 @@ SourcePos::warning(const char* fmt, ...) const
bool
SourcePos::hasErrors()
{
+#ifdef HOST_LIB
return g_errors.size() > 0;
+#else
+ return false;
+#endif // HOST_LIB
}
void
SourcePos::printErrors(FILE* to)
{
+#ifdef HOST_LIB
vector<ErrorPos>::const_iterator it;
for (it=g_errors.begin(); it!=g_errors.end(); it++) {
it->print(to);
}
+#endif // HOST_LIB
}
diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp
index d476567..c1c99f5 100644
--- a/tools/aapt/XMLNode.cpp
+++ b/tools/aapt/XMLNode.cpp
@@ -4,10 +4,15 @@
// Build resource files from raw assets.
//
+// WARNING! I disabled pseudolocalizing if we run on device,
+// since it does not seem important.
+
#include "XMLNode.h"
#include "ResourceTable.h"
+#ifdef HOST_LIB
#include <host/pseudolocalize.h>
+#endif //HOST_LIB
#include <utils/ByteOrder.h>
#include <errno.h>
#include <string.h>
@@ -96,13 +101,17 @@ status_t parseStyledString(Bundle* bundle,
pseudolocalize = false;
}
}
+#ifdef HOST_LIB
if (xliffDepth == 0 && pseudolocalize) {
std::string orig(String8(text).string());
std::string pseudo = pseudolocalize_string(orig);
curString.append(String16(String8(pseudo.c_str())));
} else {
+#endif //HOST_LIB
curString.append(text);
+#ifdef HOST_LIB
}
+#endif //HOST_LIB
} else if (code == ResXMLTree::START_TAG) {
const String16 element16(inXml->getElementName(&len));
const String8 element8(element16);