一、device_features 使用方法
1、获取 device_features 中的配置 ( 路径:miui/cust/device_features )
其目录结构如下:
├── feature_manager -> …/…/build/tools/feature_tools.py
├── readme.txt
├── released
│ └── device_features
└── unreleased
[说明]
(1)feature_manager:是添加 feature 的工具,使用 excel 的方式为每个机型添加 feature,进入 miui/cust/device_features 目录下,执行:./feature_manager命令。
(2) readme.txt:使用 feature_manager 的说明。
(3) released/device_features:该目录存放已经发布机型的 features 文件,最终编译至 package/apps/MiuiSystemSdk 的assets/device_features目录中。
(4) unreleased:该目录存放未分布机型的 features 文件,为了防止通过反编译获取这些机型的信息,最终编译至/system/etc/ 目录中。
注意:其中,features 文件( .xml 配置文件)的名字,就是系统属性的 ro.product.device 的值。
该配置文件所支持的格式如下:
<1> <string name="string_key">abc</string>
<2> <bool name="bool_key">true|false</bool>
<3> <integer name="integer_key">123</integer>
<4> <string-array name="string-array_key"> <item>string1</item> <item>string2</item> ... </string-array>
<5> <integer-array name="integer-array_key"> <item>1</item> <item>2</item> ... </integer-array>
2、通过 FeatureParser.getXXX() 方法获取 ( miui/frameworks/base/library/core/java/miui/util/FeatureParser.java )
各类型获取方式对应如下:
xml文件列表 | 获取方法 |
---|---|
<bool name="bool_key">true/false</bool> | boolean value = FeatureParser.getBoolean(“bool_key”,true/false); |
<integer name="integer_key">123</integer> | int value = FeatureParser.getInteger(“integer_key”,-1); |
– | – |
<integer-array name="integer-array_key"> <item>1</item> <item>2</item> ... </integer-array> | int[] intArr = FeatureParser.getIntArray(“integer-array_key”); |
<string name="string_key">abc</string> | String value = FeatureParser.getString(“string_key”); |
– | – |
<string-array name="string-array_key"> <item>string1</item> <item>string2</item> .... </string-array> | String[] strArr = FeatureParser.getStringArray(“string-array_key”); |
注意:boolean 和 int 类型的属性可设默认值,当所要查找的feature不存在,返回默认值。其他类型查找不到指定 feature 时,返回 null。
另外还提供了 FeatureParser. hasFeature(String name, int type) 方法,来判断指定类型的指定属性是否存在,type的取值有:
<1> FeatureParser.TYPE_BOOL
<2> FeatureParser.TYPE_INTEGER
<3> FeatureParser.TYPE_STRING
<4> FeatureParser.TYPE_STRING_ARRAY
<5> FeatureParser.TYPE_INTEGER_ARRAY
示例:
在 MiuiPackageManagerService.java 中通过<bool name="support_fm">true</bool>
,判断是否安装收音机 app:
if (!FeatureParser.getBoolean("support_fm", true)) {
sIgnoreApks.add("/system/app/FM.apk");
}
二、辅助工具
由于机型越来越多,每次添加一个 feature 都会很麻烦,为此,所以建议使用 feature_manager 工具,可以轻松地为每个机型添加 feature,而且还能使 feature 文件格式和 feature 顺序保持一致,使用步骤如下:
1、进入 miui/cust/device_features目录下,执行 ./feature_manager 命令
若出现错误,可在 feature_manager 文件中修改,添加参数:cell_overwrite_ok=True
2、运行脚本后,会根据所有机型的 .xml文件,生成一个excel文件,如图:
3、添加或修改 feature,对于 string-array 和 integer-array 类型,多个值,用空格隔开:
则在 .xml 文件中会生成如下内容:
完成修改添加之后,保存并关闭 excel文件,则完成改动。
( 注意:若改动量较小,还是直接在指定的 xml 文件中更好一点,避免出现各种问题。)