Dari
Gradle 플러그인

매핑 레퍼런스

dari { } 블록의 위치, 필드, 표현식, 옵션

위치

함수매핑 대상변환 결과
webToAppRequest(class, method)JavaScript가 호출하는 메서드(@JavascriptInterface)onWebToAppRequest
webToAppResponse(class, method)결과를 페이지로 돌려보내는 메서드onWebToAppResponse
appToWebRequest(class, method)페이지를 호출하는 메서드onAppToWebRequest
appToWebResponse(class, method)페이지가 응답할 때 호출하는 메서드onAppToWebResponse
  • class는 패키지를 포함한 클래스 이름입니다. 중첩 클래스는 .과 $ 모두 쓸 수 있습니다.
  • method는 메서드 이름입니다. 같은 이름의 오버로드는 모두 매핑됩니다.
  • 훅은 메서드 본문보다 먼저, 메서드가 시작될 때 실행됩니다.
  • suspend 함수도 매핑할 수 있습니다. suspend 함수는 재개될 때마다 다시 호출되는데, 처음 호출만 기록합니다. --info 로그에는 메서드 옆에 (suspend; resumptions skipped)가 붙습니다.

필드

필드사용처설명
handlerName요청(필수), webToAppResponse응답에서 생략하면 요청의 이름을 씁니다.
requestId전체, 응답은 필수응답을 요청과 짝지을 때 씁니다.
data전체텍스트는 그대로 저장합니다. 바이트(base64(...) 결과나 ByteArray 파라미터)는 protobuf API로 기록합니다.
displayName요청수동 API의 displayName 오버로드와 같습니다.
success응답생략하면 항상 SUCCESS입니다. false, "false", 0이면 ERROR로 기록합니다.
fireAndForget요청true면 바로 완료 처리합니다. false면 수동 API에 null을 넘긴 것처럼 DariConfig.fireAndForget을 따릅니다.
onlyIf전체선택 사항입니다. 생략하면 모든 호출을 기록합니다. 지정하면 값이 true일 때만 기록하고, null은 false로 봅니다. 메서드 하나로 여러 종류의 메시지가 오갈 때 씁니다.
tag전체이 매핑에서만 dari { tag } 값을 덮어씁니다.

표현식

표현식값
arg("name")이름이 name인 파라미터입니다. 플러그인이 빌드 시점에 인덱스로 바꿉니다.
arg(n)메서드의 n번째 파라미터입니다. 0부터 세고, this는 세지 않습니다.
constant("x"), constant(true)고정값입니다.
json(expr, "a.b.0")JSON 문자열, JSON 객체(kotlinx.serialization이나 Gson의 JsonObject처럼 toString()이 JSON인 값), 또는 중첩된 json(...) 결과의 필드입니다. JSON이 아닌 값이면 null입니다.
base64(expr)Base64 텍스트를 디코딩한 바이트입니다.
expr.equalsTo("x")값의 문자열이 "x"와 같으면 true입니다.
isNull(expr)값이 null이면 true입니다. 예를 들어 error 필드가 없는 경우입니다.

arg(1)보다 arg("requestId")를 권장합니다. 인덱스를 쓰면 파라미터 두 개의 순서를 바꾸거나 하나를 끼워 넣어도 빌드가 통과하고, 엉뚱한 값이 조용히 기록됩니다. 이름을 쓰면 파라미터 이름이 바뀌거나 사라졌을 때 빌드가 실패하고, 오류 메시지에 메서드의 실제 파라미터 이름이 나옵니다. 이름은 디버그 정보에서 읽습니다. Kotlin은 항상 기록하고, Java는 기본 옵션인 -g에서 기록합니다. 매핑한 메서드에 오버로드가 여러 개면 각각 따로 해석하므로, 모든 오버로드에 그 이름이 있어야 합니다.

옵션

dari {
    tag = "Checkout"                         // 기본값: addJavascriptInterface에 넘긴 이름
    scope = InstrumentationScope.ALL         // 기본값: InstrumentationScope.PROJECT
    failOnUnmatchedMapping = false           // 기본값: true. "규칙과 제한"의 "매핑 검사" 참고
}

scope에는 AGP가 제공하는 InstrumentationScope(com.android.build.api.instrumentation)를 씁니다. Dari가 만든 타입이 아닙니다. 빌드 스크립트 맨 위에 import com.android.build.api.instrumentation.InstrumentationScope를 추가하세요. 플러그인은 이 값을 AGP의 transformClassesWith에 그대로 넘깁니다.

  • PROJECT: 해당 모듈의 클래스만 변환합니다.
  • ALL: 서드파티 AAR을 포함한 의존성의 클래스까지 변환합니다.

On this page