summaryrefslogtreecommitdiff
path: root/tools/aapt/Command.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aapt/Command.cpp')
-rw-r--r--tools/aapt/Command.cpp196
1 files changed, 114 insertions, 82 deletions
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index 59da467a1cc3..cbad4b9b48a9 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -494,7 +494,7 @@ struct ImpliedFeature {
struct Feature {
Feature() : required(false), version(-1) {}
- Feature(bool required, int32_t version = -1) : required(required), version(version) {}
+ explicit Feature(bool required, int32_t version = -1) : required(required), version(version) {}
/**
* Whether the feature is required.
@@ -767,7 +767,7 @@ int doDump(Bundle* bundle)
}
// Source for AndroidManifest.xml
- const String8 manifestFile = String8::format("%s@AndroidManifest.xml", filename);
+ const String8 manifestFile("AndroidManifest.xml");
// The dynamicRefTable can be null if there are no resources for this asset cookie.
// This fine.
@@ -867,14 +867,16 @@ int doDump(Bundle* bundle)
depth++;
const char16_t* ctag16 = tree.getElementName(&len);
if (ctag16 == NULL) {
- fprintf(stderr, "ERROR: failed to get XML element name (bad string pool)\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: failed to get XML element name (bad string pool)");
goto bail;
}
String8 tag(ctag16);
//printf("Depth %d tag %s\n", depth, tag.string());
if (depth == 1) {
if (tag != "manifest") {
- fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: manifest does not start with <manifest> tag");
goto bail;
}
String8 pkg = AaptXml::getAttribute(tree, NULL, "package", NULL);
@@ -884,12 +886,14 @@ int doDump(Bundle* bundle)
String8 error;
String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR: %s\n", error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name': %s", error.string());
goto bail;
}
if (name == "") {
- fprintf(stderr, "ERROR: missing 'android:name' for permission\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: missing 'android:name' for permission");
goto bail;
}
printf("permission: %s\n",
@@ -898,12 +902,14 @@ int doDump(Bundle* bundle)
String8 error;
String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR: %s\n", error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s", error.string());
goto bail;
}
if (name == "") {
- fprintf(stderr, "ERROR: missing 'android:name' for uses-permission\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: missing 'android:name' for uses-permission");
goto bail;
}
printUsesPermission(name,
@@ -913,13 +919,14 @@ int doDump(Bundle* bundle)
String8 error;
String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR: %s\n", error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s", error.string());
goto bail;
}
if (name == "") {
- fprintf(stderr, "ERROR: missing 'android:name' for "
- "uses-permission-sdk-23\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: missing 'android:name' for uses-permission-sdk-23");
goto bail;
}
printUsesPermissionSdk23(
@@ -1180,14 +1187,16 @@ int doDump(Bundle* bundle)
const char16_t* ctag16 = tree.getElementName(&len);
if (ctag16 == NULL) {
- fprintf(stderr, "ERROR: failed to get XML element name (bad string pool)\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: failed to get XML element name (bad string pool)");
goto bail;
}
String8 tag(ctag16);
//printf("Depth %d, %s\n", depth, tag.string());
if (depth == 1) {
if (tag != "manifest") {
- fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: manifest does not start with <manifest> tag");
goto bail;
}
pkg = AaptXml::getAttribute(tree, NULL, "package", NULL);
@@ -1196,7 +1205,8 @@ int doDump(Bundle* bundle)
int32_t versionCode = AaptXml::getIntegerAttribute(tree, VERSION_CODE_ATTR,
&error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:versionCode' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:versionCode' attribute: %s",
error.string());
goto bail;
}
@@ -1208,7 +1218,8 @@ int doDump(Bundle* bundle)
String8 versionName = AaptXml::getResolvedAttribute(res, tree,
VERSION_NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:versionName' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:versionName' attribute: %s",
error.string());
goto bail;
}
@@ -1229,7 +1240,8 @@ int doDump(Bundle* bundle)
int32_t installLocation = AaptXml::getResolvedIntegerAttribute(res, tree,
INSTALL_LOCATION_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:installLocation' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:installLocation' attribute: %s",
error.string());
goto bail;
}
@@ -1295,14 +1307,15 @@ int doDump(Bundle* bundle)
String8 icon = AaptXml::getResolvedAttribute(res, tree, ICON_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n",
- error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:icon' attribute: %s", error.string());
goto bail;
}
int32_t testOnly = AaptXml::getIntegerAttribute(tree, TEST_ONLY_ATTR, 0,
&error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:testOnly' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:testOnly' attribute: %s",
error.string());
goto bail;
}
@@ -1310,8 +1323,8 @@ int doDump(Bundle* bundle)
String8 banner = AaptXml::getResolvedAttribute(res, tree, BANNER_ATTR,
&error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:banner' attribute: %s\n",
- error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:banner' attribute: %s", error.string());
goto bail;
}
printf("application: label='%s' ",
@@ -1329,8 +1342,8 @@ int doDump(Bundle* bundle)
int32_t isGame = AaptXml::getResolvedIntegerAttribute(res, tree,
ISGAME_ATTR, 0, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:isGame' attribute: %s\n",
- error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:isGame' attribute: %s", error.string());
goto bail;
}
if (isGame != 0) {
@@ -1340,7 +1353,8 @@ int doDump(Bundle* bundle)
int32_t debuggable = AaptXml::getResolvedIntegerAttribute(res, tree,
DEBUGGABLE_ATTR, 0, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:debuggable' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:debuggable' attribute: %s",
error.string());
goto bail;
}
@@ -1369,8 +1383,8 @@ int doDump(Bundle* bundle)
String8 name = AaptXml::getResolvedAttribute(res, tree,
MIN_SDK_VERSION_ATTR, &error);
if (error != "") {
- fprintf(stderr,
- "ERROR getting 'android:minSdkVersion' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:minSdkVersion' attribute: %s",
error.string());
goto bail;
}
@@ -1391,8 +1405,8 @@ int doDump(Bundle* bundle)
String8 name = AaptXml::getResolvedAttribute(res, tree,
TARGET_SDK_VERSION_ATTR, &error);
if (error != "") {
- fprintf(stderr,
- "ERROR getting 'android:targetSdkVersion' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:targetSdkVersion' attribute: %s",
error.string());
goto bail;
}
@@ -1457,8 +1471,8 @@ int doDump(Bundle* bundle)
FeatureGroup group;
group.label = AaptXml::getResolvedAttribute(res, tree, LABEL_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:label' attribute:"
- " %s\n", error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:label' attribute: %s", error.string());
goto bail;
}
featureGroups.add(group);
@@ -1503,13 +1517,14 @@ int doDump(Bundle* bundle)
} else if (tag == "uses-permission") {
String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s", error.string());
goto bail;
}
if (name == "") {
- fprintf(stderr, "ERROR: missing 'android:name' for uses-permission\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: missing 'android:name' for uses-permission");
goto bail;
}
@@ -1538,14 +1553,14 @@ int doDump(Bundle* bundle)
} else if (tag == "uses-permission-sdk-23" || tag == "uses-permission-sdk-m") {
String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s", error.string());
goto bail;
}
if (name == "") {
- fprintf(stderr, "ERROR: missing 'android:name' for "
- "uses-permission-sdk-23\n");
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR: missing 'android:name' for uses-permission-sdk-23");
goto bail;
}
@@ -1560,9 +1575,9 @@ int doDump(Bundle* bundle)
printf("uses-package:'%s'\n",
ResTable::normalizeForOutput(name.string()).string());
} else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s", error.string());
+ goto bail;
}
} else if (tag == "original-package") {
String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
@@ -1570,9 +1585,9 @@ int doDump(Bundle* bundle)
printf("original-package:'%s'\n",
ResTable::normalizeForOutput(name.string()).string());
} else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s", error.string());
+ goto bail;
}
} else if (tag == "supports-gl-texture") {
String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
@@ -1580,15 +1595,15 @@ int doDump(Bundle* bundle)
printf("supports-gl-texture:'%s'\n",
ResTable::normalizeForOutput(name.string()).string());
} else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s", error.string());
+ goto bail;
}
} else if (tag == "compatible-screens") {
printCompatibleScreens(tree, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting compatible screens: %s\n",
- error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting compatible screens: %s", error.string());
goto bail;
}
depth--;
@@ -1625,7 +1640,8 @@ int doDump(Bundle* bundle)
withinActivity = true;
activityName = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s",
error.string());
goto bail;
}
@@ -1633,7 +1649,8 @@ int doDump(Bundle* bundle)
activityLabel = AaptXml::getResolvedAttribute(res, tree, LABEL_ATTR,
&error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:label' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:label' attribute: %s",
error.string());
goto bail;
}
@@ -1641,7 +1658,8 @@ int doDump(Bundle* bundle)
activityIcon = AaptXml::getResolvedAttribute(res, tree, ICON_ATTR,
&error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:icon' attribute: %s",
error.string());
goto bail;
}
@@ -1649,7 +1667,8 @@ int doDump(Bundle* bundle)
activityBanner = AaptXml::getResolvedAttribute(res, tree, BANNER_ATTR,
&error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:banner' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:banner' attribute: %s",
error.string());
goto bail;
}
@@ -1676,9 +1695,9 @@ int doDump(Bundle* bundle)
} else if (tag == "uses-library") {
String8 libraryName = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr,
+ SourcePos(manifestFile, tree.getLineNumber()).error(
"ERROR getting 'android:name' attribute for uses-library"
- " %s\n", error.string());
+ " %s", error.string());
goto bail;
}
int req = AaptXml::getIntegerAttribute(tree,
@@ -1691,9 +1710,9 @@ int doDump(Bundle* bundle)
receiverName = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr,
+ SourcePos(manifestFile, tree.getLineNumber()).error(
"ERROR getting 'android:name' attribute for receiver:"
- " %s\n", error.string());
+ " %s", error.string());
goto bail;
}
@@ -1704,9 +1723,9 @@ int doDump(Bundle* bundle)
hasBindDeviceAdminPermission = true;
}
} else {
- fprintf(stderr,
+ SourcePos(manifestFile, tree.getLineNumber()).error(
"ERROR getting 'android:permission' attribute for"
- " receiver '%s': %s\n",
+ " receiver '%s': %s",
receiverName.string(), error.string());
}
} else if (tag == "service") {
@@ -1714,8 +1733,9 @@ int doDump(Bundle* bundle)
serviceName = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute for "
- "service:%s\n", error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute for "
+ "service:%s", error.string());
goto bail;
}
@@ -1740,8 +1760,9 @@ int doDump(Bundle* bundle)
hasBindDreamServicePermission = true;
}
} else {
- fprintf(stderr, "ERROR getting 'android:permission' attribute for "
- "service '%s': %s\n", serviceName.string(), error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:permission' attribute for "
+ "service '%s': %s", serviceName.string(), error.string());
}
} else if (tag == "provider") {
withinProvider = true;
@@ -1749,26 +1770,27 @@ int doDump(Bundle* bundle)
bool exported = AaptXml::getResolvedIntegerAttribute(res, tree,
EXPORTED_ATTR, &error);
if (error != "") {
- fprintf(stderr,
+ SourcePos(manifestFile, tree.getLineNumber()).error(
"ERROR getting 'android:exported' attribute for provider:"
- " %s\n", error.string());
+ " %s", error.string());
goto bail;
}
bool grantUriPermissions = AaptXml::getResolvedIntegerAttribute(
res, tree, GRANT_URI_PERMISSIONS_ATTR, &error);
if (error != "") {
- fprintf(stderr,
+ SourcePos(manifestFile, tree.getLineNumber()).error(
"ERROR getting 'android:grantUriPermissions' attribute for "
- "provider: %s\n", error.string());
+ "provider: %s", error.string());
goto bail;
}
String8 permission = AaptXml::getResolvedAttribute(res, tree,
PERMISSION_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:permission' attribute for "
- "provider: %s\n", error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:permission' attribute for "
+ "provider: %s", error.string());
goto bail;
}
@@ -1779,8 +1801,9 @@ int doDump(Bundle* bundle)
String8 metaDataName = AaptXml::getResolvedAttribute(res, tree,
NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute for "
- "meta-data:%s\n", error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute for "
+ "meta-data: %s", error.string());
goto bail;
}
printf("meta-data: name='%s' ",
@@ -1793,9 +1816,10 @@ int doDump(Bundle* bundle)
printResolvedResourceAttribute(res, tree, RESOURCE_ATTR,
String8("resource"), &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:value' or "
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:value' or "
"'android:resource' attribute for "
- "meta-data:%s\n", error.string());
+ "meta-data: %s", error.string());
goto bail;
}
}
@@ -1805,7 +1829,8 @@ int doDump(Bundle* bundle)
if (name != "" && error == "") {
supportedInput.add(name);
} else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s",
error.string());
goto bail;
}
@@ -1864,8 +1889,9 @@ int doDump(Bundle* bundle)
} else if (withinService && tag == "meta-data") {
String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute for "
- "meta-data tag in service '%s': %s\n", serviceName.string(),
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute for "
+ "meta-data tag in service '%s': %s", serviceName.string(),
error.string());
goto bail;
}
@@ -1880,8 +1906,9 @@ int doDump(Bundle* bundle)
String8 xmlPath = AaptXml::getResolvedAttribute(res, tree,
RESOURCE_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:resource' attribute for "
- "meta-data tag in service '%s': %s\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:resource' attribute for "
+ "meta-data tag in service '%s': %s",
serviceName.string(), error.string());
goto bail;
}
@@ -1889,7 +1916,8 @@ int doDump(Bundle* bundle)
Vector<String8> categories = getNfcAidCategories(assets, xmlPath,
offHost, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting AID category for service '%s'\n",
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting AID category for service '%s'",
serviceName.string());
goto bail;
}
@@ -1910,8 +1938,8 @@ int doDump(Bundle* bundle)
if (tag == "action") {
action = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'android:name' attribute: %s", error.string());
goto bail;
}
@@ -1966,8 +1994,8 @@ int doDump(Bundle* bundle)
if (tag == "category") {
String8 category = AaptXml::getAttribute(tree, NAME_ATTR, &error);
if (error != "") {
- fprintf(stderr, "ERROR getting 'name' attribute: %s\n",
- error.string());
+ SourcePos(manifestFile, tree.getLineNumber()).error(
+ "ERROR getting 'name' attribute: %s", error.string());
goto bail;
}
if (withinActivity) {
@@ -2282,6 +2310,10 @@ int doDump(Bundle* bundle)
result = NO_ERROR;
bail:
+ if (SourcePos::hasErrors()) {
+ SourcePos::printErrors(stderr);
+ }
+
if (asset) {
delete asset;
}