Only generate private symbols that are needed.
Change-Id: Icc4c86638db8429a387bf87c934cc712f807e213
This commit is contained in:
25
core/res/MakeJavaSymbols.sed
Normal file
25
core/res/MakeJavaSymbols.sed
Normal 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
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user