1. 화면 조작 (스크린샷을 찍기 위한)
1-1. 화면 조작과 관련된 명령어
- 스크린샷: screencap
- 스크린 레코딩: screenrecord
- 화면 회전: settings put system user_rotation
- 해상도 변경: wm size
- DPI 변경: wm density
- 화면 켜기/끄기: input keyevent KEYCODE_POWER
- 터치 입력: input tap
- 스크롤: input swipe
- 키 이벤트: input keyevent
- 앱 실행: monkey
더 자세한 명령어는 아래 링크로
https://developer.android.com/tools/adb?hl=ko#shellcommands
1-2. 앱 실행후 스크린샷을 찍을 곳으로 이동
탭
adb input [<touchscreen>] <tap> <x> <y>
private void tabScreen(String deviceId, int x, int y) throws IOException, InterruptedException {
ProcessBuilder processBuilder = new ProcessBuilder("adb", "-s", deviceId, "shell", "input", "touchscreen", "tap", String.valueOf(x), String.valueOf(y));
Process process = processBuilder.start();
// 명령어 결과 읽기
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
Thread.sleep(1000);
}
- 탭 실행 후 생길 수 있는 렉을 고려하여 Thread.sleep(1000) 1초 설정
스와이프
adb input [<touchscreen>] <swipe> <x1> <y1> <x2> <y2>
private static final String[] SWIPE_COORDINATE = {"300", "800", "300", "549"}; // startX, startY, endX, endY
private void swipeScreen(String deviceId) throws IOException, InterruptedException {
ProcessBuilder processBuilder = new ProcessBuilder("adb", "-s", deviceId, "shell", "input", "swipe",
SWIPE_COORDINATE[0], SWIPE_COORDINATE[1], SWIPE_COORDINATE[2], SWIPE_COORDINATE[3]);
Process process = processBuilder.start();
// 명령어 결과 읽기
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
Thread.sleep(1000);
}
- 한 화면씩 내리기 위한 좌표값 지정
2. 화면 캡쳐 및 저장
2-1. 화면 캡쳐 및 디바이스에 저장
screencap filename
private static void takeScreen() throws IOException {
//현재 시간 기준 파일명 생성
String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String fileName = DEVICE_DIRECTORY + timestamp + ".png";
//화면 캡쳐후 저장
ProcessBuilder processBuilder = new ProcessBuilder("adb", "shell", "screencap", "-p", fileName);
Process process = processBuilder.start();
log.info(fileName + " 저장");
// 명령어 결과 읽기
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
- 파일을 캡쳐한 순서대로 나열될 수 있도록 현재 날짜를 기준으로 파일명 생성함.
2-2. 파일을 저장할 로컬 디렉토리 확인 및 생성
private static void createDirectoryIfNotExists(String directory) {
Path path = Paths.get(directory);
if (Files.notExists(path)) {
try {
Files.createDirectories(path); // 모든 중간 디렉토리도 함께 생성
log.info("디렉토리가 생성되었습니다: " + directory);
} catch (IOException e) {
log.info("디렉토리 생성 실패: " + e.getMessage());
}
} else {
log.info("디렉토리가 이미 존재합니다: " + directory);
}
}
2-3. 로컬에 파일 저장 및 디바이스 파일 삭제
private static void pullScreenshotsAndDelete() throws IOException, InterruptedException {
//현재 날짜 기준 로컬 디렉터리명 생성
String timestamp = new SimpleDateFormat("yyyyMMdd").format(new Date());
String localTimestampDirectory = LOCAL_DIRECTORY + timestamp;
createDirectoryIfNotExists(localTimestampDirectory);
//ADB 쉘에서 PNG 파일 목록 가져오기
ProcessBuilder listBuilder = new ProcessBuilder("adb", "shell", "ls", DEVICE_DIRECTORY + "*.png");
Process listProcess = listBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(listProcess.getInputStream()));
String filePath;
// 파일 목록을 읽어 각 파일을 로컬로 복사
while ((filePath = reader.readLine()) != null) {
String trimmedFilePath = filePath.trim();
// 각 PNG 파일을 로컬로 복사
ProcessBuilder pullBuilder = new ProcessBuilder("adb", "pull", trimmedFilePath, localTimestampDirectory);
Process pullProcess = pullBuilder.start();
// 명령어 결과 읽기
BufferedReader pullReader = new BufferedReader(new InputStreamReader(pullProcess.getInputStream()));
String line;
while ((line = pullReader.readLine()) != null) {
log.info(line); // 로그로 출력
}
try {
pullProcess.waitFor(); // 복사 완료 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
//파일 삭제
ProcessBuilder deleteBuilder = new ProcessBuilder("adb", "shell", "rm", trimmedFilePath);
Process deleteProcess = deleteBuilder.start();
deleteProcess.waitFor();
}
- 현재 날짜로 로컬디렉토리 생성
- 디바이스의 파일을 로컬에 저장하기 위해 해당 파일의 경로를 가져온다.
- 가져온 파일 경로로 adb pull을 한다.
- 가져온 파일은 삭제한다.
- 파일 복사를 바로 못하는 이유
- adb pull DEVICE_DIRECTORY, localDirectory를 하면 디렉토리 자체를 가져와버림.
- adb pull은 shell 명령어가 아니기 때문에 와일드카드를 사용할 수 없음.
- adb shell ls 는 * 와일드 카드 사용 가능함
'Backend > 프로젝트' 카테고리의 다른 글
갈아만든 임원 - 5 데이터 추출하기2 OpenCV 설치 (1) | 2024.09.25 |
---|---|
갈아만든 임원 - 4 데이터 추출하기 (Tesseract OCR) (0) | 2024.09.23 |
갈아만든 임원 - 2 앱플레이어로 게임 실행하기 (1) | 2024.09.18 |
갈아만든 임원 - 1 (0) | 2024.09.17 |
04/24 팀프로젝트 일지 (0) | 2023.04.24 |