AAPT: Improve debuggability of aapt dump badging errors
AAPT dump badging errors have been cryptic and difficult
to debug for app developers. Added some line info to the
error statements.
Change-Id: Ieeeb903a1274a91b77329b445e0248b1e67c9568
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index 447ace6..288b2a3 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -750,7 +750,7 @@
}
// 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.
@@ -850,14 +850,16 @@
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);
@@ -867,12 +869,14 @@
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",
@@ -881,12 +885,14 @@
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,
@@ -896,13 +902,14 @@
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(
@@ -1163,14 +1170,16 @@
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);
@@ -1179,7 +1188,8 @@
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;
}
@@ -1191,7 +1201,8 @@
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;
}
@@ -1212,7 +1223,8 @@
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;
}
@@ -1278,14 +1290,15 @@
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;
}
@@ -1293,8 +1306,8 @@
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' ",
@@ -1312,8 +1325,8 @@
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) {
@@ -1323,7 +1336,8 @@
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;
}
@@ -1352,8 +1366,8 @@
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;
}
@@ -1374,8 +1388,8 @@
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;
}
@@ -1440,8 +1454,8 @@
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);
@@ -1486,13 +1500,14 @@
} 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;
}
@@ -1521,14 +1536,14 @@
} 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;
}
@@ -1543,9 +1558,9 @@
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);
@@ -1553,9 +1568,9 @@
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);
@@ -1563,15 +1578,15 @@
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--;
@@ -1608,7 +1623,8 @@
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;
}
@@ -1616,7 +1632,8 @@
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;
}
@@ -1624,7 +1641,8 @@
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;
}
@@ -1632,7 +1650,8 @@
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;
}
@@ -1659,9 +1678,9 @@
} 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,
@@ -1674,9 +1693,9 @@
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;
}
@@ -1687,9 +1706,9 @@
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") {
@@ -1697,8 +1716,9 @@
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;
}
@@ -1723,8 +1743,9 @@
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;
@@ -1732,26 +1753,27 @@
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;
}
@@ -1762,8 +1784,9 @@
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' ",
@@ -1776,9 +1799,10 @@
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;
}
}
@@ -1788,7 +1812,8 @@
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;
}
@@ -1847,8 +1872,9 @@
} 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;
}
@@ -1863,8 +1889,9 @@
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;
}
@@ -1872,7 +1899,8 @@
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;
}
@@ -1893,8 +1921,8 @@
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;
}
@@ -1949,8 +1977,8 @@
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) {
@@ -2261,6 +2289,10 @@
result = NO_ERROR;
bail:
+ if (SourcePos::hasErrors()) {
+ SourcePos::printErrors(stderr);
+ }
+
if (asset) {
delete asset;
}