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

This commit is contained in:
Xavier Ducrohet
2011-07-19 10:03:16 -07:00
committed by Android Code Review
8 changed files with 111 additions and 19 deletions

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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) {

View File

@ -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) {

View File

@ -46,4 +46,5 @@ int dumpResources(Bundle* bundle);
String8 getAttribute(const ResXMLTree& tree, const char* ns,
const char* attr, String8* outError);
status_t writeDependencyPreReqs(Bundle* bundle, const sp<AaptAssets>& assets, FILE* fp);
#endif // __MAIN_H

View File

@ -51,6 +51,12 @@ ResourceTypeSet::ResourceTypeSet()
{
}
FilePathStore::FilePathStore()
:RefBase(),
Vector<String8>()
{
}
class ResourceDirIterator
{
public:
@ -1849,6 +1855,16 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
return err;
}
fclose(fp);
if (bundle->getGenDependencies()) {
// Add this R.java to the dependency file
String8 dependencyFile(bundle->getRClassDir());
dependencyFile.appendPath("R.d");
fp = fopen(dependencyFile.string(), "a");
fprintf(fp,"%s \\\n", dest.string());
fclose(fp);
}
}
return NO_ERROR;
@ -2170,3 +2186,16 @@ writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets)
return err;
}
status_t
writeDependencyPreReqs(Bundle* bundle, const sp<AaptAssets>& assets, FILE* fp)
{
status_t deps = -1;
sp<FilePathStore> files = assets->getFullResPaths();
for (size_t file_i = 0; file_i < files->size(); ++file_i) {
// Add the full file path to the dependency file
fprintf(fp, "%s \\\n", files->itemAt(file_i).string());
deps++;
}
return deps;
}

View File

@ -57,7 +57,7 @@ public:
/*
* Open a new or existing archive.
*/
typedef enum {
enum {
kOpenReadOnly = 0x01,
kOpenReadWrite = 0x02,
kOpenCreate = 0x04, // create if it doesn't exist