前文见《Android 图标包的一些资料》。
这几天在 app 里发现个 bug,枚举出的图标包中的图标数量,比该图标包自己声称的还要多。了解了一下发现,又是一例用想当然的思路贪图抄近路省力气而挖下的坑。枚举图标不是去处理 appfilter.xml
而是处理了 drawable.xml
。
之前没有注意过后者,所以又查了一下。在一篇时间久远但言简意赅的文档里,确实明确提到了 drawable.xml
,说明此文件由来已久。顺便补充一下,不管是 appfilter.xml
还是 drawable.xml
,它们“应该”同时存在于两个位置,res/xml
下和 assets
下。
图标包是为启动器服务的,其中包含有未指定应用目标的图标是没有意义的,由此可知,表述了图标与其应用目标 app 的关系的 appfilter.xml
中应该已经将所有图标罗列完整,那 drawable.xml
的意义何在?
appfilter.xml
中的条目大致是这样,<item component="ComponentInfo{com.android.chrome/com.google.android.apps.chrome.Main}" drawable="ic_webbrowser"/>
。在实际中,可以找到若干个 component 对应于同一个 drawable 的用例。也就是说,一个图标包支持的 app 的数量可能会大于其中包含的图标的数量。很明显,正如同名字本身就已经指示出的那样,appfilter.xml
其实并不是对图标的收录信息,而是对 app 的收录信息。
但图标包通常是一个含有展示自己所囊括图标的简易 app。在出现多个 app 指向共同的图标的情况下,不应该在展示的时候向用户呈现出这种图表的重复使用情况。从这个角度而言,每个图标本身需要有属于自己的描述信息。这就是 drawable.xml
可以来解决的了。在 drawable.xml
中的条目类似这样,<item drawable="ic_webbrowser" name="浏览器" />
。每个 item
都可能处于一个类似于 <category title="系统">
这样的节点之内,以用于区分其类别。显然地,item
的 drawable
属性与 appfilter.xml
中 item
的 drawable
属性存在字面上的对应关系。
事实上,当意识到 drawable.xml
的历史如此久远时,我唯恐它还有另一个作用。这是 Android 平台之前存在的一个名为 drawables.xml
(注意其中 s
字母的存在)的文件给我的启发。在其中,item
节点并非是只有属性,而且可以有值,像这样:<item name="ic_webbrowser" type="drawable">@android:drawable/ic_web_browser</item>
。当然,如果 drawable.xml
(注意其中没有 s
字母)允许类似的“重定向”(通常出于某种可理解但无法完全明确定位的灵活性所考虑),那恐怕也已经被时间的流沙磨洗殆尽了。
补充一下。图标包模板之前见到过若干个,但是近期还在更新的不太多,在这儿放两个吧: