監聽Android CTS測試項解決方案(二)
二,監聽當前測試項是否是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 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()){ }