아주 간단한 Nox App Player 안드로이드 매크로 기능 구현해보기 (NodeJs, adb shell 활용)
아주 간단한 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 명령어를 코드 내에서 실행시킬 수 있는 방법이 있으니 이를 활용하면 될 것이다.