NOMO.asia

아주 간단한 Nox App Player 안드로이드 매크로 만들기

Nox App Player 에서 자체적으로 지원하는 매크로 기능이 있지만, 내가 원하는 순간에 동작하는 매크로를 직접 만들 수는 없을까? Nox App Player 를 내가 직접 짠 코드와 연동시켜 안드로이드에 동작/명령을 내리려면 어떻게 해야할까? 예를 들어 'Twitch Play 모바일 게임'을 만들고자 한다면? 시중에 녹스 앱플레이어용 매크로로 나온 것들이 몇가지 있고 잘 동작하기는 하지만, 내가 직접 짠 코드와 연동시키기는 쉽지 않다는 단점이 있었다.

내 경우 안드로이드 디버그 브릿지(adb) 를 사용하여 'adb shell command' 로 가능한 수준에서 아주 쉽게 기능을 구현할 수 있었다. (단, 일부 게임에서는 adb 송수신을 감지하므로 adb 로 구현한 매크로 사용을 피해야 한다.)

프로그래밍 언어별로 adb 와 직접 연결할 수 있는 많은 라이브러리가 있지만, 나는 특정 좌표를 터치하거나 버튼을 누르는 등의 몇가지 간단한 동작만을 구현하면 되었기 때문에 굳이 이런 라이브러리까지 사용해야 할 필요는 없었다. CMD 창을 실행시키고 녹스가 설치된 폴더 내의 bin 폴더로 이동한 뒤 'adb shell ~~~' 과 같이 adb shell 커맨드를 입력하면 원하는 명령을 실행시킬 수 있는데, 이 동작을 코드에서 하도록 하면 되었다.

간단 예시

녹스에서 ROOT 권한과 개발자 옵션 내 USB 디버깅 기능을 활성화하고 아래의 코드를 녹스가 실행된 PC 에서 실행시키면 된다. 아래의 코드는 NodeJs Language 를 사용한 경우로, 안드로이드 화면 내 x y 인 위치를 터치하도록 하는 예시이다.

const child_process = require('child_process');
var adb = child_process.spawn(`adb.exe`, ["shell", "input", "tap", x, y], {cwd:"D:\\Program Files\\Nox\\bin"});
adb.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
adb.stderr.on('data', function(data) {
    console.error('Error: ' + data);
    if(data.toString().indexOf("no devices/emulators found") !== -1){
        console.error("It seems that Nox is not running, or the Nox ROOT permissions or USB debugging settings are not properly set.");
    }
});
// adb.on('exit', function(code) {
//     console.log('exit: ' + code);
// });
// adb.on('close', function (code) {
//     console.log('child process exited with code ' + code);
// });

매번 프로세스가 실행되고 종료되므로 exit 과 close 에 해당하는 메시지가 실행된다. 따라서 주석처리 해두었다.

더욱 자세한 내용은 child_process, child_process.spawn, adb shell commands, adb shell input keyevent, adb shell tap 등으로 검색해보면 된다.

Python 등의 다른 프로그래밍 언어에서도 CMD 명령어를 코드 내에서 실행시킬 수 있는 방법이 있으니 이를 활용하면 될 것이다.