Macaca [基于 Node.js 的自动化测试-Macaca] - Android 设备如何自动解锁

达峰的夏天 · 2016年05月25日 · 最后由 达峰的夏天 回复于 2016年06月27日 · 3073 次阅读

上一篇 - 如何覆盖 React Native 功能测试

从代码模块的结构上很容易知道 macaca-android 依赖了一个名叫 unlock-apk 的模块。

下面我们看下这其中的实现原理

安装时编译

unlock-apk 中包含了解锁的 Android 代码实现,同时模块在其摘要描述文件中制定了如下脚本字段。

"scripts": {
  "install": "node ./script/build.js"
}

这里的含义是告诉包管理器在安装快结束的时候需要执行 node ./script/build.js 这行命令。

// script/build.js
var path = require('path');
var antBuild = require('ant-build');

antBuild({
  cwd: path.join(__dirname, '..')
}).then(function(d) {
  console.log(d); 
}).catch(function(e) {
  setTimeout(function() {
    console.log(e);
    throw e;
  });
});

核心实现

可以看出我们实际上是在用 Apache Ant 对 Java 源码打包,并生成 apk 文件,apk 被装入设备后,然后通过唤起 activity 即可执行解锁功能。


package xdf.android_unlock;

import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // add flag to current window
        Window window = this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

        // init KeyguardManager

        KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);

        if (keyguardManager.inKeyguardRestrictedInputMode()) {
            KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock(getLocalClassName());
            keyguardLock.disableKeyguard();
        }

        // wake up screen light
        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "");
        wakeLock.acquire();

        // finish current activity
        finish();
    }

}

如何调用

在 Macaca 的 Android 驱动模块中可以看见如下的方法封装,目的是使用 am start -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000 -n ${pkg}/${activity} 唤起装入的 apk。

启迪?

解锁,点亮屏幕都是非常简单而常用的功能,上述的方式也是比较中规中矩的做法,只不过 Macaca 将这些繁琐的工作集成了起来,为其带来了方便。Android 的开发和测试还会遇到很多问题,例如 Android 设备长时间执行导致变慢,同样可以类似做法回收设备资源。

看了本文你愿意自己尝试实现个小功能,那就很不错啦!

欢迎讨论,互相学习。

微博: http://weibo.com/xudafeng
Github: https://github.com/xudafeng

下一篇 - Macaca 是如何封装 ADB 的

共收到 8 条回复 时间 点赞

这个跟 appium 的 unlock 是同一个 apk 吗

今天还在讨论 macaca, 在想是不是 appium 可以作为前端, macaca 作为后端合并下. 让 appium 支持 macaca.

@seveniruby 可以啊,能使用任何 w3c 标准的 client 与 Macaca 配合使用啊 ,Macaca 实现了跨平台的 webdriver server

请教一下,am 命令中的-f 后面的数字是怎么来的?

@carl 一句话表述不清楚,稍等我写个文章,贴给你

达峰的夏天 [该话题已被删除] 中提及了此贴 06月27日 11:17
达峰的夏天 [该话题已被删除] 中提及了此贴 06月27日 11:17
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册