Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1741cd49 authored by Kenny Root's avatar Kenny Root
Browse files

Fix minSdkVersion scanning to not throw warnings

For the UTF8/UTF16 switch code, we needed to know what was the
minSdkVersion specified as early as possible. Unfortunately, this threw
warnings when the SDK was compiling since we always set this field in
the Bundle.

This splits out the field used by the initial AndroidManifest.xml scan
to a separate one that we won't attempt to re-insert into the
AndroidManifest.xml  This also switches the logic to better reflect the
preference of UTF-8 over UTF-16; previously UTF-16 was the default.

Change-Id: Ia81f6b21047043ebb711eb24c2c3718534979ef6
parent 2fbc10f3
Loading
Loading
Loading
Loading
+37 −27
Original line number Diff line number Diff line
@@ -37,12 +37,12 @@ public:
          mForce(false), mGrayscaleTolerance(0), mMakePackageDirs(false),
          mUpdate(false), mExtending(false),
          mRequireLocalization(false), mPseudolocalize(false),
          mUTF8(false), mEncodingSpecified(false), mValues(false),
          mWantUTF16(false), mValues(false),
          mCompressionMethod(0), mOutputAPKFile(NULL),
          mManifestPackageNameOverride(NULL), mInstrumentationPackageNameOverride(NULL),
          mAutoAddOverlay(false), mAssetSourceDir(NULL), mProguardFile(NULL),
          mAndroidManifestFile(NULL), mPublicOutputFile(NULL),
          mRClassDir(NULL), mResourceIntermediatesDir(NULL),
          mRClassDir(NULL), mResourceIntermediatesDir(NULL), mManifestMinSdkVersion(NULL),
          mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL),
          mVersionCode(NULL), mVersionName(NULL), mCustomPackage(NULL),
          mArgc(0), mArgv(NULL)
@@ -77,10 +77,8 @@ public:
    void setRequireLocalization(bool val) { mRequireLocalization = val; }
    bool getPseudolocalize(void) const { return mPseudolocalize; }
    void setPseudolocalize(bool val) { mPseudolocalize = val; }
    bool getUTF8(void) const { return mUTF8; }
    void setUTF8(bool val) { mUTF8 = val; }
    bool getEncodingSpecified(void) const { return mEncodingSpecified; }
    void setEncodingSpecified(bool val) { mEncodingSpecified = val; }
    bool getWantUTF16(void) const { return mWantUTF16; }
    void setWantUTF16(bool val) { mWantUTF16 = val; }
    bool getValues(void) const { return mValues; }
    void setValues(bool val) { mValues = val; }
    int getCompressionMethod(void) const { return mCompressionMethod; }
@@ -122,13 +120,10 @@ public:
    const android::Vector<const char*>& getNoCompressExtensions() const { return mNoCompressExtensions; }
    void addNoCompressExtension(const char* ext) { mNoCompressExtensions.add(ext); }

    const char*  getManifestMinSdkVersion() const { return mManifestMinSdkVersion; }
    void setManifestMinSdkVersion(const char*  val) { mManifestMinSdkVersion = val; }
    const char*  getMinSdkVersion() const { return mMinSdkVersion; }
    void setMinSdkVersion(const char*  val) {
        mMinSdkVersion = val;
        if (!mEncodingSpecified) {
            setUTF8(isUTF8Available());
        }
    }
    void setMinSdkVersion(const char*  val) { mMinSdkVersion = val; }
    const char*  getTargetSdkVersion() const { return mTargetSdkVersion; }
    void setTargetSdkVersion(const char*  val) { mTargetSdkVersion = val; }
    const char*  getMaxSdkVersion() const { return mMaxSdkVersion; }
@@ -167,6 +162,34 @@ public:
    void setPackageCount(int val) { mPackageCount = val; }
#endif

    /* UTF-8 is only available on APIs 7 or above or
     * SDK levels that have code names.
     */
    bool isUTF8Available() {
        /* If the application specifies a minSdkVersion in the manifest
         * then use that. Otherwise, check what the user specified on
         * the command line. If neither, it's not available since
         * the minimum SDK version is assumed to be 1.
         */
        const char *minVer;
        if (mManifestMinSdkVersion != NULL) {
            minVer = mManifestMinSdkVersion;
        } else if (mMinSdkVersion != NULL) {
            minVer = mMinSdkVersion;
        } else {
            return false;
        }

        char *end;
        int minSdkNum = (int)strtol(minVer, &end, 0);
        if (*end == '\0') {
            if (minSdkNum < 7) {
                return false;
            }
        }
        return true;
    }

private:
    /* commands & modifiers */
    Command     mCmd;
@@ -179,8 +202,7 @@ private:
    bool        mExtending;
    bool        mRequireLocalization;
    bool        mPseudolocalize;
    bool        mUTF8;
    bool        mEncodingSpecified;
    bool        mWantUTF16;
    bool        mValues;
    int         mCompressionMethod;
    bool        mJunkPath;
@@ -200,6 +222,7 @@ private:
    android::Vector<const char*> mNoCompressExtensions;
    android::Vector<const char*> mResourceSourceDirs;

    const char* mManifestMinSdkVersion;
    const char* mMinSdkVersion;
    const char* mTargetSdkVersion;
    const char* mMaxSdkVersion;
@@ -216,19 +239,6 @@ private:
    int         mPackageCount;
#endif

    /* UTF-8 is only available on APIs 7 or above or
     * SDK levels that have code names.
     */
    bool isUTF8Available() {
        char *end;
        int minSdkNum = (int)strtol(mMinSdkVersion, &end, 0);
        if (*end == '\0') {
            if (minSdkNum < 7) {
                return false;
            }
        }
        return true;
    }
};

#endif // __BUNDLE_H
+1 −2
Original line number Diff line number Diff line
@@ -446,8 +446,7 @@ int main(int argc, char* const argv[])
                    }
                    bundle.setCustomPackage(argv[0]);
                } else if (strcmp(cp, "-utf16") == 0) {
                    bundle.setEncodingSpecified(true);
                    bundle.setUTF8(false);
                    bundle.setWantUTF16(true);
                } else if (strcmp(cp, "-rename-manifest-package") == 0) {
                    argc--;
                    argv++;
+8 −2
Original line number Diff line number Diff line
@@ -226,7 +226,7 @@ static status_t parsePackage(Bundle* bundle, const sp<AaptAssets>& assets,
                if (minSdkIndex >= 0) {
                    const uint16_t* minSdk16 = block.getAttributeStringValue(minSdkIndex, &len);
                    const char* minSdk8 = strdup(String8(minSdk16).string());
                    bundle->setMinSdkVersion(minSdk8);
                    bundle->setManifestMinSdkVersion(minSdk8);
                }
            }
        }
@@ -768,7 +768,13 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets)

    // Standard flags for compiled XML and optional UTF-8 encoding
    int xmlFlags = XML_COMPILE_STANDARD_RESOURCE;
    if (bundle->getUTF8()) {

    /* Only enable UTF-8 if the caller of aapt didn't specifically
     * request UTF-16 encoding and the parameters of this package
     * allow UTF-8 to be used.
     */
    if (!bundle->getWantUTF16()
            && bundle->isUTF8Available()) {
        xmlFlags |= XML_COMPILE_UTF8;
    }

+5 −3
Original line number Diff line number Diff line
@@ -2527,9 +2527,11 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
    const size_t N = mOrderedPackages.size();
    size_t pi;

    bool useUTF8 = !bundle->getWantUTF16() && bundle->isUTF8Available();

    // Iterate through all data, collecting all values (strings,
    // references, etc).
    StringPool valueStrings = StringPool(false, bundle->getUTF8());
    StringPool valueStrings = StringPool(false, useUTF8);
    for (pi=0; pi<N; pi++) {
        sp<Package> p = mOrderedPackages.itemAt(pi);
        if (p->getTypes().size() == 0) {
@@ -2537,8 +2539,8 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
            continue;
        }

        StringPool typeStrings = StringPool(false, bundle->getUTF8());
        StringPool keyStrings = StringPool(false, bundle->getUTF8());
        StringPool typeStrings = StringPool(false, useUTF8);
        StringPool keyStrings = StringPool(false, useUTF8);

        const size_t N = p->getOrderedTypes().size();
        for (size_t ti=0; ti<N; ti++) {