Skip to content

Commit 424a69d

Browse files
Dianne HackbornAndroid (Google) Code Review
authored andcommitted
Merge "Only generate private symbols that are needed."
2 parents d36ad9b + 1644c6d commit 424a69d

File tree

7 files changed

+1709
-10
lines changed

7 files changed

+1709
-10
lines changed

core/res/MakeJavaSymbols.sed

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Run this on the errors output by javac of missing resource symbols,
2+
# to generate the set of <java-symbol> commands to have aapt generate
3+
# the symbol for them.
4+
#
5+
# For example: make framework 2>&1 | sed -n -f MakeJavaSymbols.sed | sort -u
6+
7+
s|.*R.id.\([a-zA-Z0-9_]*\).*| <java-symbol type="id" name="\1" />|gp
8+
s|.*R.attr.\([a-zA-Z0-9_]*\).*| <java-symbol type="attr" name="\1" />|gp
9+
s|.*R.bool.\([a-zA-Z0-9_]*\).*| <java-symbol type="bool" name="\1" />|gp
10+
s|.*R.integer.\([a-zA-Z0-9_]*\).*| <java-symbol type="integer" name="\1" />|gp
11+
s|.*R.color.\([a-zA-Z0-9_]*\).*| <java-symbol type="color" name="\1" />|gp
12+
s|.*R.dimen.\([a-zA-Z0-9_]*\).*| <java-symbol type="dimen" name="\1" />|gp
13+
s|.*R.fraction.\([a-zA-Z0-9_]*\).*| <java-symbol type="fraction" name="\1" />|gp
14+
s|.*R.string.\([a-zA-Z0-9_]*\).*| <java-symbol type="string" name="\1" />|gp
15+
s|.*R.plurals.\([a-zA-Z0-9_]*\).*| <java-symbol type="plurals" name="\1" />|gp
16+
s|.*R.array.\([a-zA-Z0-9_]*\).*| <java-symbol type="array" name="\1" />|gp
17+
s|.*R.drawable.\([a-zA-Z0-9_]*\).*| <java-symbol type="drawable" name="\1" />|gp
18+
s|.*R.layout.\([a-zA-Z0-9_]*\).*| <java-symbol type="layout" name="\1" />|gp
19+
s|.*R.anim.\([a-zA-Z0-9_]*\).*| <java-symbol type="anim" name="\1" />|gp
20+
s|.*R.animator.\([a-zA-Z0-9_]*\).*| <java-symbol type="animator" name="\1" />|gp
21+
s|.*R.interpolator.\([a-zA-Z0-9_]*\).*| <java-symbol type="interpolator" name="\1" />|gp
22+
s|.*R.menu.\([a-zA-Z0-9_]*\).*| <java-symbol type="menu" name="\1" />|gp
23+
s|.*R.xml.\([a-zA-Z0-9_]*\).*| <java-symbol type="xml" name="\1" />|gp
24+
s|.*R.raw.\([a-zA-Z0-9_]*\).*| <java-symbol type="raw" name="\1" />|gp
25+
s|.*R.style.\([a-zA-Z0-9_]*\).*| <java-symbol type="style" name="\1" />|gp

core/res/res/values/public.xml

Lines changed: 1508 additions & 0 deletions
Large diffs are not rendered by default.

tools/aapt/AaptAssets.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,6 +1837,49 @@ String8 AaptDir::getPrintableSource() const
18371837
// =========================================================================
18381838
// =========================================================================
18391839

1840+
status_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols)
1841+
{
1842+
status_t err = NO_ERROR;
1843+
size_t N = javaSymbols->mSymbols.size();
1844+
for (size_t i=0; i<N; i++) {
1845+
const String8& name = javaSymbols->mSymbols.keyAt(i);
1846+
const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i);
1847+
ssize_t pos = mSymbols.indexOfKey(name);
1848+
if (pos < 0) {
1849+
entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string());
1850+
err = UNKNOWN_ERROR;
1851+
continue;
1852+
}
1853+
//printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n",
1854+
// i, N, name.string(), entry.isJavaSymbol ? 1 : 0);
1855+
mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol;
1856+
}
1857+
1858+
N = javaSymbols->mNestedSymbols.size();
1859+
for (size_t i=0; i<N; i++) {
1860+
const String8& name = javaSymbols->mNestedSymbols.keyAt(i);
1861+
const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i);
1862+
ssize_t pos = mNestedSymbols.indexOfKey(name);
1863+
if (pos < 0) {
1864+
SourcePos pos;
1865+
pos.error("Java symbol dir %s not defined\n", name.string());
1866+
err = UNKNOWN_ERROR;
1867+
continue;
1868+
}
1869+
//printf("**** applying java symbols in dir %s\n", name.string());
1870+
status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols);
1871+
if (myerr != NO_ERROR) {
1872+
err = myerr;
1873+
}
1874+
}
1875+
1876+
return err;
1877+
}
1878+
1879+
// =========================================================================
1880+
// =========================================================================
1881+
// =========================================================================
1882+
18401883
AaptAssets::AaptAssets()
18411884
: AaptDir(String8(), String8()),
18421885
mChanged(false), mHaveIncludedAssets(false), mRes(NULL)
@@ -2404,6 +2447,48 @@ sp<AaptSymbols> AaptAssets::getSymbolsFor(const String8& name)
24042447
return sym;
24052448
}
24062449

2450+
sp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name)
2451+
{
2452+
sp<AaptSymbols> sym = mJavaSymbols.valueFor(name);
2453+
if (sym == NULL) {
2454+
sym = new AaptSymbols();
2455+
mJavaSymbols.add(name, sym);
2456+
}
2457+
return sym;
2458+
}
2459+
2460+
status_t AaptAssets::applyJavaSymbols()
2461+
{
2462+
size_t N = mJavaSymbols.size();
2463+
for (size_t i=0; i<N; i++) {
2464+
const String8& name = mJavaSymbols.keyAt(i);
2465+
const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i);
2466+
ssize_t pos = mSymbols.indexOfKey(name);
2467+
if (pos < 0) {
2468+
SourcePos pos;
2469+
pos.error("Java symbol dir %s not defined\n", name.string());
2470+
return UNKNOWN_ERROR;
2471+
}
2472+
//printf("**** applying java symbols in dir %s\n", name.string());
2473+
status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols);
2474+
if (err != NO_ERROR) {
2475+
return err;
2476+
}
2477+
}
2478+
2479+
return NO_ERROR;
2480+
}
2481+
2482+
bool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const {
2483+
//printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n",
2484+
// sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0,
2485+
// sym.isJavaSymbol ? 1 : 0);
2486+
if (!mHavePrivateSymbols) return true;
2487+
if (sym.isPublic) return true;
2488+
if (includePrivate && sym.isJavaSymbol) return true;
2489+
return false;
2490+
}
2491+
24072492
status_t AaptAssets::buildIncludedResources(Bundle* bundle)
24082493
{
24092494
if (!mHaveIncludedAssets) {

tools/aapt/AaptAssets.h

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -315,23 +315,24 @@ class AaptSymbolEntry
315315
{
316316
public:
317317
AaptSymbolEntry()
318-
: isPublic(false), typeCode(TYPE_UNKNOWN)
318+
: isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
319319
{
320320
}
321321
AaptSymbolEntry(const String8& _name)
322-
: name(_name), isPublic(false), typeCode(TYPE_UNKNOWN)
322+
: name(_name), isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
323323
{
324324
}
325325
AaptSymbolEntry(const AaptSymbolEntry& o)
326326
: name(o.name), sourcePos(o.sourcePos), isPublic(o.isPublic)
327-
, comment(o.comment), typeComment(o.typeComment)
327+
, isJavaSymbol(o.isJavaSymbol), comment(o.comment), typeComment(o.typeComment)
328328
, typeCode(o.typeCode), int32Val(o.int32Val), stringVal(o.stringVal)
329329
{
330330
}
331331
AaptSymbolEntry operator=(const AaptSymbolEntry& o)
332332
{
333333
sourcePos = o.sourcePos;
334334
isPublic = o.isPublic;
335+
isJavaSymbol = o.isJavaSymbol;
335336
comment = o.comment;
336337
typeComment = o.typeComment;
337338
typeCode = o.typeCode;
@@ -344,6 +345,7 @@ class AaptSymbolEntry
344345

345346
SourcePos sourcePos;
346347
bool isPublic;
348+
bool isJavaSymbol;
347349

348350
String16 comment;
349351
String16 typeComment;
@@ -401,6 +403,15 @@ class AaptSymbols : public RefBase
401403
return NO_ERROR;
402404
}
403405

406+
status_t makeSymbolJavaSymbol(const String8& name, const SourcePos& pos) {
407+
if (!check_valid_symbol_name(name, pos, "symbol")) {
408+
return BAD_VALUE;
409+
}
410+
AaptSymbolEntry& sym = edit_symbol(name, &pos);
411+
sym.isJavaSymbol = true;
412+
return NO_ERROR;
413+
}
414+
404415
void appendComment(const String8& name, const String16& comment, const SourcePos& pos) {
405416
if (comment.size() <= 0) {
406417
return;
@@ -441,6 +452,8 @@ class AaptSymbols : public RefBase
441452
return sym;
442453
}
443454

455+
status_t applyJavaSymbols(const sp<AaptSymbols>& javaSymbols);
456+
444457
const KeyedVector<String8, AaptSymbolEntry>& getSymbols() const
445458
{ return mSymbols; }
446459
const DefaultKeyedVector<String8, sp<AaptSymbols> >& getNestedSymbols() const
@@ -509,7 +522,11 @@ class AaptAssets : public AaptDir
509522
virtual ~AaptAssets() { delete mRes; }
510523

511524
const String8& getPackage() const { return mPackage; }
512-
void setPackage(const String8& package) { mPackage = package; mSymbolsPrivatePackage = package; }
525+
void setPackage(const String8& package) {
526+
mPackage = package;
527+
mSymbolsPrivatePackage = package;
528+
mHavePrivateSymbols = false;
529+
}
513530

514531
const SortedVector<AaptGroupEntry>& getGroupEntries() const;
515532

@@ -532,11 +549,22 @@ class AaptAssets : public AaptDir
532549

533550
sp<AaptSymbols> getSymbolsFor(const String8& name);
534551

552+
sp<AaptSymbols> getJavaSymbolsFor(const String8& name);
553+
554+
status_t applyJavaSymbols();
555+
535556
const DefaultKeyedVector<String8, sp<AaptSymbols> >& getSymbols() const { return mSymbols; }
536557

537558
String8 getSymbolsPrivatePackage() const { return mSymbolsPrivatePackage; }
538-
void setSymbolsPrivatePackage(const String8& pkg) { mSymbolsPrivatePackage = pkg; }
539-
559+
void setSymbolsPrivatePackage(const String8& pkg) {
560+
mSymbolsPrivatePackage = pkg;
561+
mHavePrivateSymbols = mSymbolsPrivatePackage != mPackage;
562+
}
563+
564+
bool havePrivateSymbols() const { return mHavePrivateSymbols; }
565+
566+
bool isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const;
567+
540568
status_t buildIncludedResources(Bundle* bundle);
541569
status_t addIncludedResources(const sp<AaptFile>& file);
542570
const ResTable& getIncludedResources() const;
@@ -576,7 +604,9 @@ class AaptAssets : public AaptDir
576604
String8 mPackage;
577605
SortedVector<AaptGroupEntry> mGroupEntries;
578606
DefaultKeyedVector<String8, sp<AaptSymbols> > mSymbols;
607+
DefaultKeyedVector<String8, sp<AaptSymbols> > mJavaSymbols;
579608
String8 mSymbolsPrivatePackage;
609+
bool mHavePrivateSymbols;
580610

581611
Vector<sp<AaptDir> > mResDirs;
582612

tools/aapt/Command.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1617,6 +1617,12 @@ int doPackage(Bundle* bundle)
16171617
goto bail;
16181618
}
16191619

1620+
// Update symbols with information about which ones are needed as Java symbols.
1621+
assets->applyJavaSymbols();
1622+
if (SourcePos::hasErrors()) {
1623+
goto bail;
1624+
}
1625+
16201626
// If we've been asked to generate a dependency file, do that here
16211627
if (bundle->getGenDependencies()) {
16221628
// If this is the packaging step, generate the dependency file next to
@@ -1638,7 +1644,7 @@ int doPackage(Bundle* bundle)
16381644
}
16391645

16401646
// Write out R.java constants
1641-
if (assets->getPackage() == assets->getSymbolsPrivatePackage()) {
1647+
if (!assets->havePrivateSymbols()) {
16421648
if (bundle->getCustomPackage() == NULL) {
16431649
// Write the R.java file into the appropriate class directory
16441650
// e.g. gen/com/foo/app/R.java

tools/aapt/Resource.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,7 +1808,7 @@ static status_t writeSymbolClass(
18081808
if (sym.typeCode != AaptSymbolEntry::TYPE_INT32) {
18091809
continue;
18101810
}
1811-
if (!includePrivate && !sym.isPublic) {
1811+
if (!assets->isJavaSymbol(sym, includePrivate)) {
18121812
continue;
18131813
}
18141814
String16 name(sym.name);
@@ -1864,7 +1864,7 @@ static status_t writeSymbolClass(
18641864
if (sym.typeCode != AaptSymbolEntry::TYPE_STRING) {
18651865
continue;
18661866
}
1867-
if (!includePrivate && !sym.isPublic) {
1867+
if (!assets->isJavaSymbol(sym, includePrivate)) {
18681868
continue;
18691869
}
18701870
String16 name(sym.name);
@@ -1976,7 +1976,8 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
19761976
"\n"
19771977
"package %s;\n\n", package.string());
19781978

1979-
status_t err = writeSymbolClass(fp, assets, includePrivate, symbols, className, 0, bundle->getNonConstantId());
1979+
status_t err = writeSymbolClass(fp, assets, includePrivate, symbols,
1980+
className, 0, bundle->getNonConstantId());
19801981
if (err != NO_ERROR) {
19811982
return err;
19821983
}

tools/aapt/ResourceTable.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,7 @@ status_t compileResourceFile(Bundle* bundle,
753753
const String16 public16("public");
754754
const String16 public_padding16("public-padding");
755755
const String16 private_symbols16("private-symbols");
756+
const String16 java_symbol16("java-symbol");
756757
const String16 add_resource16("add-resource");
757758
const String16 skip16("skip");
758759
const String16 eat_comment16("eat-comment");
@@ -1058,6 +1059,49 @@ status_t compileResourceFile(Bundle* bundle,
10581059
}
10591060
continue;
10601061

1062+
} else if (strcmp16(block.getElementName(&len), java_symbol16.string()) == 0) {
1063+
SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());
1064+
1065+
String16 type;
1066+
ssize_t typeIdx = block.indexOfAttribute(NULL, "type");
1067+
if (typeIdx < 0) {
1068+
srcPos.error("A 'type' attribute is required for <public>\n");
1069+
hasErrors = localHasErrors = true;
1070+
}
1071+
type = String16(block.getAttributeStringValue(typeIdx, &len));
1072+
1073+
String16 name;
1074+
ssize_t nameIdx = block.indexOfAttribute(NULL, "name");
1075+
if (nameIdx < 0) {
1076+
srcPos.error("A 'name' attribute is required for <public>\n");
1077+
hasErrors = localHasErrors = true;
1078+
}
1079+
name = String16(block.getAttributeStringValue(nameIdx, &len));
1080+
1081+
sp<AaptSymbols> symbols = assets->getJavaSymbolsFor(String8("R"));
1082+
if (symbols != NULL) {
1083+
symbols = symbols->addNestedSymbol(String8(type), srcPos);
1084+
}
1085+
if (symbols != NULL) {
1086+
symbols->makeSymbolJavaSymbol(String8(name), srcPos);
1087+
String16 comment(
1088+
block.getComment(&len) ? block.getComment(&len) : nulStr);
1089+
symbols->appendComment(String8(name), comment, srcPos);
1090+
} else {
1091+
srcPos.error("Unable to create symbols!\n");
1092+
hasErrors = localHasErrors = true;
1093+
}
1094+
1095+
while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
1096+
if (code == ResXMLTree::END_TAG) {
1097+
if (strcmp16(block.getElementName(&len), java_symbol16.string()) == 0) {
1098+
break;
1099+
}
1100+
}
1101+
}
1102+
continue;
1103+
1104+
10611105
} else if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) {
10621106
SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());
10631107

0 commit comments

Comments
 (0)