系统属性调用评估报告

来源:互联网 发布:怎样安装t3软件 编辑:程序博客网 时间:2024/06/01 08:32

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):
这里写图片描述
我们得出结论:

  1. 第三方应用Get属性值的速度调幅较大,性能不稳定;
  2. 第三方应用Get属性值一次的平均时间为0.187ms;
  3. 第三方应用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
0 0