1.目的和意义
目的一:我们预备在系统中内置自己开发的性能评测APK工具,并通过一个SDM系统属性值来进行控制其编译的开关。因此,想先评估一下通过系统属性值控制,会不会对系统的使用造成太大影响。
目的二:系统内获取和设置属性是一个常见的方法,在Settings、Wifi等等模块中有大量使用。但是我们目前并未有属性调用对系统性能影响的评估。通过此次测试评估,能够使我们对这方面的知识有一个精确的认识和把握,有利于今后的性能问题分析。
总之,对于我们把控影响系统的因素,排除这一方面对性能问题带来的影响产生有益帮助。
2.评测环境
手机:项目XX proto
软件版本:v4B1Q-3
系统版本:Android 4.4.2
3.评测方法
3.1第三方应用调用系统公开属性
我们首先编写了一个PropertiesHelper.apk,用来模拟第三方应用对系统公开属性的调用。在这里,我们通过调用系统屏幕亮度的属性值来进行测试。
获取属性的代码:
int mGetPropResult = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS);
设置属性的代码:
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 5f;
……
getWindow().setAttributes(params);
我们获得以下测试数据(10000次均值,单位:ms):
我们得出结论:
- 第三方应用Get属性值的速度调幅较大,性能不稳定;
- 第三方应用Get属性值一次的平均时间为0.187ms;
- 第三方应用Set属性值一次的平均时间为0.093ms。
3.2系统应用调用系统内部属性
因为系统内部属性并不对外开放,而且获取属性的方法为@hide隐藏型,因此,要测试这部分内容,必须在系统源码环境下进行。
我们首先分析获取系统内部属性的方法,主要为:
SystemProperties.get();
SystemProperties.getInt();
SystemProperties.getBoolean();
SystemProperties.getLong();
设置系统属性的方法,主要为:
SystemProperties.set();
这些方法,全都是由SystemProperties.java (frameworks\base\core\java\android\os)进行定义的。
我们可以在这些种类的属性时加入我们自己的统计代码,打印log,进而得到相关评测数据。为了评测的准确和方便,我在Settings中集成了PropertiesCalculatorSettings的功能,具体实现不详细讲了,核心方法如下。
获取属性的代码:
// get:
mSvn = SystemProperties.get("ro.def.software.svn");
// getInt:
mGuestMode = SystemProperties.getInt("persist.security.guestmode", 0);
// getBoolean:
mResult = SystemProperties.getBoolean("ro.settings.seprate", true);
// getLong:
mEcmTimeOut = SystemProperties.getLong("ro.cdma.ecmexittimer", 300000);
设置属性的代码:
// set:
SystemProperties.set("persist.sys.headset_mode", "2");
我们获得以下数据(10000次均值,单位:ms):
我们得出结论:
- Set一次平均耗时1.796ms;
- Get(String)耗时要高于其他类型(int/boolean/long);
- Get(String)一次平均耗时0.013ms;
- Get(int/boolean/long)一次平均耗时0.007ms;
- Set耗时要高于Get。
4.结论
我们可以通过SDM系统定制属性来控制性能评测工具的集成。
在系统级内置应用中,应该尽量避免频繁设置系统属性值。这个操作我们平时并不经常进行,因此,只要留意和知悉即可。
5.延伸讨论
除了获取系统属性,我们在源码中还经常进行的一项操作是对系统资源的获取和设置,常用的方法如下:
getResources().getBoolean();
getResources().getString();
getResources().getStringArray();
getResources().getInteger();
getResources().getDrawable();
getResources().getText();
对于这部分内容,未来纳入评估之中也将具有很大意义,可以抽时间来进一步研究。
报告详细数据,请见单独文章:
《系统属性调用评估表》
- eyelike@2015-01-28