Only generate private symbols that are needed.

Change-Id: Icc4c86638db8429a387bf87c934cc712f807e213
This commit is contained in:
Dianne Hackborn
2012-02-06 15:33:21 -08:00
parent e7171effdf
commit 1644c6d7f4
7 changed files with 1709 additions and 10 deletions

View File

@@ -0,0 +1,25 @@
# Run this on the errors output by javac of missing resource symbols,
# to generate the set of <java-symbol> commands to have aapt generate
# the symbol for them.
#
# For example: make framework 2>&1 | sed -n -f MakeJavaSymbols.sed | sort -u
s|.*R.id.\([a-zA-Z0-9_]*\).*| <java-symbol type="id" name="\1" />|gp
s|.*R.attr.\([a-zA-Z0-9_]*\).*| <java-symbol type="attr" name="\1" />|gp
s|.*R.bool.\([a-zA-Z0-9_]*\).*| <java-symbol type="bool" name="\1" />|gp
s|.*R.integer.\([a-zA-Z0-9_]*\).*| <java-symbol type="integer" name="\1" />|gp
s|.*R.color.\([a-zA-Z0-9_]*\).*| <java-symbol type="color" name="\1" />|gp
s|.*R.dimen.\([a-zA-Z0-9_]*\).*| <java-symbol type="dimen" name="\1" />|gp
s|.*R.fraction.\([a-zA-Z0-9_]*\).*| <java-symbol type="fraction" name="\1" />|gp
s|.*R.string.\([a-zA-Z0-9_]*\).*| <java-symbol type="string" name="\1" />|gp
s|.*R.plurals.\([a-zA-Z0-9_]*\).*| <java-symbol type="plurals" name="\1" />|gp
s|.*R.array.\([a-zA-Z0-9_]*\).*| <java-symbol type="array" name="\1" />|gp
s|.*R.drawable.\([a-zA-Z0-9_]*\).*| <java-symbol type="drawable" name="\1" />|gp
s|.*R.layout.\([a-zA-Z0-9_]*\).*| <java-symbol type="layout" name="\1" />|gp
s|.*R.anim.\([a-zA-Z0-9_]*\).*| <java-symbol type="anim" name="\1" />|gp
s|.*R.animator.\([a-zA-Z0-9_]*\).*| <java-symbol type="animator" name="\1" />|gp
s|.*R.interpolator.\([a-zA-Z0-9_]*\).*| <java-symbol type="interpolator" name="\1" />|gp
s|.*R.menu.\([a-zA-Z0-9_]*\).*| <java-symbol type="menu" name="\1" />|gp
s|.*R.xml.\([a-zA-Z0-9_]*\).*| <java-symbol type="xml" name="\1" />|gp
s|.*R.raw.\([a-zA-Z0-9_]*\).*| <java-symbol type="raw" name="\1" />|gp
s|.*R.style.\([a-zA-Z0-9_]*\).*| <java-symbol type="style" name="\1" />|gp

File diff suppressed because it is too large Load Diff

View File

@@ -1837,6 +1837,49 @@ String8 AaptDir::getPrintableSource() const
// =========================================================================
// =========================================================================
status_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols)
{
status_t err = NO_ERROR;
size_t N = javaSymbols->mSymbols.size();
for (size_t i=0; i<N; i++) {
const String8& name = javaSymbols->mSymbols.keyAt(i);
const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i);
ssize_t pos = mSymbols.indexOfKey(name);
if (pos < 0) {
entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string());
err = UNKNOWN_ERROR;
continue;
}
//printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n",
// i, N, name.string(), entry.isJavaSymbol ? 1 : 0);
mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol;
}
N = javaSymbols->mNestedSymbols.size();
for (size_t i=0; i<N; i++) {
const String8& name = javaSymbols->mNestedSymbols.keyAt(i);
const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i);
ssize_t pos = mNestedSymbols.indexOfKey(name);
if (pos < 0) {
SourcePos pos;
pos.error("Java symbol dir %s not defined\n", name.string());
err = UNKNOWN_ERROR;
continue;
}
//printf("**** applying java symbols in dir %s\n", name.string());
status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols);
if (myerr != NO_ERROR) {
err = myerr;
}
}
return err;
}
// =========================================================================
// =========================================================================
// =========================================================================
AaptAssets::AaptAssets()
: AaptDir(String8(), String8()),
mChanged(false), mHaveIncludedAssets(false), mRes(NULL)
@@ -2404,6 +2447,48 @@ sp<AaptSymbols> AaptAssets::getSymbolsFor(const String8& name)
return sym;
}
sp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name)
{
sp<AaptSymbols> sym = mJavaSymbols.valueFor(name);
if (sym == NULL) {
sym = new AaptSymbols();
mJavaSymbols.add(name, sym);
}
return sym;
}
status_t AaptAssets::applyJavaSymbols()
{
size_t N = mJavaSymbols.size();
for (size_t i=0; i<N; i++) {
const String8& name = mJavaSymbols.keyAt(i);
const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i);
ssize_t pos = mSymbols.indexOfKey(name);
if (pos < 0) {
SourcePos pos;
pos.error("Java symbol dir %s not defined\n", name.string());
return UNKNOWN_ERROR;
}
//printf("**** applying java symbols in dir %s\n", name.string());
status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols);
if (err != NO_ERROR) {
return err;
}
}
return NO_ERROR;
}
bool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const {
//printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n",
// sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0,
// sym.isJavaSymbol ? 1 : 0);
if (!mHavePrivateSymbols) return true;
if (sym.isPublic) return true;
if (includePrivate && sym.isJavaSymbol) return true;
return false;
}
status_t AaptAssets::buildIncludedResources(Bundle* bundle)
{
if (!mHaveIncludedAssets) {

View File

@@ -315,16 +315,16 @@ class AaptSymbolEntry
{
public:
AaptSymbolEntry()
: isPublic(false), typeCode(TYPE_UNKNOWN)
: isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
{
}
AaptSymbolEntry(const String8& _name)
: name(_name), isPublic(false), typeCode(TYPE_UNKNOWN)
: name(_name), isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
{
}
AaptSymbolEntry(const AaptSymbolEntry& o)
: name(o.name), sourcePos(o.sourcePos), isPublic(o.isPublic)
, comment(o.comment), typeComment(o.typeComment)
, isJavaSymbol(o.isJavaSymbol), comment(o.comment), typeComment(o.typeComment)
, typeCode(o.typeCode), int32Val(o.int32Val), stringVal(o.stringVal)
{
}
@@ -332,6 +332,7 @@ public:
{
sourcePos = o.sourcePos;
isPublic = o.isPublic;
isJavaSymbol = o.isJavaSymbol;
comment = o.comment;
typeComment = o.typeComment;
typeCode = o.typeCode;
@@ -344,6 +345,7 @@ public:
SourcePos sourcePos;
bool isPublic;
bool isJavaSymbol;
String16 comment;
String16 typeComment;
@@ -401,6 +403,15 @@ public:
return NO_ERROR;
}
status_t makeSymbolJavaSymbol(const String8& name, const SourcePos& pos) {
if (!check_valid_symbol_name(name, pos, "symbol")) {
return BAD_VALUE;
}
AaptSymbolEntry& sym = edit_symbol(name, &pos);
sym.isJavaSymbol = true;
return NO_ERROR;
}
void appendComment(const String8& name, const String16& comment, const SourcePos& pos) {
if (comment.size() <= 0) {
return;
@@ -441,6 +452,8 @@ public:
return sym;
}
status_t applyJavaSymbols(const sp<AaptSymbols>& javaSymbols);
const KeyedVector<String8, AaptSymbolEntry>& getSymbols() const
{ return mSymbols; }
const DefaultKeyedVector<String8, sp<AaptSymbols> >& getNestedSymbols() const
@@ -509,7 +522,11 @@ public:
virtual ~AaptAssets() { delete mRes; }
const String8& getPackage() const { return mPackage; }
void setPackage(const String8& package) { mPackage = package; mSymbolsPrivatePackage = package; }
void setPackage(const String8& package) {
mPackage = package;
mSymbolsPrivatePackage = package;
mHavePrivateSymbols = false;
}
const SortedVector<AaptGroupEntry>& getGroupEntries() const;
@@ -532,11 +549,22 @@ public:
sp<AaptSymbols> getSymbolsFor(const String8& name);
sp<AaptSymbols> getJavaSymbolsFor(const String8& name);
status_t applyJavaSymbols();
const DefaultKeyedVector<String8, sp<AaptSymbols> >& getSymbols() const { return mSymbols; }
String8 getSymbolsPrivatePackage() const { return mSymbolsPrivatePackage; }
void setSymbolsPrivatePackage(const String8& pkg) { mSymbolsPrivatePackage = pkg; }
void setSymbolsPrivatePackage(const String8& pkg) {
mSymbolsPrivatePackage = pkg;
mHavePrivateSymbols = mSymbolsPrivatePackage != mPackage;
}
bool havePrivateSymbols() const { return mHavePrivateSymbols; }
bool isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const;
status_t buildIncludedResources(Bundle* bundle);
status_t addIncludedResources(const sp<AaptFile>& file);
const ResTable& getIncludedResources() const;
@@ -576,7 +604,9 @@ private:
String8 mPackage;
SortedVector<AaptGroupEntry> mGroupEntries;
DefaultKeyedVector<String8, sp<AaptSymbols> > mSymbols;
DefaultKeyedVector<String8, sp<AaptSymbols> > mJavaSymbols;
String8 mSymbolsPrivatePackage;
bool mHavePrivateSymbols;
Vector<sp<AaptDir> > mResDirs;

View File

@@ -1617,6 +1617,12 @@ int doPackage(Bundle* bundle)
goto bail;
}
// Update symbols with information about which ones are needed as Java symbols.
assets->applyJavaSymbols();
if (SourcePos::hasErrors()) {
goto bail;
}
// If we've been asked to generate a dependency file, do that here
if (bundle->getGenDependencies()) {
// If this is the packaging step, generate the dependency file next to
@@ -1638,7 +1644,7 @@ int doPackage(Bundle* bundle)
}
// Write out R.java constants
if (assets->getPackage() == assets->getSymbolsPrivatePackage()) {
if (!assets->havePrivateSymbols()) {
if (bundle->getCustomPackage() == NULL) {
// Write the R.java file into the appropriate class directory
// e.g. gen/com/foo/app/R.java

View File

@@ -1808,7 +1808,7 @@ static status_t writeSymbolClass(
if (sym.typeCode != AaptSymbolEntry::TYPE_INT32) {
continue;
}
if (!includePrivate && !sym.isPublic) {
if (!assets->isJavaSymbol(sym, includePrivate)) {
continue;
}
String16 name(sym.name);
@@ -1864,7 +1864,7 @@ static status_t writeSymbolClass(
if (sym.typeCode != AaptSymbolEntry::TYPE_STRING) {
continue;
}
if (!includePrivate && !sym.isPublic) {
if (!assets->isJavaSymbol(sym, includePrivate)) {
continue;
}
String16 name(sym.name);
@@ -1976,7 +1976,8 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
"\n"
"package %s;\n\n", package.string());
status_t err = writeSymbolClass(fp, assets, includePrivate, symbols, className, 0, bundle->getNonConstantId());
status_t err = writeSymbolClass(fp, assets, includePrivate, symbols,
className, 0, bundle->getNonConstantId());
if (err != NO_ERROR) {
return err;
}

View File

@@ -753,6 +753,7 @@ status_t compileResourceFile(Bundle* bundle,
const String16 public16("public");
const String16 public_padding16("public-padding");
const String16 private_symbols16("private-symbols");
const String16 java_symbol16("java-symbol");
const String16 add_resource16("add-resource");
const String16 skip16("skip");
const String16 eat_comment16("eat-comment");
@@ -1058,6 +1059,49 @@ status_t compileResourceFile(Bundle* bundle,
}
continue;
} else if (strcmp16(block.getElementName(&len), java_symbol16.string()) == 0) {
SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());
String16 type;
ssize_t typeIdx = block.indexOfAttribute(NULL, "type");
if (typeIdx < 0) {
srcPos.error("A 'type' attribute is required for <public>\n");
hasErrors = localHasErrors = true;
}
type = String16(block.getAttributeStringValue(typeIdx, &len));
String16 name;
ssize_t nameIdx = block.indexOfAttribute(NULL, "name");
if (nameIdx < 0) {
srcPos.error("A 'name' attribute is required for <public>\n");
hasErrors = localHasErrors = true;
}
name = String16(block.getAttributeStringValue(nameIdx, &len));
sp<AaptSymbols> symbols = assets->getJavaSymbolsFor(String8("R"));
if (symbols != NULL) {
symbols = symbols->addNestedSymbol(String8(type), srcPos);
}
if (symbols != NULL) {
symbols->makeSymbolJavaSymbol(String8(name), srcPos);
String16 comment(
block.getComment(&len) ? block.getComment(&len) : nulStr);
symbols->appendComment(String8(name), comment, srcPos);
} else {
srcPos.error("Unable to create symbols!\n");
hasErrors = localHasErrors = true;
}
while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
if (code == ResXMLTree::END_TAG) {
if (strcmp16(block.getElementName(&len), java_symbol16.string()) == 0) {
break;
}
}
}
continue;
} else if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) {
SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());