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

Commit 341b4d07 authored by Rohit Agrawal's avatar Rohit Agrawal Committed by android-build-merger
Browse files

Merge "AAPT: ProGuard config for components in main dex." into nyc-dev

am: ab456641

* commit 'ab456641':
  AAPT: ProGuard config for components in main dex.

Change-Id: I30a095ba5b2ee1a4d5f7c329cd4cf22cb77ba18e
parents 9dee0bcc ab456641
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ public:
          mCompressionMethod(0), mJunkPath(false), mOutputAPKFile(NULL),
          mManifestPackageNameOverride(NULL), mInstrumentationPackageNameOverride(NULL),
          mAutoAddOverlay(false), mGenDependencies(false), mNoVersionVectors(false),
          mCrunchedOutputDir(NULL), mProguardFile(NULL),
          mCrunchedOutputDir(NULL), mProguardFile(NULL), mMainDexProguardFile(NULL),
          mAndroidManifestFile(NULL), mPublicOutputFile(NULL),
          mRClassDir(NULL), mResourceIntermediatesDir(NULL), mManifestMinSdkVersion(NULL),
          mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL),
@@ -146,6 +146,8 @@ public:
    void setCrunchedOutputDir(const char* dir) { mCrunchedOutputDir = dir; }
    const char* getProguardFile() const { return mProguardFile; }
    void setProguardFile(const char* file) { mProguardFile = file; }
    const char* getMainDexProguardFile() const { return mMainDexProguardFile; }
    void setMainDexProguardFile(const char* file) { mMainDexProguardFile = file; }
    const android::Vector<const char*>& getResourceSourceDirs() const { return mResourceSourceDirs; }
    void addResourceSourceDir(const char* dir) { mResourceSourceDirs.insertAt(dir,0); }
    const char* getAndroidManifestFile() const { return mAndroidManifestFile; }
@@ -299,6 +301,7 @@ private:
    bool        mNoVersionVectors;
    const char* mCrunchedOutputDir;
    const char* mProguardFile;
    const char* mMainDexProguardFile;
    const char* mAndroidManifestFile;
    const char* mPublicOutputFile;
    const char* mRClassDir;
+6 −0
Original line number Diff line number Diff line
@@ -2631,6 +2631,12 @@ int doPackage(Bundle* bundle)
        goto bail;
    }

    // Write out the Main Dex ProGuard file
    err = writeMainDexProguardFile(bundle, assets);
    if (err < 0) {
        goto bail;
    }

    // Write the apk
    if (outputAPKFile) {
        // Gather all resources and add them to the APK Builder. The builder will then
+13 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ void usage(void)
        "        [--max-res-version VAL] \\\n"
        "        [-I base-package [-I base-package ...]] \\\n"
        "        [-A asset-source-dir]  [-G class-list-file] [-P public-definitions-file] \\\n"
        "        [-D main-dex-class-list-file] \\\n"
        "        [-S resource-sources [-S resource-sources ...]] \\\n"
        "        [-F apk-file] [-J R-file-dir] \\\n"
        "        [--product product1,product2,...] \\\n"
@@ -120,6 +121,7 @@ void usage(void)
        "       localization=\"suggested\"\n"
        "   -A  additional directory in which to find raw asset files\n"
        "   -G  A file to output proguard options into.\n"
        "   -D  A file to output proguard options for the main dex into.\n"
        "   -F  specify the apk file to output\n"
        "   -I  add an existing package to base include set\n"
        "   -J  specify where to output R.java resource constant definitions\n"
@@ -390,6 +392,17 @@ int main(int argc, char* const argv[])
                convertPath(argv[0]);
                bundle.setProguardFile(argv[0]);
                break;
            case 'D':
                argc--;
                argv++;
                if (!argc) {
                    fprintf(stderr, "ERROR: No argument supplied for '-D' option\n");
                    wantUsage = true;
                    goto bail;
                }
                convertPath(argv[0]);
                bundle.setMainDexProguardFile(argv[0]);
                break;
            case 'I':
                argc--;
                argv++;
+1 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ extern android::status_t writeResourceSymbols(Bundle* bundle,
        bool includePrivate, bool emitCallback);

extern android::status_t writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets);
extern android::status_t writeMainDexProguardFile(Bundle* bundle, const sp<AaptAssets>& assets);

extern bool isValidResourceType(const String8& type);

+70 −19
Original line number Diff line number Diff line
@@ -2832,7 +2832,7 @@ addProguardKeepMethodRule(ProguardKeepSet* keep, const String8& memberName,
}

status_t
writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets, bool mainDex)
{
    status_t err;
    ResXMLTree tree;
@@ -2844,6 +2844,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass
    sp<AaptGroup> assGroup;
    sp<AaptFile> assFile;
    String8 pkg;
    String8 defaultProcess;

    // First, look for a package file to parse.  This is required to
    // be able to generate the resource information.
@@ -2900,6 +2901,15 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass
                    addProguardKeepRule(keep, agent, pkg.string(),
                            assFile->getPrintableSource(), tree.getLineNumber());
                }

                if (mainDex) {
                    defaultProcess = AaptXml::getAttribute(tree,
                            "http://schemas.android.com/apk/res/android", "process", &error);
                    if (error != "") {
                        fprintf(stderr, "ERROR: %s\n", error.string());
                        return -1;
                    }
                }
            } else if (tag == "instrumentation") {
                keepTag = true;
            }
@@ -2916,7 +2926,23 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass
                fprintf(stderr, "ERROR: %s\n", error.string());
                return -1;
            }
            if (name.length() > 0) {

            keepTag = name.length() > 0;

            if (keepTag && mainDex) {
                String8 componentProcess = AaptXml::getAttribute(tree,
                        "http://schemas.android.com/apk/res/android", "process", &error);
                if (error != "") {
                    fprintf(stderr, "ERROR: %s\n", error.string());
                    return -1;
                }

                const String8& process =
                        componentProcess.length() > 0 ? componentProcess : defaultProcess;
                keepTag = process.length() > 0 && process.find(":") != 0;
            }

            if (keepTag) {
                addProguardKeepRule(keep, name, pkg.string(),
                        assFile->getPrintableSource(), tree.getLineNumber());
            }
@@ -3098,6 +3124,31 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
    return NO_ERROR;
}

status_t
writeProguardSpec(const char* filename, const ProguardKeepSet& keep, status_t err)
{
    FILE* fp = fopen(filename, "w+");
    if (fp == NULL) {
        fprintf(stderr, "ERROR: Unable to open class file %s: %s\n",
                filename, strerror(errno));
        return UNKNOWN_ERROR;
    }

    const KeyedVector<String8, SortedVector<String8> >& rules = keep.rules;
    const size_t N = rules.size();
    for (size_t i=0; i<N; i++) {
        const SortedVector<String8>& locations = rules.valueAt(i);
        const size_t M = locations.size();
        for (size_t j=0; j<M; j++) {
            fprintf(fp, "# %s\n", locations.itemAt(j).string());
        }
        fprintf(fp, "%s\n\n", rules.keyAt(i).string());
    }
    fclose(fp);

    return err;
}

status_t
writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets)
{
@@ -3109,7 +3160,7 @@ writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets)

    ProguardKeepSet keep;

    err = writeProguardForAndroidManifest(&keep, assets);
    err = writeProguardForAndroidManifest(&keep, assets, false);
    if (err < 0) {
        return err;
    }
@@ -3119,28 +3170,28 @@ writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets)
        return err;
    }

    FILE* fp = fopen(bundle->getProguardFile(), "w+");
    if (fp == NULL) {
        fprintf(stderr, "ERROR: Unable to open class file %s: %s\n",
                bundle->getProguardFile(), strerror(errno));
        return UNKNOWN_ERROR;
    return writeProguardSpec(bundle->getProguardFile(), keep, err);
}

    const KeyedVector<String8, SortedVector<String8> >& rules = keep.rules;
    const size_t N = rules.size();
    for (size_t i=0; i<N; i++) {
        const SortedVector<String8>& locations = rules.valueAt(i);
        const size_t M = locations.size();
        for (size_t j=0; j<M; j++) {
            fprintf(fp, "# %s\n", locations.itemAt(j).string());
        }
        fprintf(fp, "%s\n\n", rules.keyAt(i).string());
status_t
writeMainDexProguardFile(Bundle* bundle, const sp<AaptAssets>& assets)
{
    status_t err = -1;

    if (!bundle->getMainDexProguardFile()) {
        return NO_ERROR;
    }
    fclose(fp);

    ProguardKeepSet keep;

    err = writeProguardForAndroidManifest(&keep, assets, true);
    if (err < 0) {
        return err;
    }

    return writeProguardSpec(bundle->getMainDexProguardFile(), keep, err);
}

// Loops through the string paths and writes them to the file pointer
// Each file path is written on its own line with a terminating backslash.
status_t writePathsToFile(const sp<FilePathStore>& files, FILE* fp)