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

Commit d40c93f6 authored by Xavier Ducrohet's avatar Xavier Ducrohet Committed by Android Code Review
Browse files

Merge "Add dependency generation to Aapt for R.java"

parents 42755155 9bf34ca6
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