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 1dd43f79471d..fb1370ef8bb5 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.
@@ -775,7 +775,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.
@@ -875,14 +875,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);
@@ -892,12 +894,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",
@@ -906,12 +910,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,
@@ -921,13 +927,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(
@@ -1188,14 +1195,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);
@@ -1204,7 +1213,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;
}
@@ -1216,7 +1226,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;
}
@@ -1237,7 +1248,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;
}
@@ -1303,14 +1315,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;
}
@@ -1318,8 +1331,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' ",
@@ -1337,8 +1350,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) {
@@ -1348,7 +1361,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;
}
@@ -1377,8 +1391,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;
}
@@ -1399,8 +1413,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;
}
@@ -1465,8 +1479,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);
@@ -1511,13 +1525,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;
}
@@ -1546,14 +1561,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;
}
@@ -1568,9 +1583,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);
@@ -1578,9 +1593,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);
@@ -1588,15 +1603,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--;
@@ -1633,7 +1648,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;
}
@@ -1641,7 +1657,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;
}
@@ -1649,7 +1666,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;
}
@@ -1657,7 +1675,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;
}
@@ -1684,9 +1703,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,
@@ -1699,9 +1718,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;
}
@@ -1712,9 +1731,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") {
@@ -1722,8 +1741,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;
}
@@ -1748,8 +1768,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;
@@ -1757,26 +1778,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;
}
@@ -1787,8 +1809,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' ",
@@ -1801,9 +1824,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;
}
}
@@ -1813,7 +1837,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;
}
@@ -1872,8 +1897,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;
}
@@ -1888,8 +1914,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;
}
@@ -1897,7 +1924,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;
}
@@ -1918,8 +1946,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;
}
@@ -1974,8 +2002,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) {
@@ -2290,6 +2318,10 @@ int doDump(Bundle* bundle)
result = NO_ERROR;
bail:
+ if (SourcePos::hasErrors()) {
+ SourcePos::printErrors(stderr);
+ }
+
if (asset) {
delete asset;
}