# Arsc 编辑

MT 提供了 Arsc 编辑器Arsc 编辑器++ 来修改 arsc 文件,这两个功能在设计风格上完全不同。

alt

  • Arsc 编辑器 使用简单,容易上手,可以满足大部分的需求,但是在大批量修改、主题编辑、导入导出等方面较为无力,自由度较低。
  • Arsc 编辑器++ 是 VIP 功能,它将 arsc 文件反编译为多个 xml 文件进行编辑,格式与源代码几乎一致,非常适合有 Android 开发经验的用户,而且因为完全使用文本形式来编辑,在修改自由度上非常高。

# Arsc 层次结构

Arsc 的结构从外层到内层依次是:

  • 包(Package)
  • 类型(Type)
  • 配置(Config)
  • 条目(Entry)
  • 值(Value)

# Arsc 编辑器

# 包(Package)

一般一个 arsc 文件只有一个包,进入 Arsc 编辑器后,在 ID 搜索资源下面的项就是该文件的包。

alt

# 类型(Type)

进入包之后,看到的列表就是类型,其中最左边是包 ID + 类型 ID ,例如 7F01,紧接着的是类型名称,例如 attr、string、style 等。

alt

至于各个类型分别代表什么意思,其实只要你做过 Android 开发,就会发现它和你在 res 目录中定义的资源基本一致。例如 strings.xml 中的字符串数据都可以在 string 类型里面找到,在 drawable 中放置的图片也可以在 drawable 类型里面找到,不过 drawable 类型里面存储的是图片的路径。

# 配置(Config)

进入类型之后,看到的列表就是配置。

alt

所谓配置,就是一个资源在不同环境下对应不同的数据,例如你在 string 类型中就可能看 string、string-zh-rCN 等配置,不带后缀表示默认配置,-zh-rCN 后缀表示简体中文,所以 string-zh-rCN 中的资源会在简体中文环境下使用。

同个类型下的配置,它们的条目数量不一定完全一致。在上面例子中,当应用要使用一个 string 资源时,会先给定一个资源 ID,系统会根据这个 ID 优先在 -zh-rCN 配置中寻找,如果找不到,那么系统就会去默认配置中寻找,如果都找不到呢?那肯定就会报错了。

更多资料请查看官方文档 (opens new window)

# 条目(Entry)

进入配置之后,看到的列表就是条目,其中最左边是条目 ID ,例如 0000,紧接着的是资源名称,还可能显示资源值。

一个完整的资源 ID 是包 ID + 类型 ID + 条目 ID 组成的,例如 7F010000

alt

# 值(Value)

上图中,你点击任意条目后是不会进入值列表的,而是直接编辑它的值。

alt

只有那些存在零或多个值的复杂(Complex)条目,点击后会进入值列表。一般在 attr、style、array、plurals 类型中的都是复杂条目,而其它类型中的基本都是简单条目。

你可以返回后进入一个 style 类型的配置,点击里面的任意条目,就可以进入它的值列表了。

alt

编辑复杂(Complex)条目推荐使用Arsc 编辑器++,会更加直观~

# 添加配置

添加配置的方式有两种:

  1. 长按已有的配置,在弹出菜单种点击复制,然后输入新的配置名,新添加的配置会自动把被复制的配置的所有条目全部复制过去。
  2. 在配置列表中,点击右上角菜单中的添加,然后输入新的配置名,完成后会增加一个没有任何条目的新配置。

例如当你为一个应用添加简体中文语言包时,你可以长按复制 string 类型的默认配置,输入 -zh-rCN 然后保存,此时该配置下的文字还不是中文的,然后你还需要使用 Arsc 翻译模式把 -zh-rCN 下的文字翻译成中文。

# 添加条目

在条目列表中,点击右上角菜单中的添加,然后 MT 会自动从其它配置中查找那些条目是当前配置还没有的,并显示出来。

alt

选择相应的配置,然后就可以直接导入其中的条目了。或者你也可以手动新建条目,当其它配置中没有可导入的条目时,也会直接显示新建界面。

alt

Arsc 编辑器其它的操作很简单,这里不多做说明,只需要通过点击、长按、右上角菜单,你就能发现各个功能。

# Arsc 编辑器++

VIP 功能

进入 Arsc 编辑器++ 后,所有的 包(Package)、类型(Type)、配置(Config) 会以树状结构展示:

alt

  • 最外层的文件夹代表 包(Package),并且包含一个 package-info 文件用于配置该包的相关信息;
  • 第二层的文件夹代表 类型(Type),并且包含一个 type-info 文件用于配置该类型的相关信息;
  • 第三层的文件主要是各个 配置(Config) 的资源数据文件,其内部包含了多个 条目(Entry) 以及它的 值(Value)

# package-info

package-info 文件中主要配置了这个包的 id 和 name:

alt

大部分情况下 APP 只有一个包,它的 id 是 0x7f,name 是它的包名。

如果你要修改包名,只需要修改这里的 name,无需考虑主界面对应文件夹的名称。

某些 arsc 文件的 package-info 文件中还包含了 library、overlay、stagedAlias 数据,主要见于系统的 arsc 文件,一般我们不会去修改这些数据。

# type-info

type-info 文件中主要配置了这个类型的 id,以及这个类型中所有 条目(Entry) 的 id 和 name:

alt

注意,这边的条目 ID 只有后 4 位是有效的,前面提到过,一个完整的资源 ID 是包 ID + 类型 ID + 条目 ID 组成的,而包 ID类型 ID 已经在 package-info 和 type-info 中定义,因此这里的条目 ID 只取后四位,前四位不会影响它的真实 ID。

这边之所以要使用八位 ID,主要是为了方便进行代码搜索或者文本复制。

该类型下所有的条目必须先在 type-info 文件中定义其 id 和 name,然后才可以在资源数据文件中定义。

例如,必须先在 string/type-info 中定义:

<entry id="0x7f0f0000" name="abc"/>

然后你才可以在string/string-zh-rCN 中定义:

<string name="abc">文本内容</string>

否则将会报错提示你找不到 "abc" 的 id。

# 资源数据文件

资源数据文件名以类型名称开头,后面跟随一个配置后缀,例如 string-zh-rCN,关于配置后缀可点击这里回顾上文。

资源数据文件的内容格式与源代码基本一致,如果你有 Android 开发经验将会感到十分熟悉。

alt

# 工程说明

Arsc 编辑器++ 和 Dex 编辑器++ 一样都支持保存为工程,具体可以看 Dex 编辑中的相关介绍