X-Git-Url: https://git.saurik.com/android/aapt.git/blobdiff_plain/3ff93dd62adbbd374c7b94f99e2b5cc39f27dbb3..af949fdd618113755b85860f88c0736aa1ed09e7:/Resource.cpp diff --git a/Resource.cpp b/Resource.cpp index fdcada4..d53c472 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -171,7 +171,8 @@ static sp getResourceFile(const sp& assets, bool makeIfNec NULL, String8()); } -static status_t parsePackage(const sp& assets, const sp& grp) +static status_t parsePackage(Bundle* bundle, const sp& assets, + const sp& grp) { if (grp->getFiles().size() != 1) { fprintf(stderr, "warning: Multiple AndroidManifest.xml files found, using %s\n", @@ -215,6 +216,22 @@ static status_t parsePackage(const sp& assets, const sp& assets->setPackage(String8(block.getAttributeStringValue(nameIndex, &len))); + String16 uses_sdk16("uses-sdk"); + while ((code=block.next()) != ResXMLTree::END_DOCUMENT + && code != ResXMLTree::BAD_DOCUMENT) { + if (code == ResXMLTree::START_TAG) { + if (strcmp16(block.getElementName(&len), uses_sdk16.string()) == 0) { + ssize_t minSdkIndex = block.indexOfAttribute("android", + "minSdkVersion"); + if (minSdkIndex >= 0) { + String8 minSdkString = String8( + block.getAttributeStringValue(minSdkIndex, &len)); + bundle->setMinSdkVersion(minSdkString.string()); + } + } + } + } + return NO_ERROR; } @@ -597,7 +614,7 @@ status_t buildResources(Bundle* bundle, const sp& assets) return UNKNOWN_ERROR; } - status_t err = parsePackage(assets, androidManifestFile); + status_t err = parsePackage(bundle, assets, androidManifestFile); if (err != NO_ERROR) { return err; } @@ -613,6 +630,12 @@ status_t buildResources(Bundle* bundle, const sp& assets) NOISY(printf("Found %d included resource packages\n", (int)table.size())); + // Standard flags for compiled XML and optional UTF-8 encoding + int xmlFlags = XML_COMPILE_STANDARD_RESOURCE; + if (bundle->getUTF8()) { + xmlFlags |= XML_COMPILE_UTF8; + } + // -------------------------------------------------------------- // First, gather all resource information. // -------------------------------------------------------------- @@ -763,7 +786,7 @@ status_t buildResources(Bundle* bundle, const sp& assets) ResourceDirIterator it(layouts, String8("layout")); while ((err=it.next()) == NO_ERROR) { String8 src = it.getFile()->getPrintableSource(); - err = compileXmlFile(assets, it.getFile(), &table); + err = compileXmlFile(assets, it.getFile(), &table, xmlFlags); if (err == NO_ERROR) { ResXMLTree block; block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true); @@ -782,7 +805,7 @@ status_t buildResources(Bundle* bundle, const sp& assets) if (anims != NULL) { ResourceDirIterator it(anims, String8("anim")); while ((err=it.next()) == NO_ERROR) { - err = compileXmlFile(assets, it.getFile(), &table); + err = compileXmlFile(assets, it.getFile(), &table, xmlFlags); if (err != NO_ERROR) { hasErrors = true; } @@ -797,7 +820,7 @@ status_t buildResources(Bundle* bundle, const sp& assets) if (xmls != NULL) { ResourceDirIterator it(xmls, String8("xml")); while ((err=it.next()) == NO_ERROR) { - err = compileXmlFile(assets, it.getFile(), &table); + err = compileXmlFile(assets, it.getFile(), &table, xmlFlags); if (err != NO_ERROR) { hasErrors = true; } @@ -819,7 +842,7 @@ status_t buildResources(Bundle* bundle, const sp& assets) if (colors != NULL) { ResourceDirIterator it(colors, String8("color")); while ((err=it.next()) == NO_ERROR) { - err = compileXmlFile(assets, it.getFile(), &table); + err = compileXmlFile(assets, it.getFile(), &table, xmlFlags); if (err != NO_ERROR) { hasErrors = true; } @@ -835,7 +858,7 @@ status_t buildResources(Bundle* bundle, const sp& assets) ResourceDirIterator it(menus, String8("menu")); while ((err=it.next()) == NO_ERROR) { String8 src = it.getFile()->getPrintableSource(); - err = compileXmlFile(assets, it.getFile(), &table); + err = compileXmlFile(assets, it.getFile(), &table, xmlFlags); if (err != NO_ERROR) { hasErrors = true; } @@ -1727,24 +1750,34 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp& ass depth++; String8 tag(tree.getElementName(&len)); // printf("Depth %d tag %s\n", depth, tag.string()); + bool keepTag = false; if (depth == 1) { if (tag != "manifest") { fprintf(stderr, "ERROR: manifest does not start with tag\n"); return -1; } pkg = getAttribute(tree, NULL, "package", NULL); - } else if (depth == 2 && tag == "application") { - inApplication = true; - } - if (inApplication) { - if (tag == "application" || tag == "activity" || tag == "service" || tag == "receiver" - || tag == "provider") { - String8 name = getAttribute(tree, "http://schemas.android.com/apk/res/android", - "name", &error); - if (error != "") { - fprintf(stderr, "ERROR: %s\n", error.string()); - return -1; - } + } else if (depth == 2) { + if (tag == "application") { + inApplication = true; + keepTag = true; + } else if (tag == "instrumentation") { + keepTag = true; + } + } + if (!keepTag && inApplication && depth == 3) { + if (tag == "activity" || tag == "service" || tag == "receiver" || tag == "provider") { + keepTag = true; + } + } + if (keepTag) { + String8 name = getAttribute(tree, "http://schemas.android.com/apk/res/android", + "name", &error); + if (error != "") { + fprintf(stderr, "ERROR: %s\n", error.string()); + return -1; + } + if (name.length() > 0) { // asdf --> package.asdf // .asdf .a.b --> package.asdf package.a.b // asdf.adsf --> asdf.asdf @@ -1821,10 +1854,16 @@ status_t writeProguardForLayouts(ProguardKeepSet* keep, const sp& assets) { status_t err; - sp layout = assets->resDir(String8("layout")); + const Vector >& dirs = assets->resDirs(); + const size_t K = dirs.size(); + for (size_t k=0; k& d = dirs.itemAt(k); + const String8& dirName = d->getLeaf(); + if ((dirName != String8("layout")) && (strncmp(dirName.string(), "layout-", 7) != 0)) { + continue; + } - if (layout != NULL) { - const KeyedVector > groups = layout->getFiles(); + const KeyedVector > groups = d->getFiles(); const size_t N = groups.size(); for (size_t i=0; i& group = groups.valueAt(i);