上一篇 - 如何覆盖 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 的


↙↙↙阅读原文可查看相关链接,并与作者交流