android设备出厂前 按键测试 快速实现-屏蔽Home,Power等键
android整机测试,需要测试按键。
一般的键好按,好测试。如:音量加+ ,音量- 。
但是,有些按键就不好测了。譬如:电源键(Power),Home键,Menu键,Back键,
以上按键,除了Back可以监听捕捉,其他按键都不好测。
还有特殊按键:F1,F2键。
需要找一个根本的解决方案。
只能从根本上解决这个问题。需要从源码入手。
当进入测试界面的时候,发送一个Intent告诉系统,开始进行按键测试。当离开界面的时候,告诉系统按键测试结束。
具体操作的代码在:
QSSI.13/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
public class PhoneWindowManager implements WindowManagerPolicy {
// register for multiuser-relevant broadcasts
filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
+ filter.addAction(CIT_TEST_ON);
+ filter.addAction(CIT_TEST_OFF);
context.registerReceiver(mMultiuserReceiver, filter);
mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
@@ -2795,6 +2797,35 @@ public class PhoneWindowManager implements WindowManagerPolicy {
+ repeatCount + " keyguardOn=" + keyguardOn + " canceled=" + canceled);
}
+ if (citTestIn) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_HOME:
+ sendBroadcastIntent(ACTION_HOME);
+ return key_consumed;
+ case KeyEvent.KEYCODE_MENU:
+ sendBroadcastIntent(ACTION_MENU);
+ return key_consumed;
+ case KeyEvent.KEYCODE_POWER:
+ sendBroadcastIntent(ACTION_POWER);
+ return key_consumed;
+ case KeyEvent.KEYCODE_BACK:
+ sendBroadcastIntent(ACTION_BACK);
+ return key_consumed;
+ case KeyEvent.KEYCODE_KEYF1:
+ sendBroadcastIntent(ACTION_F1);
+ if (DEBUG_INPUT) {
+ Slog.d(TAG, "###########KEYF1###########keyCode: " + keyCode);
+ }
+ return key_consumed;
+ case KeyEvent.KEYCODE_KEYF2:
+ sendBroadcastIntent(ACTION_F2);
+ if (DEBUG_INPUT) {
+ Slog.d(TAG, "###########KEYF2###########keyCode: " + keyCode);
+ }
+ return key_consumed;
+ }
+ }
+
if (mKeyCombinationManager.isKeyConsumed(event)) {
return key_consumed;
}
@@ -2857,6 +2888,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// Hijack modified menu keys for debugging features
final int chordBug = KeyEvent.META_SHIFT_ON;
+ if (citTestIn) {
+ sendBroadcastIntent(ACTION_MENU);
+ }
if (down && repeatCount == 0) {
if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {
Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
@@ -3773,6 +3807,39 @@ public class PhoneWindowManager implements WindowManagerPolicy {
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
|| event.isWakeKey();
+ int key_consumed = 0;
+ if (DEBUG_INPUT) {
+ Slog.d(TAG, "######################keyCode: " + keyCode);
+ }
+ if (citTestIn) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_HOME:
+ sendBroadcastIntent(ACTION_HOME);
+ return key_consumed;
+ case KeyEvent.KEYCODE_MENU:
+ case 187:
+ sendBroadcastIntent(ACTION_MENU);
+ return key_consumed;
+ case KeyEvent.KEYCODE_POWER:
+ sendBroadcastIntent(ACTION_POWER);
+ return key_consumed;
+ case KeyEvent.KEYCODE_BACK:
+ sendBroadcastIntent(ACTION_BACK);
+ return key_consumed;
+ case KeyEvent.KEYCODE_KEYF1:
+ sendBroadcastIntent(ACTION_F1);
+ if (DEBUG_INPUT) {
+ Slog.d(TAG, "###########KEYF1###########keyCode: " + keyCode);
+ }
+ return key_consumed;
+ case KeyEvent.KEYCODE_KEYF2:
+ sendBroadcastIntent(ACTION_F2);
+ if (DEBUG_INPUT) {
+ Slog.d(TAG, "###########KEYF2###########keyCode: " + keyCode);
+ }
+ return key_consumed;
+ }
+ }
if (!mSystemBooted) {
// If we have not yet booted, don't let key events do anything.
@@ -4592,6 +4659,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
};
+ private boolean citTestIn = false;
+ private String CIT_TEST_ON = "com.aaabbb.citteston";
+ private String CIT_TEST_OFF = "com.aaabbb.cittestoff";
+
+ private String ACTION_HOME = "com.aaabbb.home";
+ private String ACTION_BACK = "com.aaabbb.back";
+ private String ACTION_MENU = "com.aaabbb.menu";
+ private String ACTION_POWER = "com.aaabbb.power";
+ private String ACTION_F1 = "com.aaabbb.f1";
+ private String ACTION_F2 = "com.aaabbb.f2";
BroadcastReceiver mMultiuserReceiver = new BroadcastReceiver() {
@Override
@@ -4604,10 +4681,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mSettingsObserver.onChange(false);
mDefaultDisplayRotation.onUserSwitch();
mWindowManagerFuncs.onUserSwitched();
+ } else if (intent.getAction().equals(CIT_TEST_ON)) {
+ citTestIn = true;
+ } else if (intent.getAction().equals(CIT_TEST_OFF)) {
+ citTestIn = false;
}
}
};
+ private void sendBroadcastIntent(String action) {
+ Intent intent = new Intent(action);
+ mContext.sendBroadcast(intent);
+ }
+
// Called on the PowerManager's Notifier thread.
@Override
public void startedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason) {
测试App需要注册一个BroadcastReceiver ,来处理接受到的按键广播。
PhoneWindowManager 要2个地方都要修改,才能覆盖所有的按键要求。menu处理起来复杂些。