Merge changes I507f8573,I6d9efe2e into sc-v2-dev

* changes:
  [res] Finalize resources in SC-v2 RESTRICT AUTOMERGE
  [aapt2] Fix finalized resources removal
This commit is contained in:
Yurii Zubrytskyi
2021-10-27 23:04:26 +00:00
committed by Android (Google) Code Review
5 changed files with 61 additions and 89 deletions

View File

@@ -1298,7 +1298,7 @@ package android {
field public static final int shortcutLongLabel = 16844074; // 0x101052a
field public static final int shortcutShortLabel = 16844073; // 0x1010529
field public static final int shouldDisableView = 16843246; // 0x10101ee
field public static final int shouldUseDefaultUnfoldTransition;
field public static final int shouldUseDefaultUnfoldTransition = 16844364; // 0x101064c
field public static final int showAsAction = 16843481; // 0x10102d9
field public static final int showDefault = 16843258; // 0x10101fa
field public static final int showDividers = 16843561; // 0x1010329
@@ -2014,9 +2014,9 @@ package android {
public static final class R.id {
ctor public R.id();
field public static final int accessibilityActionContextClick = 16908348; // 0x102003c
field public static final int accessibilityActionDragCancel;
field public static final int accessibilityActionDragDrop;
field public static final int accessibilityActionDragStart;
field public static final int accessibilityActionDragCancel = 16908375; // 0x1020057
field public static final int accessibilityActionDragDrop = 16908374; // 0x1020056
field public static final int accessibilityActionDragStart = 16908373; // 0x1020055
field public static final int accessibilityActionHideTooltip = 16908357; // 0x1020045
field public static final int accessibilityActionImeEnter = 16908372; // 0x1020054
field public static final int accessibilityActionMoveWindow = 16908354; // 0x1020042

View File

@@ -1235,7 +1235,6 @@
<public type="attr" name="author" id="0x010102b4" />
<public type="attr" name="autoStart" id="0x010102b5" />
<!-- ===============================================================
Resources added in version 8 of the platform (Eclair MR2).
=============================================================== -->
@@ -3202,89 +3201,23 @@
<!-- ===============================================================
Resources added in version S-V2 of the platform
NOTE: add <public> elements within a <staging-public-group> like so:
<staging-public-group type="attr" first-id="0x01ff0000">
<public name="exampleAttr1" />
<public name="exampleAttr2" />
</staging-public-group>
To add a new <staging-public-group> block, find the id value for the
last <staging-public-group> block defined for thie API level, and
subtract 0x00010000 from it to get to the id of the new block.
For example, if the block closest to the end of this file has an id of
0x01ee0000, the id of the new block should be 0x01ed0000
(0x01ee0000 - 0x00010000 = 0x01ed0000).
=============================================================== -->
<eat-comment />
<staging-public-group type="attr" first-id="0x01ff0000">
<staging-public-group-final type="attr" first-id="0x01ff0000">
<public name="shouldUseDefaultUnfoldTransition" />
</staging-public-group>
</staging-public-group-final>
<staging-public-group type="id" first-id="0x01fe0000">
<public type="attr" name="shouldUseDefaultUnfoldTransition" id="0x0101064c" />
<staging-public-group-final type="id" first-id="0x01fe0000">
<public name="accessibilityActionDragStart" />
<public name="accessibilityActionDragDrop" />
<public name="accessibilityActionDragCancel" />
</staging-public-group>
</staging-public-group-final>
<staging-public-group type="style" first-id="0x01fd0000">
</staging-public-group>
<staging-public-group type="string" first-id="0x01fc0000">
</staging-public-group>
<staging-public-group type="dimen" first-id="0x01fb0000">
</staging-public-group>
<staging-public-group type="color" first-id="0x01fa0000">
</staging-public-group>
<staging-public-group type="array" first-id="0x01f90000">
</staging-public-group>
<staging-public-group type="drawable" first-id="0x01f80000">
</staging-public-group>
<staging-public-group type="layout" first-id="0x01f70000">
</staging-public-group>
<staging-public-group type="anim" first-id="0x01f60000">
</staging-public-group>
<staging-public-group type="animator" first-id="0x01f50000">
</staging-public-group>
<staging-public-group type="interpolator" first-id="0x01f40000">
</staging-public-group>
<staging-public-group type="mipmap" first-id="0x01f30000">
</staging-public-group>
<staging-public-group type="integer" first-id="0x01f20000">
</staging-public-group>
<staging-public-group type="transition" first-id="0x01f10000">
</staging-public-group>
<staging-public-group type="raw" first-id="0x01f00000">
</staging-public-group>
<staging-public-group type="bool" first-id="0x01ef0000">
</staging-public-group>
<staging-public-group type="fraction" first-id="0x01ee0000">
</staging-public-group>
<!-- ===============================================================
DO NOT ADD UN-GROUPED ITEMS HERE
Any new items (attrs, styles, ids, etc.) *must* be added in a
staging-public-group block, as the preceding comment explains.
Items added outside of a group may have their value recalculated
every time something new is added to this file.
=============================================================== -->
<public type="id" name="accessibilityActionDragStart" id="0x01020055" />
<public type="id" name="accessibilityActionDragDrop" id="0x01020056" />
<public type="id" name="accessibilityActionDragCancel" id="0x01020057" />
</resources>

View File

@@ -120,6 +120,13 @@ bool BinaryResourceParser::Parse() {
static_cast<int>(parser.chunk()->type)));
}
}
if (!staged_entries_to_remove_.empty()) {
diag_->Error(DiagMessage(source_) << "didn't find " << staged_entries_to_remove_.size()
<< " original staged resources");
return false;
}
return true;
}
@@ -393,6 +400,12 @@ bool BinaryResourceParser::ParseType(const ResourceTablePackage* package,
return false;
}
if (const auto to_remove_it = staged_entries_to_remove_.find({name, res_id});
to_remove_it != staged_entries_to_remove_.end()) {
staged_entries_to_remove_.erase(to_remove_it);
continue;
}
NewResourceBuilder res_builder(name);
res_builder.SetValue(std::move(resource_value), config)
.SetId(res_id, OnIdConflict::CREATE_ENTRY)
@@ -533,9 +546,8 @@ bool BinaryResourceParser::ParseStagedAliases(const ResChunk_header* chunk) {
// Since a the finalized resource entry is cloned and added to the resource table under the
// staged resource id, remove the cloned resource entry from the table.
if (!table_->RemoveResource(resource_name, staged_id)) {
diag_->Error(DiagMessage(source_) << "failed to find resource entry for staged "
<< " resource ID " << staged_id);
return false;
// If we haven't seen this resource yet let's add a record to skip it when parsing.
staged_entries_to_remove_.insert({resource_name, staged_id});
}
}
return true;

View File

@@ -119,6 +119,10 @@ class BinaryResourceParser {
// A mapping of resource ID to type spec flags.
std::unordered_map<ResourceId, uint32_t> entry_type_spec_flags_;
// A collection of staged resources that got finalized already and we're supposed to prune -
// but the original staged resource record hasn't been parsed yet.
std::set<std::pair<ResourceName, ResourceId>> staged_entries_to_remove_;
};
} // namespace aapt

View File

@@ -17,6 +17,7 @@
"""
Finalize resource values in <staging-public-group> tags
and convert those to <staging-public-group-final>
Usage: finalize_res.py core/res/res/values/public.xml public_finalized.xml
"""
@@ -24,18 +25,40 @@ Usage: finalize_res.py core/res/res/values/public.xml public_finalized.xml
import re, sys, codecs
def finalize_item(raw):
global _type, _id
_id += 1
return '<public type="%s" name="%s" id="%s" />' % (_type, raw.group(1), '0x{0:0{1}x}'.format(_id-1,8))
global _type_ids, _type
id = _type_ids[_type]
_type_ids[_type] += 1
name = raw.group(1)
val = '<public type="%s" name="%s" id="%s" />' % (_type, name, '0x{0:0{1}x}'.format(id,8))
if re.match(r'_*removed.+', name):
val = '<!-- ' + val.replace('<public', '< public') + ' -->'
return val
def finalize_group(raw):
global _type, _id
global _type_ids, _type
_type = raw.group(1)
_id = int(raw.group(2), 16)
return re.sub(r'<public name="(.+?)" */>', finalize_item, raw.group(3))
id = int(raw.group(2), 16)
_type_ids[_type] = _type_ids.get(_type, id)
(res, count) = re.subn(r' {0,2}<public name="(.+?)" */>', finalize_item, raw.group(3))
if count > 0:
res = raw.group(0).replace("staging-public-group", "staging-public-group-final") + '\n' + res
return res
def collect_ids(raw):
global _type_ids
for m in re.finditer(r'<public type="(.+?)" name=".+?" id="(.+?)" />', raw):
type = m.group(1)
id = int(m.group(2), 16)
_type_ids[type] = max(id + 1, _type_ids.get(type, 0))
with open(sys.argv[1]) as f:
global _type_ids, _type
_type_ids = {}
raw = f.read()
collect_ids(raw)
raw = re.sub(r'<staging-public-group type="(.+?)" first-id="(.+?)">(.+?)</staging-public-group>', finalize_group, raw, flags=re.DOTALL)
raw = re.sub(r' *\n', '\n', raw)
raw = re.sub(r'\n{3,}', '\n\n', raw)
with open(sys.argv[2], "w") as f:
f.write(raw)