개인 정리용

LDPlayer controller (ldconsole.exe)

0xff 2024. 4. 22. 03:07

서론.

 

윈도우용 안드로이드 앱플레이어중에 개인적으로 가장 개발자 친화적으로 설계된건 LDPlayer가 아닐까 싶다.

직설적으로 말하면 매크로, 작업장 친화적이다.

 

LD (구 모모)는 별도의 컨트롤러를 제공하지 않는 Nox, Blustacks와 달리, 전용 컨트롤러가 존재한다.

 

ldconsole.exe 를 사용해서 대부분의 원하는 작업을 자동화 할 수 있다.

지원하는 명령어도 엄청나게 많다.

 

quit <--name mnq_name | --index mnq_idx>

quitall

launch <--name mnq_name | --index mnq_idx>

reboot <--name mnq_name | --index mnq_idx>

list

runninglist

isrunning <--name mnq_name | --index mnq_idx>

list2

add [--name <mnq_name>]

copy [--name <mnq_name>] --from <mnq_name | mnq_idx>

remove <--name mnq_name | --index mnq_idx>

rename [--name <mnq_name | --index mnq_idx>] --title <mnq_title>

modify <--name mnq_name | --index mnq_idx>
       [--resolution <w,h,dpi>]
       [--cpu <1 | 2 | 3 | 4>]
       [--memory <256 | 512 | 768 | 1024 | 1536 | 2048 | 4096 | 8192>]
       [--manufacturer asus]
       [--model ASUS_Z00DUO]
       [--pnumber 13800000000]
       [--imei <auto | 865166023949731>]
       [--imsi <auto | 460000000000000>]
       [--simserial <auto | 89860000000000000000>]
       [--androidid <auto | 0123456789abcdef>]
       [--mac <auto | 000000000000>]
       [--autorotate <1 | 0>
       [--lockwindow <1 | 0>

       [--root <1 | 0>

installapp <--name mnq_name | --index mnq_idx> --filename <apk_file_name>

installapp <--name mnq_name | --index mnq_idx> --packagename <apk_package_name>

uninstallapp <--name mnq_name | --index mnq_idx> --packagename <apk_package_name>

runapp <--name mnq_name | --index mnq_idx> --packagename <apk_package_name>

killapp <--name mnq_name | --index mnq_idx> --packagename <apk_package_name>

locate <--name mnq_name | --index mnq_idx> --LLI <Lng,Lat>

adb <--name mnq_name | --index mnq_idx> --command <cmd_str>

setprop <--name mnq_name | --index mnq_idx> --key <name> --value <val>

getprop <--name mnq_name | --index mnq_idx> [--key <name>]

downcpu <--name mnq_name | --index mnq_idx> --rate <0~100>

backup  <--name mnq_name | --index mnq_idx> --file <filepath>

restore <--name mnq_name | --index mnq_idx> --file <filepath>

action <--name mnq_name | --index mnq_idx> --key <name> --value <val>

scan  <--name mnq_name | --index mnq_idx> --file <filepath>

sortWnd

zoomIn

zoomOut

rock

pull  <--name mnq_name | --index mnq_idx> --remote <filepath> --local <filepath>

push  <--name mnq_name | --index mnq_idx> --remote <filepath> --local <filepath>

backupapp <--name mnq_name | --index mnq_idx> --packagename <apk_package_name> --file <filepath>

restoreapp <--name mnq_name | --index mnq_idx> --packagename <apk_package_name> --file <filepath>

globalsetting [--fps <0~60>] [--audio <1 | 0>] [--fastplay <1 | 0>] [--cleanmode <1 | 0>]

launchex <--name mnq_name | --index mnq_idx> --packagename <apk_package_name>

operatelist <--name mnq_name | --index mnq_idx>

operateinfo <--name mnq_name | --index mnq_idx> --file <filepath>

operaterecord <--name mnq_name | --index mnq_idx>  --content <jsonstring>

 

위 커맨드에 대한 대부분의 자세한 설명은 공식 블로그에서 확인이 가능하다.

 

하지만 이상하게도 list2 커맨드에 대한 설명이 없다.

실행중인 앱플레이어 리스트를 가져오거나 pid, handle을 손쉽게 가져오기 위해서 꼭 필요한데 말이다.

 

list2 커맨드를 실행하면 아래와 같은 포맷으로 출력된다.

0,instance-3,0,0,0,-1,-1,1280,720,240
1,test01,0,0,0,-1,-1,1280,720,240
2,test02,4401200,339166,1,72940,52688,720,1280,320

꽤나 다양한 정보를 넘겨준다는 점을 볼 수 있다.

 

이를 분석해서 정리해보자면 콤마 기준으로 이렇게 되어있다.

 

name description
ID LDPlayer index no
Name LDPlayer name
BaseProcess handle LDPlayerMainFrame (base memory region)
TheRenderer handle RenderWindow (screen)
status 0 = off, 1 = running, 2 = starting
dnplayer.exe PID  
VirtualBox PID  
Screen width  
Screen height  
DPI  

 

어플리케이션 메모리에 접근하기 위해서는 BaseProcess handle에 attach를,

스크린에 접근하기 위해서는 TheRenderer에 attach하면 된다.