am ba6c98db: am 82943ecf: am d40c93f6: Merge "Add dependency generation to Aapt for R.java"

* commit 'ba6c98db8f21016f81ecac35bb0ea3c433044bb7':
  Add dependency generation to Aapt for R.java
This commit is contained in:
Xavier Ducrohet
2011-07-19 10:18:28 -07:00
committed by Android Git Automerger
7 changed files with 110 additions and 18 deletions

View File

@@ -1560,10 +1560,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;
@@ -1586,9 +1586,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);
}
@@ -1615,7 +1620,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;
}
@@ -1847,7 +1852,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;
@@ -1878,6 +1883,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));
@@ -1920,7 +1926,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;
@@ -1946,9 +1952,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);
}
@@ -2010,7 +2017,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

@@ -140,6 +140,7 @@ inline int strictly_order_type(const AaptGroupEntry& lhs, const AaptGroupEntry&
}
class AaptGroup;
class FilePathStore;
/**
* A single asset file we know about.
@@ -269,7 +270,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.
@@ -484,6 +486,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.
@@ -517,7 +527,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);
@@ -545,6 +556,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;
@@ -558,6 +573,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

@@ -1508,6 +1508,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;
@@ -1542,6 +1544,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;
@@ -1551,7 +1560,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) {
@@ -1565,18 +1574,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();
}
@@ -1598,6 +1615,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:
@@ -1917,6 +1923,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;
@@ -2239,3 +2255,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;
}