일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Three(Two) Tone Shading
- working set
- 메모리 누수
- Private Bytes
- ASW(Application SpaceWarp)
- VR
- 게임 수학
- 3d
- 가상 바이트
- Toon Shader
- OculusMotionVectorPass
- Cell Shader
- Specular
- AppSW
- ColorGradingLutPass
- 개인 바이트
- 프로그래밍 기초
- 작업 집합
- Windows Build
- Virtual Byte
- Cell Look
- C언어
- Cartoon Rendering
- Rim Light
- URP로 변경
- URP
- 벡터
- Today
- Total
WinCNT
CMD와 ADB로 유니티의 apk를 빌드하고 VR기기에서 실행해보기 본문
서론
이번 작업은 Github Actions을 통한 테스트 자동화의 사전 준비라는 느낌이다
물론 테스트 자동화라고 해도 딱히 거창한 것은 아니고, 이번에 할 것은 특히 더 그렇다
아무튼 이번에는 CMD(Command Prompt), 정확히는 bat파일로 오큘러스2의 VR기기를 여러 모로 조작하는 것이 목표일 뿐!
그를 위해서는 ADB(Android Device Bridge)를 사용할 필요가 있다는 것을 알게 되었고, 조사와 시행착오를 통해 알게 된 내용을 정리하고자 한다
adb.exe가 있는 폴더로 이동하자!
adb.exe는 자주 사용할 것이기 때문에 아예 처음부터 adb.exe가 있는 폴더로 이동하기로 했다
(물론 환경 변수 등을 설정했다면 딱히 필요 없겠지만)
다음은 예제이다
@echo off
@REM adb.exe가 있는 폴더의 경로
set "ADB_DIR=C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\SDK\\platform-tools\\"
@REM 폴더 이동(같은 드라이버에 있는 경우)
cd %ADB_DIR%
접속된 VR(Android)기기가 있는지 체크하기!
접속된 VR기기가 있는지 체크하고, 없는 경우에는 종료하는 처리가 필요했다
adb.exe가 있는 폴더로 이동했기 때문에 adb의 devices 커맨드를 사용해서 체크해봤다
다음은 예제 코드이다
@REM adb devices의 결과를 체크하기 위해 설정
setlocal enabledelayedexpansion
@REM adb devices로 접속된 VR(Android)기기가 있는지 체크
echo -Check Android Device Connected
for /f "tokens=*" %%a in ('adb devices') do (
@REM adb devices의 결과를 카운터하기 위한 변수
set /a cnt += 1
@REM adb devices의 결과를 1줄씩 읽는다
set "line=%%a"
@REM 헤더(List of devices attached)는 스킵
if not "!line:~0,4!"=="List" (
echo !line! | findstr /C:"device" > nul
@REM 접속된 VR(Android)기기가 없으면 처리를 종료한다
if !errorlevel! equ 0 (
echo -Android Devices Connected!
) else (
echo -No Android Devices Connected
pause
exit 0
)
)
)
@REM adb devices의 결과가 1줄(즉, 헤더)뿐일 경우에도 처리를 종료한다
if !cnt! == 1 (
echo -No Android Devices Connected
pause
exit 0
)
adb의 devices 커맨드의 결과를 for문으로 1줄씩 체크해서, 1줄(헤더)만 있거나 device로 분류된 결과가 없는 경우에는 처리를 종료하는 코드이다
참고로 setlocal enabledelayedexpansion는 원래는 bat파일 시작 시에 정의되는 (환경)변수를, 동적인 상태에 정의할 수 있게 해주는 설정이다
%대신에 !를 써야한다거나 하는 사용법 등이나 주의점들이 있지만, 이 글에서는 자세한 내용은 생략하고자 한다
apk를 빌드하는 메소드를 커맨드로 실행하기!
apk 파일 빌드는 이미 만들어둔 메소드를 실행하는 방법을 택했다(즉, 이 부분은 adb와 관계 없음)
메소드의 내용에 대해서는 이 글에선 다루지 않지만, 잘 구현했다면 다음과 같이 실행만 해주면 된다
@echo off
REM 생략...
echo Start APK Build!
"C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Unity.exe" -batchmode -quit -logfile "로그 파일 패스(디렉토리 + 파일명)" -projectPath "실행할 프로젝트의 디렉토리" -executeMethod ExCI.ExBuild
APK 파일을 Install하자!
이제부터는 VR기기가 접속된 상태를 전제로 진행하려고 한다
우선 빌드한 APK 파일을 adb.exe를 이용해서 VR기기에 인스톨해보자
adb의 install 커맨드를 사용하면 된다!
다음은 샘플 코드!
@echo off
REM 윗부분 생략...
echo Install APK File!
adb install -g "C:\\Users\\...빌드한 apk 파일의 경로...\\Application.apk"
참고로 -g는 앱의 Manifest에 나열된 모든 권한을 부여하는 옵션이다
이번 테스트 자동화 작업에는 스크린샷을 캡처해서 저장하는 처리가 있어서 권한이 필요했다
인스톨한 App을 실행해보자!
App의 실행은 조금 어려웠다
Start라는 커맨드를 쓰면 되지만 거기에 값으로 앱의 Activity를 설정해야 한다고 한다
다행히 그 방법은 다음의 참고 사이트에서 찾을 수 있었다
이 부분은 bat 파일에 넣을 생각은 없기에 그냥 CMD로 찾았다
우선 apk가 인스톨된 상태에서 다음의 커맨드를 입력한다
adb shell pm list packages -f
그러면 VR기기에 설치된 패키지 목록이 좌르륵 표시된다
package:/data/app/~~DZP5NCTVxFk7pKJiXB26xg==/com.oculus.avatareditor-4bw5vNlLvlVIY857IuC1YQ==/base.apk=com.oculus.avatareditor
package:/system/priv-app/OSUpdater/OSUpdater.apk=com.oculus.updater
…생략…
…생략…
그 목록에서 인스톨한 패키지의 Name 찾으면 된다
(오큘러스2에서는 간단하게 MQDH에 표시된 App를 찾아도 되긴 한 것 같다)
패키지의 Name을 찾았으면, 다음으로는 activity를 찾아보자
adb shell pm dump com.example.AppName
그러면 그 패키지의 상세 정보가 나오는데 거기서 android.intent.action.MAIN란 부분에 그럴 듯한 값이 있었다(다음은 예시)
DUMP OF SERVICE package:
Activity Resolver Table:
Non-Data Actions: android.intent.action.MAIN:
7634b9f com.example.AppName/com.unity3d.player.UnityPlayerActivity filter 24bd4ec
Action: "android.intent.action.MAIN"
필요한 것을 다 찾은 것 같으니 다음은 실행 뿐!
아래는 예제 코드지만, 비슷한 느낌의 커맨드를 설정하니 문제 없이 앱이 실행됐다!
@echo off
REM 생략...
echo Start Application!
adb shell am start -n com.example.AppName/com.unity3d.player.UnityPlayerActivity
App이 실행 중인지 체크하면서 대기하기…
테스트용으로 빌드한 것은 시작되면 일정 시간 동안 스크린샷을 찍고, 다 찍으면 종료되는 App이다
다시 말해 다음 작업 위해 APOpp이 종료되었는지 체크할 필요가 생겼다
이 부분은 adb를 이용한 App의 실행 체크와 ping을 이용해서 구현해봤다
@REM App의 종료를 기다리는 Loop처리
:LOOP
@REM 로컬 호스트(127.0.0.1)에 일정 시간 ping을 던지면서 대기한다
ping -n 10 127.0.0.1 > nul
@REM App이 실행 중인지를 adb로 체크
adb shell ps | findstr com.example.AppName > nul
if errorlevel 1 (
@REM App이 종료되었다면 Loop를 탈출한다
echo -Application is not Running!
goto :END
)
@REM App이 실행 중이라면 Loop한다
echo -Application is Running!
goto :LOOP
:END
@REM 다음 처리 실행!
캡처한 스크린샷을 복사해오기!
테스트용으로 빌드한 App은 캡처한 스크린샷을 VR기기의 특정 폴더에 저장한다
그 저장된 스크린샷을 adb를 사용해서 데스크탑으로 가져오는 스크립트는 다음과 같다
echo -Copy Screenshots Image!
adb pull /sdcard/Oculus/Screenshots/Runner "C:\\Users\\user\\Desktop\\"
VR(Android)기기의 파일 삭제하기
마무리로 스크린샷이 저장된 폴더를 삭제하는 스크립트를 추가했다
echo -Delete Screenshots Image!
adb shell rm -r /sdcard/Oculus/Screenshots/Runner
마무리
이것으로 CMD와 ADB를 이용해서 이것저것 실행하는 스크립트 작성은 끝났다…
일단 사수가 시킨 거라 하긴 했는데 이걸 Github Actions에 어떻게 적용해야하는지는 아직 전혀 모르겠다
참고 사이트
Android Debug Bridge(adb) | Android デベロッパー | Android Developers
Android Debug Bridge(adb) | Android デベロッパー | Android Developers
[윈도우] 배치파일 문법 setlocal EnableDelayedExpansion 사용하기
SetLocal EnableDelayedExpansionの罠とその回避方法 - Qiita
'Unity > Unity 관련' 카테고리의 다른 글
Unity에서 커스텀 ShaderGUI를 구현해보자! 그 첫번째 (0) | 2023.10.11 |
---|---|
CMD와 ADB로 만들었던 스크립트를 PowerShell로 바꿔보자! (0) | 2023.10.10 |
유니티에서 안드로이드 기기에 연결되어 있으면 Build And Run, 그렇지 않으면 Build만 하는 스크립트 만들어보기 (0) | 2023.09.21 |
윈도우의 CMD(Command Prompt)로 Unity의 Editor 스크립트의 메소드 실행하기! (0) | 2023.09.15 |
유니티에서 빌드 직전, 직후에 실행되는 스크립트 작성하기!! (0) | 2023.08.25 |