From: Xavier Ducrohet Date: Mon, 17 Sep 2012 19:03:12 +0000 (-0700) Subject: am d7252571: Merge "Add --error-on-failed-insert option to aapt." X-Git-Url: https://git.saurik.com/android/aapt.git/commitdiff_plain/94eabf4be088c6ab8252caf2fa24cbc71aba1220?hp=4fb118dd3c88c3d67ce24ba9b0a6432f1f7a8f97 am d7252571: Merge "Add --error-on-failed-insert option to aapt." * commit 'd72525718ea7ef3e1f97cf557365b143c8919a5b': Add --error-on-failed-insert option to aapt. --- diff --git a/Bundle.h b/Bundle.h index a5aa0b5..be08291 100644 --- a/Bundle.h +++ b/Bundle.h @@ -61,7 +61,7 @@ public: mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL), mVersionCode(NULL), mVersionName(NULL), mCustomPackage(NULL), mExtraPackages(NULL), mMaxResVersion(NULL), mDebugMode(false), mNonConstantId(false), mProduct(NULL), - mUseCrunchCache(false), mArgc(0), mArgv(NULL) + mUseCrunchCache(false), mErrorOnFailedInsert(false), mArgc(0), mArgv(NULL) {} ~Bundle(void) {} @@ -110,6 +110,8 @@ public: void setAutoAddOverlay(bool val) { mAutoAddOverlay = val; } bool getGenDependencies() { return mGenDependencies; } void setGenDependencies(bool val) { mGenDependencies = val; } + bool getErrorOnFailedInsert() { return mErrorOnFailedInsert; } + void setErrorOnFailedInsert(bool val) { mErrorOnFailedInsert = val; } bool getUTF16StringsOption() { return mWantUTF16 || !isMinSdkAtLeast(SDK_FROYO); @@ -276,6 +278,7 @@ private: bool mNonConstantId; const char* mProduct; bool mUseCrunchCache; + bool mErrorOnFailedInsert; /* file specification */ int mArgc; diff --git a/Main.cpp b/Main.cpp index 9570c66..1773f48 100644 --- a/Main.cpp +++ b/Main.cpp @@ -177,6 +177,11 @@ void usage(void) " Make the resources ID non constant. This is required to make an R java class\n" " that does not contain the final value but is used to make reusable compiled\n" " libraries that need to access resources.\n" + " --error-on-failed-insert\n" + " Forces aapt to return an error if it fails to insert values into the manifest\n" + " with --debug-mode, --min-sdk-version, --target-sdk-version --version-code\n" + " and --version-name.\n" + " Insertion typically fails if the manifest already defines the attribute.\n" " --ignore-assets\n" " Assets to be ignored. Default pattern is:\n" " %s\n", @@ -542,6 +547,8 @@ int main(int argc, char* const argv[]) bundle.setInstrumentationPackageNameOverride(argv[0]); } else if (strcmp(cp, "-auto-add-overlay") == 0) { bundle.setAutoAddOverlay(true); + } else if (strcmp(cp, "-error-on-failed-insert") == 0) { + bundle.setErrorOnFailedInsert(true); } else if (strcmp(cp, "-product") == 0) { argc--; argv++; diff --git a/Resource.cpp b/Resource.cpp index ee076e6..1785683 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -673,24 +673,40 @@ static bool applyFileOverlay(Bundle *bundle, return true; } -void addTagAttribute(const sp& node, const char* ns8, - const char* attr8, const char* value) +/* + * Inserts an attribute in a given node, only if the attribute does not + * exist. + * If errorOnFailedInsert is true, and the attribute already exists, returns false. + * Returns true otherwise, even if the attribute already exists. + */ +bool addTagAttribute(const sp& node, const char* ns8, + const char* attr8, const char* value, bool errorOnFailedInsert) { if (value == NULL) { - return; + return true; } - + const String16 ns(ns8); const String16 attr(attr8); - + if (node->getAttribute(ns, attr) != NULL) { + if (errorOnFailedInsert) { + fprintf(stderr, "Error: AndroidManifest.xml already defines %s (in %s);" + " cannot insert new value %s.\n", + String8(attr).string(), String8(ns).string(), value); + return false; + } + fprintf(stderr, "Warning: AndroidManifest.xml already defines %s (in %s);" " using existing value in manifest.\n", String8(attr).string(), String8(ns).string()); - return; + + // don't stop the build. + return true; } node->addAttribute(ns, attr, String16(value)); + return true; } static void fullyQualifyClassName(const String8& package, sp node, @@ -728,11 +744,17 @@ status_t massageManifest(Bundle* bundle, sp root) fprintf(stderr, "No tag.\n"); return UNKNOWN_ERROR; } - - addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode", - bundle->getVersionCode()); - addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName", - bundle->getVersionName()); + + bool errorOnFailedInsert = bundle->getErrorOnFailedInsert(); + + if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode", + bundle->getVersionCode(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } + if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName", + bundle->getVersionName(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } if (bundle->getMinSdkVersion() != NULL || bundle->getTargetSdkVersion() != NULL @@ -743,18 +765,27 @@ status_t massageManifest(Bundle* bundle, sp root) root->insertChildAt(vers, 0); } - addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion", - bundle->getMinSdkVersion()); - addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion", - bundle->getTargetSdkVersion()); - addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion", - bundle->getMaxSdkVersion()); + if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion", + bundle->getMinSdkVersion(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } + if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion", + bundle->getTargetSdkVersion(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } + if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion", + bundle->getMaxSdkVersion(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } } if (bundle->getDebugMode()) { sp application = root->getChildElement(String16(), String16("application")); if (application != NULL) { - addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true"); + if (!addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true", + errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } } }