앱 다루기

폰에 설치된 앱 목록 보기, 앱 설치 여부 확인, 앱과 링크와 설정 화면 열기, 지금 앞에 있는 앱 확인, 화면을 보호하는 앱 다루기.

번역된 페이지입니다. 영어 문서와 내용이 다르면 영어 문서가 기준입니다. English

스크립트는 대부분 앱을 여는 데서 시작합니다. 이 가이드는 화면 속 요소가 아니라 앱 단위로 다루는 명령을 모았습니다.

폰에 설치된 앱 목록 보기

apps는 설치된 앱의 패키지 이름, 앱 이름, 버전, 시스템 앱 여부를 돌려줍니다. 시스템 앱은 따로 요청할 때만 들어갑니다.

droidline apps
droidline apps --system
for app in d.apps():
    print(app["package"], app["label"], app["version"])

everything = d.apps(system=True)
for (const app of await d.apps()) {
  console.log(app.package, app.label, app.version);
}

const everything = await d.apps(true);
foreach (var app in await d.AppsAsync())
    Console.WriteLine($"{app.Package} {app.Label} {app.Version}");

var everything = await d.AppsAsync(system: true);

launch, in_app, notify_filter에 필요한 패키지 이름을 찾는 가장 빠른 방법이기도 합니다. 홈 화면에 보이는 앱 이름으로 목록을 검색하세요.

앱 설치 여부 확인

installed는 앱이 있으면 버전 이름을, 없으면 빈 문자열을 돌려줍니다.

droidline installed com.android.chrome
version = d.installed("com.android.chrome")
if not version:
    print("Chrome이 설치돼 있지 않습니다")
const version = await d.installed("com.android.chrome");
if (!version) console.log("Chrome이 설치돼 있지 않습니다");
var version = await d.InstalledAsync("com.android.chrome");
if (version == "") Console.WriteLine("Chrome이 설치돼 있지 않습니다");

앱 열기

launch는 앱을 첫 화면으로 열고, 폰에서 걸린 시간을 돌려줍니다. 특정 화면(액티비티)을 넘기면 그 화면을 엽니다. 단, 그 앱이 다른 앱에서 열 수 있게 허용한 화면이어야 합니다.

droidline launch com.android.settings
droidline launch com.example.shop com.example.shop.CartActivity
d.launch("com.android.settings")
d.launch("com.example.shop", "com.example.shop.CartActivity")
await d.launch("com.android.settings");
await d.launch("com.example.shop", "com.example.shop.CartActivity");
await d.LaunchAsync("com.android.settings");
await d.LaunchAsync("com.example.shop", "com.example.shop.CartActivity");

launch는 앱이 첫 화면을 그리기 전에 끝납니다. 이어서 wait로 보일 것을 기다리세요.

d.launch("dev.droidline.demo")
d.wait("text", "Sign in")

앱이 외부에 열어 두지 않은 화면은 바로 열 수 없습니다. 그때 launch는 첫 화면을 열고, 스크립트가 거기서부터 눌러 가야 합니다.

링크나 설정 화면 열기

open_url은 웹 주소나 앱의 딥링크를 엽니다. 패키지를 넘기면 그 앱으로 엽니다. intent는 화면을 액션 이름으로 여는데, 설정의 특정 페이지로 갈 때 씁니다.

droidline open_url https://droidline.dev
droidline open_url "myapp://orders/42" com.example.shop
droidline intent android.settings.WIFI_SETTINGS
droidline intent android.settings.APPLICATION_DETAILS_SETTINGS package:com.android.chrome
d.open_url("https://droidline.dev")
d.open_url("myapp://orders/42", "com.example.shop")
d.intent("android.settings.WIFI_SETTINGS")
d.intent("android.settings.APPLICATION_DETAILS_SETTINGS", "package:com.android.chrome")
await d.openUrl("https://droidline.dev");
await d.openUrl("myapp://orders/42", "com.example.shop");
await d.intent("android.settings.WIFI_SETTINGS");
await d.intent("android.settings.APPLICATION_DETAILS_SETTINGS", "package:com.android.chrome");
await d.OpenUrlAsync("https://droidline.dev");
await d.OpenUrlAsync("myapp://orders/42", "com.example.shop");
await d.IntentAsync("android.settings.WIFI_SETTINGS");
await d.IntentAsync("android.settings.APPLICATION_DETAILS_SETTINGS", "package:com.android.chrome");

설정 화면을 연 다음 무엇을 눌러야 하는지는 제조사와 언어마다 다릅니다. 와이파이, 모바일 데이터, 비행기 모드, 강제 종료, 데이터 삭제는 레시피에 정리돼 있습니다.

지금 앞에 있는 앱 확인

current는 지금 앞에 있는 앱과 화면(액티비티)을 알려 줍니다. in_app은 특정 앱이 앞에 있는지 true나 false로 답해서, 반복문 안에서 확인하기 좋습니다.

droidline current
droidline in_app com.android.settings
print(d.current())   # {'package': 'com.android.settings', 'activity': '...'}
if not d.in_app("com.example.shop"):
    d.launch("com.example.shop")
console.log(await d.current());
if (!(await d.inApp("com.example.shop"))) await d.launch("com.example.shop");
var now = await d.CurrentAsync();
Console.WriteLine($"{now.Package} {now.Activity}");
if (!await d.InAppAsync("com.example.shop")) await d.LaunchAsync("com.example.shop");

뒤로, 홈, 최근 앱

droidline back
droidline home
droidline recents
d.back()
d.home()
d.recents()
await d.back();
await d.home();
await d.recents();
await d.BackAsync();
await d.HomeAsync();
await d.RecentsAsync();

화면을 보호하는 앱

은행이나 결제 앱은 화면 캡처를 막는 경우가 많아서, 그 앱이 앞에 있으면 screenshot이 검은 그림을 돌려줍니다. 그래도 버튼과 글자는 대개 dump에 나오므로, 글자, ID, 설명으로 요소를 찾아 누르는 것은 그대로 됩니다. 지문, 얼굴, 패턴 인증은 사람이 폰에서 직접 해야 합니다.

앱 데이터 삭제

clear_data는 명령 하나로 앱 데이터를 지우지만, 디바이스 오너 모드에서만 됩니다. 그 모드가 아니면 레시피에 설정 화면으로 지우는 방법이 있습니다.