Android Vanilla SDK 설치 가이드
IMQA Vanilla Android SDK v1.1.0 설치 및 설정 방법을 안내합니다.
IMQA 관리 계정 로그인 후 관리 > 서비스 관리 메뉴에서 새로운 서비스를 추가합니다. 관리 > 앱 관리 메뉴에서 해당 서비스에 새로운 앱을 등록하고 발급된 앱 키를 확인합니다. 등록한 서비스 이름과 앱 키를 사용하여 설치하세요.
IMQA Android Vanilla SDK 지원 사양
| 항목 | 요구사항 |
|---|---|
| Java version | 1.8 이상 |
| min SDK | 19 이상 |
| Support Language | Java, Kotlin |
IMQA Android Vanilla SDK 설치
IMQA SDK는 애플리케이션의 런타임에 데이터를 수집하기 위해 설계되었습니다. 아래 방법을 따라 SDK를 설치하세요.
1. Gradle 설정
1-1. aar 파일 직접 설치
애플리케이션 디렉토리 하위에 libs 디렉토리를 생성하고 imqa-vanilla-android-sdk-버전-release.aar 파일을 복사 후 dependencies 섹션에 IMQA SDK를 추가합니다.
Groovy DSL
dependencies {
implementation files('libs/imqa-vanilla-android-sdk-1.1.0-release.aar')
}
Kotlin DSL
dependencies {
implementation(files("libs/imqa-vanilla-android-sdk-1.1.0-release.aar"))
}
2. Application 클래스 설정
IMQA SDK는 Application 클래스에 초기화 코드를 추가하여 동작합니다. Application 클래스의 onCreate() 메서드에서 다음을 설정하세요.
- Application 클래스 추가
애플리케이션의
AndroidManifest.xml파일에android:name속성을 설정하여Application클래스를 지정합니다. 기존에Application클래스가 이미 존재하는 경우 이 단계를 생략할 수 있습니다.
<application
android:name=".Application"
...
>
</application>
- SDK 초기화 코드 작성
Application클래스의onCreate()메서드에 다음 코드를 추가합니다:
Kotlin
import io.imqa.android.sdk.core.IMQA
import io.imqa.android.sdk.core.IMQAOption
import io.imqa.android.sdk.core.IMQAOption.Environment
//import io.imqa.android.sdk.core.IMQAOption.DeviceIdType
class Application : android.app.Application() {
override fun onCreate() {
super.onCreate()
val options = IMQAOption()
options.setDefault()
options.setCollectorURL("여기에 url을 입력해주세요.")
options.setServiceKey("여기에 service key를 입력해주세요.")
options.setSampleRate("샘플링 비율(0.0~1.0) 값을 입력해주세요.") // default=1.0
options.setServiceNameSpace("Namespace")
//options.setRemoteCollectionControlEnable(true)
//options.setEnvironment(Environment.DEVELOPMENT)
//options.setUserEventEnable(true)
//options.setDeviceIdType(DeviceIdType.UUID)
IMQA.setup(options)
IMQA.initialize(this.applicationContext, this)
}
}
Java
import io.imqa.android.sdk.core.IMQA;
import io.imqa.android.sdk.core.IMQAOption;
import io.imqa.android.sdk.core.IMQAOption.Environment;
//import io.imqa.android.sdk.core.IMQAOption.DeviceIdType;
public class Application extends android.app.Application {
@Override
public void onCreate() {
super.onCreate();
IMQAOption options = new IMQAOption();
options.setDefault();
options.setCollectorURL("여기에 url을 입력해주세요.");
options.setServiceKey("여기에 service key를 입력해주세요.");
options.setSampleRate("샘플링 비율(0.0~1.0) 값을 입력해주세요."); // default=1.0
options.setServiceNameSpace("Namespace");
//options.setRemoteCollectionControlEnable(true);
//options.setEnvironment(Environment.DEVELOPMENT);
//options.setUserEventEnable(true);
//options.setDeviceIdType(DeviceIdType.UUID);
IMQA.setup(options);
IMQA.initialize(this.getApplicationContext(), this);
}
}
setCollectorURL: 데이터를 수집할 서버의 URL을 입력합니다.setServiceKey: 발급받은 앱키를 입력합니다.
(관리 > 앱 관리 > 앱키)- (option)
setSampleRate: 샘플링 비율을 입력합니다. 샘플링 디폴트 값은 1.0(100%) 입니다.- 0.0~1.0 사이의 값을 입력합니다. (0.0 : 수집 안함, 1.0 : 100% 수집)
setServiceNameSpace: 대시보드 서비스 추가시 입력한 namespace를 넣어주세요.
(관리 > 서비스 관리 > 서비스 이름) 또는 (관리 > 앱 관리 > 서비스)- (option)
setEnvironment: 배포 환경 설정 (default: .PRODUCTION) - (option)
setUserEventEnable: 클릭이벤트 자동 수집 설정(XML UI 지원) (default=false) - (option)
setRemoteCollectionControlEnable: 원격 수집 제어 활성화 설정 (default=false)- SDK는 api로 전달된 서버 설정에 따라 적용됩니다.
- On/Off (default=on)
- 전송 실패 시 자동 중지 정책 (default=false)
- 자동 중지 정책 실패 횟수 기준(default=5)
- (option)
setDeviceIdType: deviceId 타입 설정 (default=ANDROID_ID)- ANDROID_ID : 안드로이드에서 제공하는 식별자 (SSAID)
- UUID: SDK 내부에서 생성되는 랜덤 식별자 (앱 삭제 후 재설치시 새로 생성)
3. Https 설정
- HttpClient 설정
HttpClient의 XHR 데이터를 수집하기 위해 setIMQAInterceptor 를 설정해야 합니다.
Kotlin
import io.imqa.android.sdk.network.httpclient.HttpClientInterceptor;
...
// DefaultHttpClient 에 HttpClientInterceptor 를 추가
val httpClient : DefaultHttpClient = DefaultHttpClient()
HttpClientInterceptor.setIMQAInterceptor(httpClient)
...
Java
import io.imqa.android.sdk.network.httpclient.HttpClientInterceptor;
...
// DefaultHttpClient 에 HttpClientInterceptor 를 추가
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpClientInterceptor.setIMQAInterceptor(httpClient);
...
- Retrofit, OkHttp 설정
Retrofit, OkHttp 기반의 네트워크 요청의 XHR 데이터를 수집하기 위해 네트워크 요청 시 다음과 같이 HttpInterceptor를 추가해 주세요.
Kotlin
import io.imqa.android.sdk.network.okhttp.HttpInterceptor;
...
val client = OkHttpClient.Builder()
.addInterceptor(HttpInterceptor()) //추가
.build()
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
...
Java
import io.imqa.android.sdk.network.okhttp.HttpInterceptor;
...
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpInterceptor()) //추가
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
...
- HttpUrlConnection 설정
HttpURLConnection 기반의 네트워크 요청의 XHR 데이터를 수집하기 위해 네트워크 요청 시 다음과 같이 추가해 주세요.
Kotlin
import io.imqa.android.sdk.network.urlconnection.ConnectionWrapper;
...
// HttpsURLConnection 객체를 ConnectionWrapper 로 감쌈
var url : URL = URL("https://some.host.com")
var conn : HttpsURLConnection =
ConnectionWrapper.wrap(
url.openConnection() as HttpsURLConnection
) as HttpsURLConnection
...
Java
import io.imqa.android.sdk.network.urlconnection.ConnectionWrapper;
...
// HttpsURLConnection 객체를 ConnectionWrapper 로 감쌈
URL url = new URL("https://some.host.com");
HttpsURLConnection conn = (HttpsURLConnection)
ConnectionWrapper.wrap((HttpsURLConnection) url.openConnection());
...
4. 설치 검증
IMQA가 정상적으로 동작하는지 확인하기 위해 샘플 오류를 발생시켜 로그가 전송되는지 확인합니다. 아래 코드를 애플리케이션의 적절한 위치에 추가하여 테스트합니다.
Kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import java.lang.Exception
import io.imqa.android.sdk.log.IMQALog
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
try {
throw Exception("테스트 오류")
} catch (e: Exception) {
IMQALog.error("TestTag", "This is a test error", e);
}
}
}
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import java.lang.Exception;
import io.imqa.android.sdk.log.IMQALog;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
throw new Exception("테스트 오류");
} catch (Exception e) {
IMQALog.error("TestTag", "This is a test error", e);
}
}
}
IMQA Android SDK 설정
커스텀 사용자 ID 설정
커스텀 사용자 ID를 지정하여 특정 사용자의 세션 분석 시 활용할 수 있습니다.
일반적으로 로그인 성공 시 "사용자 아이디(또는 사번)"을 넣어주고, 로그아웃 성공 시 빈문자열("")을 설정해서 세션 분석을 진행합니다. IMQA.initialize 호출 이후에 실행되어야 정상적으로 동작합니다.
Kotlin
import io.imqa.android.sdk.core.IMQA
IMQA.setCustomUserId("customer-user-id")
Java
import io.imqa.android.sdk.core.IMQA;
IMQA.setCustomUserId("customer-user-id");

커스텀 이벤트 전송
특정 버튼이나 탭 버튼을 클릭 시 이벤트가 발생했음을 알리는 기능입니다.
IMQA.sendClickEvent(view: View, isNetworkRequest: Boolean = false)
- view : 클릭 대상, isNetworkRequest : 데이터 조회 여부
단순히 화면 이동을 위한 버튼 클릭 시 이벤트 알림을 다음과 같이 전송할 수 있습니다.
Kotlin
import io.imqa.android.sdk.core.IMQA
binding.button.setOnClickListener {
IMQA.sendClickEvent(binding.button, false)
}
Java
import io.imqa.android.sdk.core.IMQA;
binding.button.setOnClickListener(v -> {
IMQA.sendClickEvent(v, false);
});
버튼 클릭 시 서버로 데이터 조회를 할 경우 다음과 같이 전송할 수 있습니다.
Kotlin
binding.button.setOnClickListener {
IMQA.sendClickEvent(it, true)
service.getHello().enqueue(object : retrofit2.Callback<Data> {
override fun onFailure(call: Call<Data>, t: Throwable) {
t.printStackTrace()
}
override fun onResponse(call: Call<Data>, response: Response<Data>) {
response.body()?.let { data ->
IMQALog.debug("MainActivity", "Data: " + data.toString());
}
}
})
}
Java
binding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IMQA.sendClickEvent(v, true);
service.getHello().enqueue(new Callback<Data>() {
@Override
public void onResponse(Call<Data> call, Response<Data> response) {
Data data = response.body();
if (data != null) {
IMQALog.debug("MainActivity", "Data: " + data.toString());
}
}
@Override
public void onFailure(Call<Data> call, Throwable t) {
t.printStackTrace();
}
});
}
});
Webview Interface 설정
네이티브 앱의 세션과 웹뷰 내 페이지 세션을 하나로 결합하기 위해
JavaScriptInjector.injectSession(view) 코드를 사용하여 연결해야 합니다.
Kotlin
import io.imqa.android.sdk.webview.JavaScriptInjector
JavaScriptInjector.injectSession(webView) //추가
webView.loadUrl(serverUrl)
Java
import io.imqa.android.sdk.webview.JavaScriptInjector;
// ... 생략 ...
JavaScriptInjector.injectSession(webView); //추가
webView.loadUrl(serverUrl);
// ... 생략 ...
사용자 커스텀 attribute 설정
사용자 정의 attribute 추가합니다.
사용자 attribute는 key 앞에 "custom."이 자동으로 추가됩니다.
Kotlin
import io.imqa.android.sdk.core.IMQA
IMQA.getCustomAttributes().setAttribute("key", "value")
Java
import io.imqa.android.sdk.core.IMQA;
IMQA.getCustomAttributes().setAttribute("key", "value");
사용자 커스텀 로깅
필요한 경우 SDK의 IMQALog API를 사용하여 사용자 로그를 수집할 수 있습니다. 로그 레벨은 debug, info, warn, error로 다음과 같이 사용하실 수 있습니다.
사용자 커스텀 로깅 기능은 꼭 필요한 경우에 사용해 주세요. 무분별하게 너무 많은 로그를 남기면 앱에 성능 저하를 일으킬 수 있습니다. 또한, 수집 데이터가 늘어나므로 저장소 용량이 커질 수 있습니다.
문제 패턴과 예외 확인을 위한 커스텀 메시지를 남기고 식별할 수 있습니다.
Kotlin
import io.imqa.android.sdk.log.IMQALog
IMQALog.debug("TAG", "message")
IMQALog.info("TAG", "message")
IMQALog.warn("TAG", "message")
IMQALog.error("TAG", "message", RuntimeException("exception"))
Java
import io.imqa.android.sdk.log.IMQALog;
IMQALog.debug("TAG", "message");
IMQALog.info("TAG", "message");
IMQALog.warn("TAG", "message");
IMQALog.error("TAG", "message", new RuntimeException("exception"));