从代码模块的结构上很容易知道 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