-- 추가 내용 09.26
앱 실행 명령어
adb shell monkey -p <packge.name> 1
따라서 5-1 과 같이 패키지의 액티비티를 가져오기 위해 dumpsys를 뒤질 필요가 없다.
1. ADB(Android Debug Bridge)란?
안드로이드 디버그 브릿지는 안드로이드 기반 기기들의 디버깅에 사용되는 프로그래밍 도구이다.
안드로이드 장치의 데몬은 USB나 TCP를 통해 호스트 PC의 서버에 연결하며, TCP를 통해 최종 사용자에 의해 사용되는 클라이언트에 연결된다.
2. ADB 및 앱플레이어 설치
https://developer.android.com/tools/releases/platform-tools?hl=ko
위의 링크를 통해 설치.
하지만 실제 안드로이드 기기가 필요하므로 아래의 앱플레이어로 대체하겠다.
3. 앱 플레이어와 ADB 연동
https://kr.ldplayer.net/blog/725.html
4. ADB Shell 기본 명령어
연결된 디바이스 확인
adb divices
디바이스 재시작
adb -s <deviceId> shell reboot
설치된 패키지 확인
adb -s <deviceId> shell pm list package
앱 실행하기
abd -s <deviceId> shell am start -n <package.name>/<com.package.name.ActivityName>
더 자세한 명령어는 아래 링크로
https://developer.android.com/tools/adb?hl=ko#shellcommands
5. 앱 실행하기
abs -s <deviceId> shell am start -n <package.name>/<com.package.name.ActivityName>
앱을 실행하려면 패키지 이름과 액티비티 이름을 알아야한다.
5-1. 패키지명을 가져온다.
adb -s <deviceId> shell pm list package
실행결과
5-2. 액티비티 이름을 ADB를 통해 가져오는 방법은 2가지다.
- 현재 해당 앱이 샐행중일 때
adb -s <deviceId> shell "dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'"
결과
- 실행되지 않을 때
adb -s <deviceId> shell dumpsys package | findstr <package> | findstr "MainActivity"
결과
앱이 실행되지 않은 상태로 가정한 코드
private String getPackageAndActivity(String deviceId) throws IOException {
String packageName = "";
String activityName = "";
// 디바이스에 설치된 패키지 조회
ProcessBuilder processBuilder = new ProcessBuilder("adb", "-s", deviceId, "shell", "pm", "list", "package");
Process process = processBuilder.start();
// 명령어 결과 읽기
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("package:com.lilithgames.rok.gpkr")) {
//패키지명
packageName = line.replace("package:", "").trim(); // 패키지명만 추출
log.info("packageName = " + packageName);
break;
}
}
// 액티비티명 가져오기
if (!packageName.isEmpty()) {
// dumpsys 명령어
processBuilder = new ProcessBuilder("adb", "-s", deviceId, "shell", "dumpsys", "package", packageName);
process = processBuilder.start();
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = reader.readLine()) != null) {
if (line.contains("MainActivity")) {
int lastSlashIndex = line.lastIndexOf('/');
int filterIndex = line.indexOf("filter");
activityName = line.substring(lastSlashIndex + 1, filterIndex).trim(); //액티비티명만 추출
log.info("activityName = " + activityName);
break;
}
}
}
return packageName + "/" + activityName;
}
실행
private void startApp(String deviceId, String packageAndActivity) throws IOException, InterruptedException {
ProcessBuilder processBuilder = new ProcessBuilder("adb", "-s", deviceId, "shell", "am", "start", "-n", packageAndActivity);
Process process = processBuilder.start();
log.info("실행");
// 명령어 결과 읽기
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
log.info("실행");
//프로세스 종료 대기
process.waitFor();
}
추가 --
앱 실행여부 확인
private boolean checkRunningNow(String deviceId) throws IOException {
boolean isRunningNow = false;
// 현재 실행중인 프로세스 확인
ProcessBuilder processBuilder = new ProcessBuilder("adb", "-s", deviceId, "shell", "ps");
Process process = processBuilder.start();
// 명령어 결과 읽기
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
if (line.contains(TARGET_PACKAGE)) {
isRunningNow = true;
log.info(TARGET_PACKAGE + "가 현재 실행중...");
break;
}
}
return isRunningNow;
}
참고
'Backend > 프로젝트' 카테고리의 다른 글
갈아만든 임원 - 5 데이터 추출하기2 OpenCV 설치 (1) | 2024.09.25 |
---|---|
갈아만든 임원 - 4 데이터 추출하기 (Tesseract OCR) (0) | 2024.09.23 |
갈아만든 임원 - 3 화면 조작 및 스크린샷 저장하기 (0) | 2024.09.22 |
갈아만든 임원 - 1 (0) | 2024.09.17 |
04/24 팀프로젝트 일지 (0) | 2023.04.24 |