| 197 | } |
| 198 | |
| 199 | static status_t parsePackage(Bundle* bundle, const sp<AaptAssets>& assets, |
| 200 | const sp<AaptGroup>& grp) |
| 201 | { |
| 202 | if (grp->getFiles().size() != 1) { |
| 203 | fprintf(stderr, "warning: Multiple AndroidManifest.xml files found, using %s\n", |
| 204 | grp->getFiles().valueAt(0)->getPrintableSource().string()); |
| 205 | } |
| 206 | |
| 207 | sp<AaptFile> file = grp->getFiles().valueAt(0); |
| 208 | |
| 209 | ResXMLTree block; |
| 210 | status_t err = parseXMLResource(file, &block); |
| 211 | if (err != NO_ERROR) { |
| 212 | return err; |
| 213 | } |
| 214 | //printXMLBlock(&block); |
| 215 | |
| 216 | ResXMLTree::event_code_t code; |
| 217 | while ((code=block.next()) != ResXMLTree::START_TAG |
| 218 | && code != ResXMLTree::END_DOCUMENT |
| 219 | && code != ResXMLTree::BAD_DOCUMENT) { |
| 220 | } |
| 221 | |
| 222 | size_t len; |
| 223 | if (code != ResXMLTree::START_TAG) { |
| 224 | fprintf(stderr, "%s:%d: No start tag found\n", |
| 225 | file->getPrintableSource().string(), block.getLineNumber()); |
| 226 | return UNKNOWN_ERROR; |
| 227 | } |
| 228 | if (strcmp16(block.getElementName(&len), String16("manifest").string()) != 0) { |
| 229 | fprintf(stderr, "%s:%d: Invalid start tag %s, expected <manifest>\n", |
| 230 | file->getPrintableSource().string(), block.getLineNumber(), |
| 231 | String8(block.getElementName(&len)).string()); |
| 232 | return UNKNOWN_ERROR; |
| 233 | } |
| 234 | |
| 235 | ssize_t nameIndex = block.indexOfAttribute(NULL, "package"); |
| 236 | if (nameIndex < 0) { |
| 237 | fprintf(stderr, "%s:%d: <manifest> does not have package attribute.\n", |
| 238 | file->getPrintableSource().string(), block.getLineNumber()); |
| 239 | return UNKNOWN_ERROR; |
| 240 | } |
| 241 | |
| 242 | assets->setPackage(String8(block.getAttributeStringValue(nameIndex, &len))); |
| 243 | |
| 244 | String16 uses_sdk16("uses-sdk"); |
| 245 | while ((code=block.next()) != ResXMLTree::END_DOCUMENT |
| 246 | && code != ResXMLTree::BAD_DOCUMENT) { |
| 247 | if (code == ResXMLTree::START_TAG) { |
| 248 | if (strcmp16(block.getElementName(&len), uses_sdk16.string()) == 0) { |
| 249 | ssize_t minSdkIndex = block.indexOfAttribute(RESOURCES_ANDROID_NAMESPACE, |
| 250 | "minSdkVersion"); |
| 251 | if (minSdkIndex >= 0) { |
| 252 | const uint16_t* minSdk16 = block.getAttributeStringValue(minSdkIndex, &len); |
| 253 | const char* minSdk8 = strdup(String8(minSdk16).string()); |
| 254 | bundle->setManifestMinSdkVersion(minSdk8); |
| 255 | } |
| 256 | } |
no test coverage detected