二,监听当前测试项是否是Accelerometer Measurement Test测试项
通过第一种方式介绍的,我们可以得到当前处于活动状态的Activity类似监听CTS测试当前的测试项。但是由于是监听Android系统中所有Activity,因此会大大降低系统的性能,因此这里有一种效率更高的方式来精确定位当前CTS正在测试的测试项,而不会对系统造成很大的影响。(当然不能修改CTS源码,我们需要使用Android提供的原生CTS APK进行验证)
那么我们这里以Accelerometer Measurement Test测试为了来进一步分析代码。
第一步:寻找CTS Verifier工具调用Framework或者底层获取数据的函数
(AccelerometerMeasurementTestActivity.java)onRun()-->verifyMeasurements()-->(VerifyMeasurementsOperation.java)execute()-->doWork()-->(SensorManagerTestVerifier.java)mSensor.collectEvents(100)
public TestSensorEvent[] collectEvents(int eventCount, String debugInfo) { this.registerListener(debugInfo); TestSensorEvent[] events = this.getEvents(eventCount, debugInfo); this.unregisterListener(); return events; }
public void registerListener(String debugInfo) { boolean result = mSensorManager.registerListener( mEventListener, mSensorUnderTest, mSamplingRateInUs, mReportLatencyInUs); String message = SensorCtsHelper.formatAssertionMessage( "registerListener", mSensorUnderTest, debugInfo); Assert.assertTrue(message, result); }
从上面的代码中我们可以发现,在进行测试的时候会注册和取消一个监听器,而通过对这个监听器的追踪发现,监听器是在SensroManager中注册的,而SensorManager是一个抽象类,而在系统中实现SensorManager的类只有SystemSensorManager.java,在该类中也只有
protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags)被重写,因此也就是说所有的CTS 测试都会经过这里,因此如果我们能够在这里得到当前处于活动状态下的应用程序并通过Sensor中的TYPE来判断进行的测试项来精确定位,当前CTS正进行测试的测试项。
具体实现方式:
private boolean isAcclerometerMeasurementTest(){ if(mAppContextImpl == null) { return false; } final ActivityManager am = (ActivityManager)mAppContextImpl.getSystemService(Context.ACTIVITY_SERVICE); if(am == null) { return false; } List<RunningAppProcessInfo> list = am.getRunningAppProcesses(); if ((list!=null) && (list.size() != 0)) { RunningAppProcessInfo topRunningProcess = list.get(0); if((topRunningProcess !=null) && (topRunningProcess.processName !=null) && topRunningProcess.processName.equals("com.android.cts.verifier")){ if(isAcclerometerMeasurementFocus() == 1) { return true; } } } return false; }
if((sensor != null)&&(sensor.getType()==Sensor.TYPE_ACCELEROMETER) && isAcclerometerMeasurementTest()){ }