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

Commit 9bf34ca6 authored by Josiah Gaskin's avatar Josiah Gaskin
Browse files

Add dependency generation to Aapt for R.java

Make Aapt generate a dependency file in the location specified
by RClassDir for R.java if the --generate-dependencies flag is set.
This dependency file is then read by the ant exec loop task
to see whether to recreate R.java.

Change-Id: I7152dac86b6ea0e448ef65e3a95694afe233c789
parent ce89f153
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -1393,10 +1393,10 @@ status_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file)
}

ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
                            const AaptGroupEntry& kind, const String8& resType)
                            const AaptGroupEntry& kind, const String8& resType,
                            sp<FilePathStore>& fullResPaths)
{
    Vector<String8> fileNames;

    {
        DIR* dir = NULL;

@@ -1419,9 +1419,14 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
            if (isHidden(srcDir.string(), entry->d_name))
                continue;

            fileNames.add(String8(entry->d_name));
            String8 name(entry->d_name);
            fileNames.add(name);
            // Add fully qualified path for dependency purposes
            // if we're collecting them
            if (fullResPaths != NULL) {
                fullResPaths->add(srcDir.appendPathCopy(name));
            }
        }

        closedir(dir);
    }

@@ -1448,7 +1453,7 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
                notAdded = true;
            }
            ssize_t res = subdir->slurpFullTree(bundle, pathName, kind,
                                                resType);
                                                resType, fullResPaths);
            if (res < NO_ERROR) {
                return res;
            }
@@ -1680,7 +1685,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
        sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir));
        AaptGroupEntry group;
        count = assetAaptDir->slurpFullTree(bundle, assetRoot, group,
                                            String8());
                                            String8(), mFullResPaths);
        if (count < 0) {
            totalCount = count;
            goto bail;
@@ -1711,6 +1716,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
                    sp<AaptAssets> nextOverlay = new AaptAssets();
                    current->setOverlay(nextOverlay);
                    current = nextOverlay;
                    current->setFullResPaths(mFullResPaths);
                }
                count = current->slurpResourceTree(bundle, String8(res));

@@ -1753,7 +1759,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
         * guarantees about ordering, so we're okay with an inorder search
         * using whatever order the OS happens to hand back to us.
         */
        count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8());
        count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullResPaths);
        if (count < 0) {
            /* failure; report error and remove archive */
            totalCount = count;
@@ -1779,9 +1785,10 @@ bail:

ssize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir,
                                    const AaptGroupEntry& kind,
                                    const String8& resType)
                                    const String8& resType,
                                    sp<FilePathStore>& fullResPaths)
{
    ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType);
    ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths);
    if (res > 0) {
        mGroupEntries.add(kind);
    }
@@ -1843,7 +1850,7 @@ ssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir)
        if (type == kFileTypeDirectory) {
            sp<AaptDir> dir = makeDir(String8(entry->d_name));
            ssize_t res = dir->slurpFullTree(bundle, subdirName, group,
                                                resType);
                                                resType, mFullResPaths);
            if (res < 0) {
                count = res;
                goto bail;
+19 −2
Original line number Diff line number Diff line
@@ -130,6 +130,7 @@ inline int strictly_order_type(const AaptGroupEntry& lhs, const AaptGroupEntry&
}

class AaptGroup;
class FilePathStore;

/**
 * A single asset file we know about.
@@ -259,7 +260,8 @@ public:
    virtual ssize_t slurpFullTree(Bundle* bundle,
                                  const String8& srcDir,
                                  const AaptGroupEntry& kind,
                                  const String8& resType);
                                  const String8& resType,
                                  sp<FilePathStore>& fullResPaths);

    /*
     * Perform some sanity checks on the names of files and directories here.
@@ -474,6 +476,14 @@ public:
    ResourceTypeSet();
};

// Storage for lists of fully qualified paths for
// resources encountered during slurping.
class FilePathStore : public RefBase,
                      public Vector<String8>
{
public:
    FilePathStore();
};

/**
 * Asset hierarchy being operated on.
@@ -507,7 +517,8 @@ public:
    virtual ssize_t slurpFullTree(Bundle* bundle,
                                  const String8& srcDir,
                                  const AaptGroupEntry& kind,
                                  const String8& resType);
                                  const String8& resType,
                                  sp<FilePathStore>& fullResPaths);

    ssize_t slurpResourceTree(Bundle* bundle, const String8& srcDir);
    ssize_t slurpResourceZip(Bundle* bundle, const char* filename);
@@ -535,6 +546,10 @@ public:
    inline void 
        setResources(KeyedVector<String8, sp<ResourceTypeSet> >* res) { delete mRes; mRes = res; }

    inline sp<FilePathStore>& getFullResPaths() { return mFullResPaths; }
    inline void
        setFullResPaths(sp<FilePathStore>& res) { mFullResPaths = res; }

private:
    String8 mPackage;
    SortedVector<AaptGroupEntry> mGroupEntries;
@@ -548,6 +563,8 @@ private:

    sp<AaptAssets> mOverlay;
    KeyedVector<String8, sp<ResourceTypeSet> >* mRes;

    sp<FilePathStore> mFullResPaths;
};

#endif // __AAPT_ASSETS_H
+5 −1
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ public:
          mCompressionMethod(0), mOutputAPKFile(NULL),
          mManifestPackageNameOverride(NULL), mInstrumentationPackageNameOverride(NULL),
          mIsOverlayPackage(false),
          mAutoAddOverlay(false), mAssetSourceDir(NULL), mProguardFile(NULL),
          mAutoAddOverlay(false), mGenDependencies(false),
          mAssetSourceDir(NULL), mProguardFile(NULL),
          mAndroidManifestFile(NULL), mPublicOutputFile(NULL),
          mRClassDir(NULL), mResourceIntermediatesDir(NULL), mManifestMinSdkVersion(NULL),
          mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL),
@@ -97,6 +98,8 @@ public:
    void setIsOverlayPackage(bool val) { mIsOverlayPackage = val; }
    bool getAutoAddOverlay() { return mAutoAddOverlay; }
    void setAutoAddOverlay(bool val) { mAutoAddOverlay = val; }
    bool getGenDependencies() { return mGenDependencies; }
    void setGenDependencies(bool val) { mGenDependencies = val; }

    /*
     * Input options.
@@ -226,6 +229,7 @@ private:
    const char* mInstrumentationPackageNameOverride;
    bool        mIsOverlayPackage;
    bool        mAutoAddOverlay;
    bool        mGenDependencies;
    const char* mAssetSourceDir;
    const char* mProguardFile;
    const char* mAndroidManifestFile;
+34 −4
Original line number Diff line number Diff line
@@ -1353,6 +1353,8 @@ int doPackage(Bundle* bundle)
    status_t err;
    sp<AaptAssets> assets;
    int N;
    FILE* fp;
    String8 dependencyFile;

    // -c zz_ZZ means do pseudolocalization
    ResourceFilter filter;
@@ -1387,6 +1389,13 @@ int doPackage(Bundle* bundle)

    // Load the assets.
    assets = new AaptAssets();

    // Set up the resource gathering in assets if we're trying to make R.java
    if (bundle->getGenDependencies()) {
        sp<FilePathStore> pathStore = new FilePathStore;
        assets->setFullResPaths(pathStore);
    }

    err = assets->slurpFromArgs(bundle);
    if (err < 0) {
        goto bail;
@@ -1396,7 +1405,7 @@ int doPackage(Bundle* bundle)
        assets->print();
    }

    // If they asked for any files that need to be compiled, do so.
    // If they asked for any fileAs that need to be compiled, do so.
    if (bundle->getResourceSourceDirs().size() || bundle->getAndroidManifestFile()) {
        err = buildResources(bundle, assets);
        if (err != 0) {
@@ -1410,18 +1419,26 @@ int doPackage(Bundle* bundle)
        goto bail;
    }

    if (bundle->getGenDependencies()) {
        dependencyFile = String8(bundle->getRClassDir());
        // Make sure we have a clean dependency file to start with
        dependencyFile.appendPath("R.d");
        fp = fopen(dependencyFile, "w");
        fclose(fp);
    }

    // Write out R.java constants
    if (assets->getPackage() == assets->getSymbolsPrivatePackage()) {
        if (bundle->getCustomPackage() == NULL) {
            err = writeResourceSymbols(bundle, assets, assets->getPackage(), true);
            // Copy R.java for libraries
            if (bundle->getExtraPackages() != NULL) {
                // Split on semicolon
                // Split on colon
                String8 libs(bundle->getExtraPackages());
                char* packageString = strtok(libs.lockBuffer(libs.length()), ";");
                char* packageString = strtok(libs.lockBuffer(libs.length()), ":");
                while (packageString != NULL) {
                    err = writeResourceSymbols(bundle, assets, String8(packageString), true);
                    packageString = strtok(NULL, ";");
                    packageString = strtok(NULL, ":");
                }
                libs.unlockBuffer();
            }
@@ -1443,6 +1460,19 @@ int doPackage(Bundle* bundle)
        }
    }

    if (bundle->getGenDependencies()) {
        // Now that writeResourceSymbols has taken care of writing the
        // dependency targets to the dependencyFile, we'll write the
        // pre-requisites.
        fp = fopen(dependencyFile, "a+");
        fprintf(fp, " : ");
        err = writeDependencyPreReqs(bundle, assets, fp);

        // Also manually add the AndroidManifeset since it's a non-asset
        fprintf(fp, "%s \\\n", bundle->getAndroidManifestFile());
        fclose(fp);
    }

    // Write out the ProGuard file
    err = writeProguardFile(bundle, assets);
    if (err < 0) {
+5 −1
Original line number Diff line number Diff line
@@ -146,7 +146,9 @@ void usage(void)
        "   --custom-package\n"
        "       generates R.java into a different package.\n"
        "   --extra-packages\n"
        "       generate R.java for libraries. Separate libraries with ';'.\n"
        "       generate R.java for libraries. Separate libraries with ':'.\n"
        "   --generate-dependencies\n"
        "       generate a dependency file for R.java.\n"
        "   --auto-add-overlay\n"
        "       Automatically add resources that are only in overlays.\n"
        "   --rename-manifest-package\n"
@@ -486,6 +488,8 @@ int main(int argc, char* const argv[])
                        goto bail;
                    }
                    bundle.setExtraPackages(argv[0]);
                } else if (strcmp(cp, "-generate-dependencies") == 0) {
                    bundle.setGenDependencies(true);
                } else if (strcmp(cp, "-utf16") == 0) {
                    bundle.setWantUTF16(true);
                } else if (strcmp(cp, "-rename-manifest-package") == 0) {
Loading