aapt2 c packages/apps/Calendar/res/values/strings.xml -o 111
1解析路径 生成路径信息 包括source(文件路径), dir(去掉后缀的文件名 如value-zh-rCN 解析完成后为value) , name(文件名 不带后缀)
extension(文件后缀),extension(文件夹的属性信息 value-zh-rCN 为 zh-rCN )
config 解析好的属性信息(18个维度 地区分辨率等)
2 遍历路径信息 如果发现上边的dir为value则解析value
3解析
如果是字符串:如果没有span,怎讲原字符串放入常量池,如果有span则将去除标签的数据添加到常量池,
常量池分为两部分
1
IndexStrings 一个multimap
key代表字符串值,value代表一个字符串项,包含的信息有便宜,字符串值,引用等
2 styles表示带有span的资源 如<string><b>aaa</b></string>
是一个list类型,元素类型是
styleEntry
该实体包含的信息有指向的indexstring中的实体指针,span信息
1 解析路径信息 生成 vector<ResourcePathData>
ResourcePathData 包含的信息见数据类型小结1
2 创建zipFileWriter 获取dirWrite,当指定编译资源为文件夹时创建zip,否则dir
3 遍历ResourcePathData的集合,编译各资源,包括values,xml,png 9.png和rwa
(1)分析编译values
1 创建生成文件名称 resourceDir-configStr_name.extension.flat
例如 values-rh-zCN/string.xml ----> values-rh-zCN_string.arsc.flat
2 compileTable
打开文件
3 parseResources
4 解析数据并以ParsedResource表示
ParsedResource 数据类型见数据类型小结2
5 parseResource
1 类型是item
需要解析出type. format
2 解析具体数据
如果 type = "id"
设置类型为kId, name 为解析出的name, value= Id
如果type = bool color dimen drawable fraction integer string类型
如果类型是string 执行parseString
1 是否有format 属性
2 是否有 translatable 属性
3 执行aprserXml 赋值 name
4 给string 或者styledString 设置是否有转换表(用于多语言)
如果不是string 执行aprserXml
执行aprserXml
1 压平子树 解析style(代表每个span的位置,和原始字符串) 和 string(代表去处span的原始字符串)
StyledString 包含信息见数据类型:4
如果包含span 则添加字符串到ResourceTable的stringPool
2 parseItemForAttribute()
1 tryParseReference 解析引用类型
如果是引用类型 返回引用且设置该资源是否为private
属性引用
如果是id类型 包含+id 则创建id
3 string类型插入常量池 其他类型返回Item
3 解析bag类型
6 创建package
7 序列化到输出文件
数据类型:
1 ResourcePathData:
Source source:
path 路径
line 没用
string resourceDir: 不包含配置信息的路径 如 value-zh-rCN 得到的值是value
string name:文件名 如string.xml,得到的值是string
string extension:文件扩展名,如string.xml,得到的值是xml
string configStr: 原始的文件夹属性,如如 value-zh-rCN 得到的值是zh-rCN
ConfigDescription config: 解析的18个维度属性信息
2 ParsedResource
ResourceName name;
ConfigDescription config; 指向 ResourcePathData的 config,十八个维度的属性信息
std::string product; product 信息
Source source; ResourcePathData::source 加下行信息
ResourceId id;
Maybe<SymbolState> symbolState;
std::u16string comment; 前边的注释内容
std::unique_ptr<Value> value;
std::list<ParsedResource> childResources;
3 ResourceName
std::u16string package; 包名 如framework-res为android
ResourceType type; 类型 包括string id
std::u16string entry; 名字 如<string name="xxx"> 该值为xxx
4 StyleString
std::u16string str; 原始字符串
std::vector<Span> spans; 包含span的类型 如 加粗b ,在str中的开始结束为止