monkey测试关机/重启问题分析(二)

12 篇文章 6 订阅
11 篇文章 5 订阅

systemui关机dialog相关

1、systemui下拉关机按钮
通过Android 布局分析工具发现
请添加图片描述
请添加图片描述

按钮布局
base/packages/SystemUI/res-keyguard/layout/footer_actions.xml
按钮初始化和点击事件
frameworks/base/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt

private val powerMenuLite: View = view.findViewById(R.id.pm_lite)
...
powerMenuLite.setOnClickListener(onClickListener)
...
    private val onClickListener = View.OnClickListener { v ->
        // Don't do anything if the tap looks suspicious.
        if (!visible || falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
            return@OnClickListener
        }
        if (v === settingsButtonContainer) {
            if (!deviceProvisionedController.isCurrentUserSetup) {
                // If user isn't setup just unlock the device and dump them back at SUW.
                activityStarter.postQSRunnableDismissingKeyguard {}
                return@OnClickListener
            }
            metricsLogger.action(MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH)
            startSettingsActivity()
        } else if (v === powerMenuLite) {
            uiEventLogger.log(GlobalActionsDialogLite.GlobalActionsEvent.GA_OPEN_QS)
            globalActionsDialog?.showOrHideDialog(false, true, v)
        }
    }

GlobalActionsDialogLite
globalActionsDialog?.showOrHideDialog(false, true, v)
到这里,就定位到按钮点击跳出关机dialog的地方
2、GlobalActionsDialogLite
frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
showOrHideDialog

    public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned,
            @Nullable View view) {
        mKeyguardShowing = keyguardShowing;
        mDeviceProvisioned = isDeviceProvisioned;
        if (mDialog != null && mDialog.isShowing()) {
            // In order to force global actions to hide on the same affordance press, we must
            // register a call to onGlobalActionsShown() first to prevent the default actions
            // menu from showing. This will be followed by a subsequent call to
            // onGlobalActionsHidden() on dismiss()
            mWindowManagerFuncs.onGlobalActionsShown();
            mDialog.dismiss();
            mDialog = null;
        } else {
            handleShow(view);
        }
    }

3、点击事件
从代码看,这是一个adapter适配器

        public void onClickItem(int position) {
            Action item = mAdapter.getItem(position);
            if (!(item instanceof SilentModeTriStateAction)) {
                if (mDialog != null) {
                    // don't dismiss the dialog if we're opening the power options menu
                    if (!(item instanceof PowerOptionsAction)) {
                        // Usually clicking an item shuts down the phone, locks, or starts an
                        // activity. We don't want to animate back into the power button when that
                        // happens, so we disable the dialog animation before dismissing.
                        mDialogLaunchAnimator.disableAllCurrentDialogsExitAnimations();
                        mDialog.dismiss();
                    }
                } else {
                    Log.w(TAG, "Action clicked while mDialog is null.");
                }
                item.onPress();
            }
        }

4、item.onPress()
GlobalActionsDialogLite内部有很多内部类,继承实现了onPress接口,对应真正的点击事件。

关机按钮的实现类如下

    @VisibleForTesting
    final class ShutDownAction extends SinglePressAction implements LongPressAction {
        ShutDownAction() {
            super(R.drawable.ic_lock_power_off,
                    R.string.global_action_power_off);
        }
        ...
        ...
        @Override
        public void onPress() {
            mUiEventLogger.log(GlobalActionsEvent.GA_SHUTDOWN_PRESS);
            // shutdown by making sure radio and power are handled accordingly.
            mWindowManagerFuncs.shutdown();
        }
    }

5、GlobalActionsComponent
frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java

    @Override
    public void shutdown() {
        /*Skip Monkey Test*/
        if (ActivityManager.isUserAMonkey()) {
            Log.d(TAG, "Cannot shut down during monkey test");
            return;
        }
        /* @} */
        try {
            mBarService.shutdown();
        } catch (RemoteException e) {
        }
    }

mBarService.shutdown();最终走到frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Monkey测试是一种随机化的测试方法,通常用于测试应用程序的稳定性和兼容性。它会在应用程序中随机生成触摸、滑动、按键等事件,以模拟用户的操作。如果应用程序不能正确处理这些事件,就会导致程序崩溃或出现其他异常情况。 下面是一般的monkey测试报错流程: 1. 生成随机事件:Monkey测试工具会生成随机的触摸、滑动、按键等事件,以模拟用户的操作。 2. 执行随机事件:应用程序会接收到这些随机事件,并进行相应处理。 3. 检查应用程序的响应:Monkey测试工具会检查应用程序的响应,包括界面响应、功能是否正常等。 4. 记录错误:如果应用程序出现了异常情况,Monkey测试工具会记录错误信息并输出日志。 5. 分析错误:测试人员会根据错误信息和日志,分析问题的原因。 6. 修复错误:开发人员根据测试人员提供的错误信息,修复应用程序中的问题。 7. 再次测试:修复后的应用程序会再次进行Monkey测试,以确认问题是否已经解决。 根据上述流程,如果应用程序不能正确地处理随机事件,就会导致程序崩溃或出现其他异常情况。在这种情况下,Monkey测试工具会记录错误信息并输出日志,测试人员根据错误信息和日志,分析问题的原因,开发人员再根据测试人员提供的错误信息,修复应用程序中的问题。最后,修复后的应用程序会再次进行Monkey测试,以确认问题是否已经解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值