aapt2编译字符串

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中的开始结束为止




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值