For AI agents: a documentation index is available at /docs/llms.txt. Append .md to any page URL for markdown, or send Accept: text/markdown.
실험 Android SDK
Amplitude Experiment의 클라이언트 측 Android SDK 구현에 대한 공식 문서입니다.
설치
Android 프로젝트의 build.gradle 파일에 종속성을 추가합니다.
dependencies {
implementation 'com.amplitude:experiment-android-client:<VERSION>'
}
빠른 시작
: 실험 SDK를 초기화하는 올바른 방법은 분석을 위해 Amplitude SDK를 사용하는지 아니면 제3자(예: 세그먼트)를 사용하는지에 따라 다릅니다.
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// (1) Initialize the experiment client
val client = Experiment.initializeWithAmplitudeAnalytics(
this, "DEPLOYMENT_KEY", ExperimentConfig()
)
// (2) Fetch variants
try {
// NOTE: The future returned resolves after a network call. Do not
// wait for this future on the main application thread in
// production applications to avoid ANR if the user has a poor
// network connection.
client.fetch().get()
} catch (e: Exception) {
e.printStackTrace()
}
// (3) Lookup a flag's variant
val variant = client.variant("<FLAG_KEY>")
if (variant.value == "on") {
// Flag is on
} else {
// Flag is off
}
}
}
초기화
시작 시 애플리케이션에서 SDK 클라이언트를 초기화합니다.apiKey 매개변수에 전달하는 배포 키 인수는 분석 이벤트를 전송하는 동일한 프로젝트 내에 있어야 합니다.
fun initializeWithAmplitudeAnalytics(
application: Application, apiKey: String, config: ExperimentConfig
)
application- 요구 사항: 필수
- 설명: Android
Application컨텍스트입니다. 세션 간에 변형을 유지하는 데 사용됩니다.
apiKey- 요구 사항: 필수
- 설명: 가져오기 요청을 승인하고 SDK가 사용자를 위해 평가할 플래그를 결정하는 배포 키입니다.
config- 요구 사항: 선택 사항
- 설명: SDK 클라이언트 동작을 사용자 정의하는 데 사용되는 클라이언트 구성입니다.
초기화기는 단일 인스턴스를 반환하므로 동일한 인스턴스 이름에 대한 후속 초기화는 초기 인스턴스를 반환합니다. 여러 인스턴스를 생성하려면 instanceName 구성을 사용하십시오.
val experiment = Experiment.initializeWithAmplitudeAnalytics(
context,
"DEPLOYMENT_KEY",
ExperimentConfig().apply {
// must match the name you used for your Amplitude Analytics instance
instanceName = "myCustomInstance"
}
)
구성
SDK 클라이언트 구성은 초기화 다음 기간동안 수행됩니다.
| 이름 | 설명 | 기본값 |
|---|---|---|
debug | 더 이상 사용되지 않습니다. true이때 logLevel는 Debug로 설정됩니다. 대신 logLevel을 사용하십시오. | false |
logLevel | 출력할 최소 로그 수준입니다. SDK는 이 수준 이하의 메시지를 무시합니다. 옵션: LogLevel.DISABLE, LogLevel.ERROR, LogLevel.WARN, LogLevel.INFO, LogLevel.DEBUG, LogLevel.VERBOSE. 사용자 지정 로깅으로 이동합니다. | LogLevel.ERROR |
loggerProvider | 맞춤형 로거 구현. LoggerProvider인터페이스를 구현해야 합니다. 사용자 지정 로깅으로 이동합니다. | AndroidLoggerProvider() |
fallbackVariant | 제공된 키에 대한 변형이 존재하지 않을 경우 폴백할 기본 변형입니다. | {} |
initialVariants | 액세스할 변형의 초기 세트입니다. 이 필드는 서버 측 렌더링(SSR)을 사용하여 서버에서 렌더링한 값으로 클라이언트 SDK를 부트스트랩하는 데 도움이 됩니다. | {} |
source | 변형의 기본 소스입니다. SSR 또는 테스트 목적으로 SDK를 부트스트랩하려면 값을 Source.INITIAL_VARIANTS로 설정하고 initialVariants를 구성하십시오. | Source.LOCAL_STORAGE |
serverZone | 플래그와 변형을 가져올 Amplitude 데이터 센터를 선택하십시오 | ServerZone.US |
serverUrl | 원격 평가 변형을 가져올 호스트입니다. EU 데이터 센터를 방문하려면 serverZone을 사용하십시오. | https://api.lab.amplitude.com |
flagsServerUrl | 로컬 평가 플래그를 가져올 호스트입니다. EU 데이터 센터를 방문하려면 serverZone을 사용하십시오. | https://flag.lab.amplitude.com |
fetchTimeoutMillis | 변형을 가져오는 데 필요한 시간 초과(밀리초)입니다. | 10000 |
retryFetchOnFailure | 요청이 성공하지 못할 경우 백그라운드에서 변형 가져오기를 재시도할지 여부입니다. | true |
automaticExposureTracking | true면, variant()를 호출하면 설정된 exposureTrackingProvider을 통해 노출 이벤트를 추적합니다. 노출 추적 공급자가 설정되어 있지 않은 경우 이 구성 옵션은 아무 작업도 수행하지 않습니다. | true |
fetchOnStart | true 또는 null인 경우 항상 시작 시 원격 평가 변형을 가져옵니다. false이면 시작 시 절대로 가져오지 마십시오. | true |
pollOnStart | 시작 시 매 분마다 로컬 평가 플래그 구성 업데이트를 위한 폴링이 수행됩니다. | true |
automaticFetchOnAmplitudeIdentityChange | initializeWithAmplitudeAnalytics초기화 기능을 사용하여 Amplitude 애널리틱스 SDK와 연동하는 경우에만 중요합니다.true 분석에서 사용자 ID, 기기 ID 또는 사용자 속성에 어떠한 변경이라도 발생하면 실험 SDK가 변형을 가져오고 캐시를 업데이트하도록 트리거합니다. | false |
userProvider | 호출 시 사용자 객체를 fetch()에 제공하는 데 사용되는 인터페이스입니다. | null |
exposureTrackingProvider | 이 인터페이스를 구현하고 구성하여 실험 SDK를 통해 노출 이벤트를 자동으로 또는 명시적으로 추적하십시오. | null |
instanceName | 실험 SDK 인스턴스의 사용자 지정 인스턴스 이름입니다. 이 필드의 값은 대소문자를 구분합니다. | null |
initialFlags | 로컬 평가에 사용할 초기 플래그 구성 세트를 나타내는 JSON 문자열입니다. | undefined |
EU 데이터 센터
Amplitude의 EU 데이터 센터를 사용하는 경우, 초기화 시 ServerZone.EU 옵션을 serverZone로 구성하십시오.
통합
Amplitude 또는 Segment Analytics SDK를 사용하여 이벤트를 Amplitude로 추적하는 경우, 초기화 시 연동을 설정하십시오. 연동은 공급자 인터페이스를 자동으로 구현하여 사용자 ID 관리와 노출 이벤트 추적을 보다 쉽게 함으로써 보다 간소화된 개발자 환경을 제공합니다.
가져오기
사용자의 변형을 가져오고 빠른 액세스를 위해 결과를 클라이언트에 저장합니다. 원격으로 평가 함수는 SDK 클라이언트를 초기화하는 데 사용된 배포와 관련된 플래그에 대해 사용자를 평가합니다.
fun fetch(user: ExperimentUser? = null, options: FetchOptions? = null): Future<ExperimentClient>
Amplitude 실험은 사용자가 애플리케이션 세션에 대한 최신 변형을 얻을 수 있도록 애플리케이션 시작 중에 호출할 것을 fetch()권장합니다. 또한 사용자 환경을 렌더링하기 전에 가져오기 요청이 결과를 반환할 때까지 기다리면 인터페이스의 "깜박임"을 방지할 수 있습니다.
try {
ExperimentUser user = ExperimentUser.builder()
.userId("user@company.com")
.userProperty("premium", true)
.build();
experiment.fetch(user).get();
} catch (Exception e) {
e.printStackTrace();
}
연동 또는 사용자 지정 사용자 제공자를 사용하는 경우 사용자를 입력하지 않고도 가져올 수 있습니다.
experiment.fetch(null);
사용자 ID가 변경될 때 가져오기
사용자에 대한 최신 변형을 원한다면 사용자 상태가 fetch()의미 있는 방식으로 변경될 때마다 호출하는 것이 좋습니다. 예를 들어 사용자가 로그인하여 사용자 ID를 받거나, 플래그 또는 실험 타겟팅 규칙에 영향을 줄 수 있는 사용자 속성이 설정되어 있는 경우가 있습니다.
사용자 속성의 경우, Amplitude는 원격 평가 전에 사용자 보강에 의존하는 대신 새 사용자 속성을 명시적으로 fetch()에 전달할 것을 권장합니다. 별도의 시스템을 통한 원격 사용자 속성 동기화는 fetch()에 대한 타이밍을 보장하지 않으며, 이는 경합 조건을 야기할 수 있습니다.
fetch()시간이 초과되거나 어떤 이유로든 실패하면 SDK 클라이언트가 반환되며 백오프를 사용하여 백그라운드에서 재시도합니다. SDK 클라이언트 초기화 다음 기간동안 구성 옵션에서 시간 초과를 구성하거나 재시도를 비활성화할 수 있습니다.
시작
실험 SDK를 시작하여 서버에서 플래그 구성을 가져오고 사용자를 위한 원격 평가 변형을 가져옵니다. 반환된 Future 객체가 완료되면 SDK가 준비됩니다.
fun start(user: ExperimentUser? = null): Future<ExperimentClient>
| 매개 변수 | 요구 사항 | 설명 | | --------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | | user | 선택 사항 | 변형 가져오기 요청과 함께 전달할 명시적 사용자 정보입니다. SDK는 이 사용자 정보를 사용자 공급자를 통해 통합에서 제공된 사용자 정보와 병합하며, 제공된 속성보다 명시적으로 전달된 속성을 fetch()선호합니다. 또한 SDK에서 사용자를 재사용할 수 있도록 설정합니다. | null |
애플리케이션이 초기화될 때 사용자 정보를 사용하여 변형을 가져올 수 있게 된 후start()에 호출하십시오. 로컬 평가 플래그 구성을 로드하고 원격 평가 변형을 페치한 후 Future 객체가 완료됩니다.
초기화 시 SDK 구성에서 start()설정을 통해 fetchOnStart의 동작을 구성하여 애플리케이션의 요구에 따라 성능을 향상시킵니다.
- 응용 프로그램이 원격 평가에 의존하지 않는 경우 원격 평가로 인한 스타트업 지연 시간 증가를 방지하려면
false로 설정하십시오fetchOnStart. - 애플리케이션이 원격 평가에 의존하지만 시작 직후에는 그렇지 않은 경우
fetchOnStart를false로 설정하고fetch()를 별도로 호출하여 Future를 기다릴 수 있습니다.
try {
experiment.start().get();
} catch (e: Exception) {
e.printStackTrace();
}
변형
SDK 클라이언트의 로컬 스토어에서 플래그 또는 실험에 대한 변형에 액세스하십시오.
자동 노출 추적
연동을 사용하거나 사용자 지정 노출 추적 공급자를 설정하는 경우 는 추적 공급자를 통해 노출 이벤트를 variant()추적합니다. 이 기능을 비활성화하려면 구성에서 automaticExposureTracking를 false로 설정하고, exposure()를 사용하여 노출을 수동으로 추적하십시오.
fun variant(key: String, fallback: Variant? = null): Variant
| 매개 변수 | 요구 사항 | 설명 |
|---|---|---|
key | 필수 | 변형에 액세스하기 위한 플래그 또는 실험을 식별하기 위한 플래그 키입니다. |
fallback | 선택 사항 | SDK가 지정된 flagKey에 대한 변형을 찾지 못한 경우 반환할 값입니다. |
사용자가 어떤 버킷에 속했는지 확인할 때는 해당 변형 키를 잘 알려진 문자열과 value비교하십시오.
Variant variant = client.variant("<FLAG_KEY>");
if (variant.is("on")) {
// Flag is on
} else {
// Flag is off
}
변형의 페이로드에 액세스.
변형에는 임의의 데이터로 구성된 동적 페이로드도 포함될 수 있습니다. 변형의 value을 확인한 후 변형 객체에서 payload 필드에 액세스합니다.
Android의 payload는 Object(Any?) 유형이며, 이는 페이로드를 예상된 유형으로 캐스팅해야 함을 의미합니다. JSON 객체와 배열 유형을 각각 org.json.JSONObject및 org.json.JSONArray로 변환합니다.
예를 들어 페이로드가 다음과 같은 경우{"key":"value"}:
Variant variant = experiment.variant("<FLAG_KEY>");
if (variant.is("on") && variant.payload != null) {
try {
String value = ((JSONObject) variant.payload).getString("key");
} catch (Exception e) {
e.printStackTrace();
}
}
null 변형 value은 사용자가 변형으로 분류되지 않았음을 의미합니다. 저장소에 지정된 플래그 키에 대한 변형이 없는 경우 내장된 폴백 매개변수를 사용하여 반환할 변형을 제공할 수 있습니다.
Variant variant = experiment.variant("<FLAG_KEY>", new Variant("control"));
if (variant.is("control")) {
// Control
} else if (variant.is("treatment")) {
// Treatment
}
모두
SDK 클라이언트에 저장된 모든 변형에 액세스합니다.
fun all(): Map<String, Variant>
experiment.all();
지우기
캐시와 스토리지의 모든 변형을 지웁니다.
fun clear()
사용자가 로그아웃한 후 clear 를 호출하여 캐시와 저장소의 변형을 지울 수 있습니다.
experiment.clear();
노출:
구성된 연동 또는 사용자 지정 노출 추적 공급자를 통해 지정된 플래그 키의 현재 변형에 대한 노출 이벤트를 수동으로 추적합니다. 일반적으로 automaticExposureTracking의 구성 옵션을 false로 설정하는 것과 함께 사용됩니다.
fun exposure(key: String)
Variant variant = experiment.variant("<FLAG_KEY>");
// Do other things...
experiment.exposure("<FLAG_KEY>");
if (variant.is("control")) {
// Control
} else if (variant.is("treatment")) {
// Treatment
}
공급자
연동 실험 클라이언트 SDK와 함께 Amplitude 또는 세그먼트 분석 SDK를 사용하는 경우, Amplitude는 사용자 지정 공급자를 구현하는 대신 연동을 사용하는 것을 권장합니다.
공급자 구현은 사용자 ID를 관리하고 노출 이벤트를 추적하기가 더 쉬워짐으로써 개발자 환경을 더욱 간소화할 수 있게 해줍니다.
사용자 제공자
SDK 클라이언트는 사용자 공급자를 사용하여 필요한 경우에만 최신 사용자 정보에 액세스합니다(예: SDK가 fetch()를 호출할 때). 사용자 공급자는 선택 사항이지만 응용 프로그램에 사용자 정보 저장소가 이미 설정되어 있는 경우 유용합니다. 사용자 공급자를 사용하면 두 개의 개별 사용자 정보 저장소를 동시에 관리할 필요가 없습니다. 애플리케이션이 사용자 저장소를 업데이트하지만 실험이 업데이트하지 않는 경우(또는 그 반대의 경우도 마찬가지)에 별도의 저장소가 일치하지 않는 사용자 상태를 생성할 수 있습니다.
interface ExperimentUserProvider {
fun getUser(): ExperimentUser
}
사용자 지정 사용자 공급자를 사용하려면 SDK 초기화 시 사용자 지정 구현의 인스턴스로 userProvider의 구성 옵션을 설정하십시오.
ExperimentConfig config = ExperimentConfig.builder()
.userProvider(new CustomUserProvider())
.build();
ExperimentClient experiment = Experiment.initialize(
context, "<DEPLOYMENT_KEY>", config);
노출 추적 공급자
Amplitude는 노출 추적 공급자를 구현할 것을 강력히 권장합니다. 노출 추적은 실험 결과의 정확성과 신뢰성을 높이고 사용자가 어떤 플래그와 실험에 노출되었는지에 대한 가시성을 개선합니다.
interface ExposureTrackingProvider {
fun track(exposure: Exposure)
}
track()의 구현은 flag_key 및 variant 이라는 두 개의 이벤트 속성을 사용하여 $exposure유형(이름이라고도 함)의 이벤트를 추적해야 하며, 이는 Exposure객체 인수의 두 필드에 해당합니다. 마지막으로, 추적된 이벤트는 결국 SDK 클라이언트를 초기화하는 데 사용된 [배포]가 속한 동일한 프로젝트의 Amplitude 애널리틱스에 도달해야 하며, SDK가 변형을 가져온 것과 동일한 사용자에 대해 수행되어야 합니다.
사용자 지정 사용자 공급자를 사용하려면 SDK 초기화 시 사용자 지정 구현의 인스턴스로 exposureTrackingProvider의 구성 옵션을 설정하십시오.
ExperimentConfig config = ExperimentConfig.builder()
.exposureTrackingProvider(new CustomExposureTrackingProvider())
.build();
ExperimentClient experiment = Experiment.initialize(
context, "<DEPLOYMENT_KEY>", config);
부트스트랩
외부 소스(예: SDK 클라이언트를 호출하지 않은 것)로부터 변형을 가져올 때 초기 플래그 또는 변형 세트로 실험 클라이언트를 부트스트랩할 수 있습니다. fetch()활용 사례에는 특정 변형에 대한 로컬 평가 또는 연동 테스트가 포함됩니다.
부트스트랩 변형
미리 정의된 변형 집합으로 클라이언트를 부트스트랩하려면 initialVariants의 구성 객체에서 플래그와 변형을 설정한 다음 source를 Source.InitialVariants로 설정하십시오. 그러면 SDK 클라이언트가 동일한 플래그에 대해 이전부터 가져오거나 저장된 변형보다 부트스트랩된 변형을 선호합니다.
let config = ExperimentConfigBuilder()
.initialVariants(["<FLAG_KEY>": Variant("<VARIANT>")])
.source(Source.InitialVariants)
.build()
let experiment = Experiment.initialize(apiKey: "<DEPLOYMENT_KEY>", config: config)
ExperimentConfig config = ExperimentConfig.builder()
.initialVariants(Map.of("<FLAG_KEY>", new Variant("<VARIANT>")))
.source(Source.INITIAL_VARIANTS)
.build();
ExperimentClient experiment = Experiment.initialize(
context, "<DEPLOYMENT_KEY>", config);
부트스트랩 플래그 구성
구성을 통해 초기 로컬 평가 플래그 구성 세트로 SDK를 부트스트랩하도록 선택할 수 있습니다initialFlags. 실험은 start 또는 fetch를 사용하여 업데이트된 플래그 설정이나 변형을 로드하지 않는 한 variant를 호출할 때 이러한 값을 평가합니다.
초기 플래그를 다운로드하려면 평가 플래그 API를 사용하십시오.
let config = ExperimentConfigBuilder()
.initialFlags("<FLAGS_JSON>")
.build()
let experiment = Experiment.initialize(apiKey: "<DEPLOYMENT_KEY>", config: config)
ExperimentConfig config = ExperimentConfig.builder()
.initialFlags("<FLAGS_JSON>")
.build();
ExperimentClient experiment = Experiment.initialize(
context, "<DEPLOYMENT_KEY>", config);
사용자 지정 로깅
logLevel 구성을 통해 로그 세부 정보를 제어하거나 LoggerProvider 인터페이스를 구현하여 자체 로거를 통합하십시오.
로그 수준
LogLevel.DISABLE- 로그 없음.LogLevel.ERROR- 오류만(기본값).LogLevel.WARN- 오류 및 경고.LogLevel.INFO- 오류, 경고 및 정보.LogLevel.DEBUG- 오류, 경고, 정보 및 디버그.LogLevel.VERBOSE- 자세한 내용을 포함한 모든 메시지.
// Set log level to debug
val experiment = Experiment.initialize(
context,
"<DEPLOYMENT_KEY>",
ExperimentConfig.builder()
.logLevel(LogLevel.DEBUG)
.build()
)
사용자 지정 로거
자체 로깅 솔루션을 사용하도록 LoggerProvider인터페이스를 구현하십시오.
// Implement the LoggerProvider interface
class CustomLoggerProvider : LoggerProvider {
override fun verbose(msg: String) {
// Send verbose logs to your logging service
myLoggingService.verbose(msg)
}
override fun debug(msg: String) {
myLoggingService.debug(msg)
}
override fun info(msg: String) {
myLoggingService.info(msg)
}
override fun warn(msg: String) {
myLoggingService.warn(msg)
}
override fun error(msg: String) {
myLoggingService.error(msg)
}
}
// Initialize with custom logger
val experiment = Experiment.initialize(
context,
"<DEPLOYMENT_KEY>",
ExperimentConfig.builder()
.loggerProvider(CustomLoggerProvider())
.logLevel(LogLevel.WARN)
.build()
)
디버그 플래그(사용되지 않음)
debug이 구성 플래그는 사용되지 않습니다. 대신 logLevel을 사용하십시오.
// Deprecated: Sets logLevel to Debug
val experiment = Experiment.initialize(
context,
"<DEPLOYMENT_KEY>",
ExperimentConfig.builder()
.debug(true)
.build()
)
// Preferred: Use logLevel instead
val experiment = Experiment.initialize(
context,
"<DEPLOYMENT_KEY>",
ExperimentConfig.builder()
.logLevel(LogLevel.DEBUG)
.build()
)
이 내용이 도움이 되었나요?