am 1e24ccbd: Merge "Add generation of dependency file for .ap_ package"

* commit '1e24ccbdd56a45c8bb5f2eba94af5aecd2d02554':
  Add generation of dependency file for .ap_ package
This commit is contained in:
Xavier Ducrohet
2011-07-20 15:23:55 -07:00
committed by Android Git Automerger
8 changed files with 63 additions and 27 deletions

View File

@@ -1685,7 +1685,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir)); sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir));
AaptGroupEntry group; AaptGroupEntry group;
count = assetAaptDir->slurpFullTree(bundle, assetRoot, group, count = assetAaptDir->slurpFullTree(bundle, assetRoot, group,
String8(), mFullResPaths); String8(), mFullAssetPaths);
if (count < 0) { if (count < 0) {
totalCount = count; totalCount = count;
goto bail; goto bail;
@@ -1759,7 +1759,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
* guarantees about ordering, so we're okay with an inorder search * guarantees about ordering, so we're okay with an inorder search
* using whatever order the OS happens to hand back to us. * using whatever order the OS happens to hand back to us.
*/ */
count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullResPaths); count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullAssetPaths);
if (count < 0) { if (count < 0) {
/* failure; report error and remove archive */ /* failure; report error and remove archive */
totalCount = count; totalCount = count;

View File

@@ -550,6 +550,10 @@ public:
inline void inline void
setFullResPaths(sp<FilePathStore>& res) { mFullResPaths = res; } setFullResPaths(sp<FilePathStore>& res) { mFullResPaths = res; }
inline sp<FilePathStore>& getFullAssetPaths() { return mFullAssetPaths; }
inline void
setFullAssetPaths(sp<FilePathStore>& res) { mFullAssetPaths = res; }
private: private:
String8 mPackage; String8 mPackage;
SortedVector<AaptGroupEntry> mGroupEntries; SortedVector<AaptGroupEntry> mGroupEntries;
@@ -565,6 +569,7 @@ private:
KeyedVector<String8, sp<ResourceTypeSet> >* mRes; KeyedVector<String8, sp<ResourceTypeSet> >* mRes;
sp<FilePathStore> mFullResPaths; sp<FilePathStore> mFullResPaths;
sp<FilePathStore> mFullAssetPaths;
}; };
#endif // __AAPT_ASSETS_H #endif // __AAPT_ASSETS_H

View File

@@ -1390,10 +1390,13 @@ int doPackage(Bundle* bundle)
// Load the assets. // Load the assets.
assets = new AaptAssets(); assets = new AaptAssets();
// Set up the resource gathering in assets if we're trying to make R.java // Set up the resource gathering in assets if we're going to generate
// dependency files
if (bundle->getGenDependencies()) { if (bundle->getGenDependencies()) {
sp<FilePathStore> pathStore = new FilePathStore; sp<FilePathStore> resPathStore = new FilePathStore;
assets->setFullResPaths(pathStore); assets->setFullResPaths(resPathStore);
sp<FilePathStore> assetPathStore = new FilePathStore;
assets->setFullAssetPaths(assetPathStore);
} }
err = assets->slurpFromArgs(bundle); err = assets->slurpFromArgs(bundle);
@@ -1420,9 +1423,16 @@ int doPackage(Bundle* bundle)
} }
if (bundle->getGenDependencies()) { if (bundle->getGenDependencies()) {
if (outputAPKFile) {
dependencyFile = String8(outputAPKFile);
// Strip the extension and add new one
dependencyFile = dependencyFile.getBasePath();
dependencyFile.append(".d");
} else {
dependencyFile = String8(bundle->getRClassDir()); dependencyFile = String8(bundle->getRClassDir());
// Make sure we have a clean dependency file to start with
dependencyFile.appendPath("R.d"); dependencyFile.appendPath("R.d");
}
// Make sure we have a clean dependency file to start with
fp = fopen(dependencyFile, "w"); fp = fopen(dependencyFile, "w");
fclose(fp); fclose(fp);
} }
@@ -1460,19 +1470,6 @@ 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 // Write out the ProGuard file
err = writeProguardFile(bundle, assets); err = writeProguardFile(bundle, assets);
if (err < 0) { if (err < 0) {
@@ -1488,6 +1485,18 @@ int doPackage(Bundle* bundle)
} }
} }
if (bundle->getGenDependencies()) {
// Now that writeResourceSymbols or writeAPK has taken care of writing
// the targets to our dependency file, we'll write the prereqs
fp = fopen(dependencyFile, "a+");
fprintf(fp, " : ");
bool includeRaw = (outputAPKFile != NULL);
err = writeDependencyPreReqs(bundle, assets, fp, includeRaw);
// Also manually add the AndroidManifeset since it's a non-asset
fprintf(fp, "%s \\\n", bundle->getAndroidManifestFile());
fclose(fp);
}
retVal = 0; retVal = 0;
bail: bail:
if (SourcePos::hasErrors()) { if (SourcePos::hasErrors()) {

View File

@@ -148,7 +148,7 @@ void usage(void)
" --extra-packages\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-dependencies\n"
" generate a dependency file for R.java.\n" " generate dependency files in the same directories for R.java and resource package\n"
" --auto-add-overlay\n" " --auto-add-overlay\n"
" Automatically add resources that are only in overlays.\n" " Automatically add resources that are only in overlays.\n"
" --rename-manifest-package\n" " --rename-manifest-package\n"

View File

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

View File

@@ -172,6 +172,16 @@ status_t writeAPK(Bundle* bundle, const sp<AaptAssets>& assets,
} }
} }
if (bundle->getGenDependencies()) {
// Add this file to the dependency file
String8 dependencyFile = outputFile.getBasePath();
dependencyFile.append(".d");
FILE* fp = fopen(dependencyFile.string(), "a");
fprintf(fp, "%s \\\n", outputFile.string());
fclose(fp);
}
assert(result == NO_ERROR); assert(result == NO_ERROR);
bail: bail:

View File

@@ -2187,11 +2187,11 @@ writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets)
return err; return err;
} }
status_t // Loops through the string paths and writes them to the file pointer
writeDependencyPreReqs(Bundle* bundle, const sp<AaptAssets>& assets, FILE* fp) // Each file path is written on its own line with a terminating backslash.
status_t writePathsToFile(const sp<FilePathStore>& files, FILE* fp)
{ {
status_t deps = -1; status_t deps = -1;
sp<FilePathStore> files = assets->getFullResPaths();
for (size_t file_i = 0; file_i < files->size(); ++file_i) { for (size_t file_i = 0; file_i < files->size(); ++file_i) {
// Add the full file path to the dependency file // Add the full file path to the dependency file
fprintf(fp, "%s \\\n", files->itemAt(file_i).string()); fprintf(fp, "%s \\\n", files->itemAt(file_i).string());
@@ -2199,3 +2199,14 @@ writeDependencyPreReqs(Bundle* bundle, const sp<AaptAssets>& assets, FILE* fp)
} }
return deps; return deps;
} }
status_t
writeDependencyPreReqs(Bundle* bundle, const sp<AaptAssets>& assets, FILE* fp, bool includeRaw)
{
status_t deps = -1;
deps += writePathsToFile(assets->getFullResPaths(), fp);
if (includeRaw) {
deps += writePathsToFile(assets->getFullAssetPaths(), fp);
}
return deps;
}

View File

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