비디오 가이드 제공
연동 과정에 대한 자세한 안내를 보려면 이 비디오를 시청하세요. 최상의 결과를 얻으려면 비디오와 아래의 문서 가이드를 함께 사용하세요.
사전 요구사항
이 연동을 진행하기 전에 Singular SDK 연동: 계획 및 사전 요구사항 의 단계를 완료하세요.
중요: 이러한 사전 요구사항 단계는 모든 Singular SDK 연동에 필수입니다.
설치
설치 방법
참고: Android Studio는 이제 새 프로젝트에서 기본적으로 Kotlin DSL (build.gradle.kts)을 사용합니다. 아래의 모든 코드 예제는 Kotlin DSL (권장) 및 Groovy DSL 형식을 모두 표시합니다.
방법 1: Gradle (권장)
SDK 저장소 추가
프로젝트의 의존성 관리에서 Singular Maven 저장소를 구성합니다.
참고:
Gradle 7부터 Android는
프로젝트 또는 모듈 수준의
build.gradle
선언보다
settings.gradle
또는
settings.gradle.kts
에서 중앙 집중식 저장소 선언을 사용하는 것을 권장합니다.
Gradle 7+ 구성
settings 파일에 Singular SDK 저장소를 추가합니다:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven {
url = uri("https://maven.singular.net/")
}
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven {
url 'https://maven.singular.net/'
}
}
}
이전 Gradle 버전
이전 Gradle 버전의 경우, 프로젝트 수준 빌드 파일에 저장소를 추가하세요:
repositories {
mavenCentral()
maven {
url = uri("https://maven.singular.net/")
}
}
repositories {
mavenCentral()
maven {
url 'https://maven.singular.net/'
}
}
Singular 라이브러리 의존성 추가
앱 모듈의 의존성에 Singular 라이브러리를 추가합니다.
dependencies {
implementation("com.singular.sdk:singular_sdk:12.13.0")
}
dependencies {
implementation 'com.singular.sdk:singular_sdk:12.13.0'
}
문제 해결: 중복 클래스 문제
여러 의존성에 동일한 라이브러리가 포함되어 있을 때 중복 클래스 오류가 발생할 수 있습니다. 이는 이전 버전의 Google Play Services 라이브러리를 사용할 때 흔히 발생합니다.
일반적인 오류 예시:
Duplicate class com.google.android.gms.common.api.ResultCallback found in modules play-services-6.5.87.aar and play-services-basement-17.6.0.aar
해결책: 충돌하는 의존성 제외
중복 클래스 문제를 해결하려면 Singular SDK 또는 충돌을 일으키는 다른 의존성에서 충돌하는 전이 의존성(transitive dependency)을 제외합니다.
dependencies {
// Exclude specific Google Play Services modules from Singular SDK
implementation("com.singular.sdk:singular_sdk:12.13.0") {
exclude(group = "com.google.android.gms", module = "play-services")
}
// Add the specific Google Play Services libraries your app needs
implementation("com.google.android.gms:play-services-ads-identifier:17.0.0")
implementation("com.google.android.gms:play-services-appset:16.0.2")
}
dependencies {
// Exclude specific Google Play Services modules from Singular SDK
implementation('com.singular.sdk:singular_sdk:12.13.0') {
exclude group: 'com.google.android.gms', module: 'play-services'
}
// Add the specific Google Play Services libraries your app needs
implementation 'com.google.android.gms:play-services-ads-identifier:17.0.0'
implementation 'com.google.android.gms:play-services-appset:16.0.2'
}
전역 제외 규칙
중복 클래스 충돌이 프로젝트 전반의 여러 의존성에 영향을 미치는 경우, 전역 제외 규칙을 적용할 수 있습니다.
configurations.all {
exclude(group = "com.google.android.gms", module = "play-services")
}
configurations.all {
exclude group: 'com.google.android.gms', module: 'play-services'
}
의존성 해결 검증
제외 규칙을 적용한 후, 충돌이 해결되었는지 확인하기 위해 의존성 트리를 검증합니다.
./gradlew app:dependencies --configuration debugRuntimeClasspath
이 명령은 앱의 전체 의존성 트리를 표시하여 어떤 라이브러리가 포함되어 있고 어떤 라이브러리가 제외되었는지를 보여줍니다.
Samsung Galaxy Store 지원
앱이 Samsung Galaxy Store를 통해 배포되는 경우 Samsung Galaxy Store install referrer 의존성을 추가합니다.
dependencies {
implementation("store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:4.0.0")
}
dependencies {
implementation 'store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:4.0.0'
}
전이 의존성 (Transitive Dependencies)
Singular SDK의 전이 의존성을 비활성화한 경우, 앱 모듈의 의존성에 필요한 라이브러리를 수동으로 추가하세요.
dependencies {
implementation("com.android.installreferrer:installreferrer:2.2")
implementation("com.google.android.gms:play-services-appset:16.0.2")
}
dependencies {
implementation 'com.android.installreferrer:installreferrer:2.2'
implementation 'com.google.android.gms:play-services-appset:16.0.2'
}
Google Play Services 의존성
앱에서 Google Play Services API 17.0.0 이상을 구현하지 않은 경우, 다음 의존성을 추가하세요.
dependencies {
implementation("com.google.android.gms:play-services-ads-identifier:17.0.0")
}
dependencies {
implementation 'com.google.android.gms:play-services-ads-identifier:17.0.0+'
}
대체 설치 방법
수동 다운로드
SDK AAR 파일을 다운로드하여 프로젝트에 수동으로 연동합니다.
- SDK 다운로드: 이 페이지 상단의 링크에서 SDK를 다운로드합니다
-
압축 해제 및 libs에 추가:
SDK 패키지의 압축을 해제하고
Singular.aar을 Android 프로젝트의 libs 디렉터리에 추가합니다 -
libs 디렉터리 생성:
존재하지 않을 경우, 프로젝트 폴더(보통
<project>/app/libs)에libs디렉터리를 생성합니다
Maven 설치
프로젝트의
pom.xml
파일에 Singular Maven 저장소를 추가합니다.
<project ...>
<repositories>
<repository>
<id>singular.net</id>
<url>http://maven.singular.net/</url>
</repository>
</repositories>
</project>
의존성을 추가합니다:
<dependency>
<groupId>com.singular.sdk</groupId>
<artifactId>singular_sdk</artifactId>
<version>12.13.0</version>
</dependency>
Eclipse 설치
다음 단계를 따라 Eclipse를 사용하여 SDK를 연동합니다.
Eclipse AAR 플러그인을 사용할 수 있습니다: gradle-eclipse-aar-plugin
플러그인을 사용하지 않으려면 다음 단계를 따르세요:
-
AAR 압축 해제:
singular_sdk-12.13.0.aar의 압축을 해제합니다 -
JAR 파일 이름 변경:
classes.jar의 이름을singular_sdk-12.13.0.jar로 변경합니다 (이것이 기본 SDK jar입니다) -
install referrer 추가:
com.android.installreferrer:installreferrer:2.2라이브러리를 프로젝트에 추가합니다 -
권한 복사:
AAR에 포함된
AndroidManifest.xml의BIND_GET_INSTALL_REFERRER_SERVICE권한을 사용 중인AndroidManifest.xml에 복사합니다 -
라이선스 권한 복사:
AAR에 포함된
AndroidManifest.xml의CHECK_LICENSE권한을 사용 중인AndroidManifest.xml에 복사합니다
ProGuard 구성
ProGuard 규칙
코드 난독화 문제를 방지하려면
proguard.config
파일에 다음 규칙을 추가합니다.
-keep class com.singular.sdk.** { *; }
-keep public class com.android.installreferrer.** { *; }
# Uncomment this line in case your are calling the 'revenue' function using the Google billing library
#-keep public class com.android.billingclient.** { *; }
필수 권한
AndroidManifest 구성
다음 권한을
AndroidManifest.xml
파일의
<manifest>
태그 아래에 추가합니다.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="BIND_GET_INSTALL_REFERRER_SERVICE" />
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
Kids SDK
를 연동하는 경우
com.google.android.gms.permission.AD_ID
권한을 제외하세요.
Samsung Galaxy Store 쿼리
Samsung Galaxy Store의 install referrer를 지원하려면
AndroidManifest.xml
에 다음을 추가하세요.
<queries>
<package android:name="com.sec.android.app.samsungapps" />
</queries>
SDK 연동
개인정보 보호 준수: Singular SDK를 구현할 때는 GDPR, CCPA, COPPA를 포함하여 비즈니스를 운영하는 지역에서 시행되는 개인정보 보호법을 준수하세요. 자세한 안내는 SDK 옵트인 및 옵트아웃 방안 을 참조하세요.
Singular SDK 임포트
Import 문 추가
MainActivity 파일에 Singular 라이브러리를 임포트합니다.
import com.singular.sdk.*
import com.singular.sdk.*;
SDK 초기화
초기화 함수 생성
세션 트래킹과 어트리뷰션을 활성화하려면, private 메서드를 생성하고 MainActivity의
onCreate()
메서드에서 이를 호출하여 앱이 실행될 때마다 Singular SDK를 초기화하세요.
다음 단계를 따르세요:
- 함수 추가: 초기화 메서드를 MainActivity 클래스(또는 진입점 Activity)에 배치합니다
-
자격 증명 삽입:
SDK KEY와SDK SECRET을 대시보드의 Singular SDK 키 및 시크릿으로 교체합니다 - SingularConfig 업데이트: SDK를 초기화하기 전에 SingularConfig 객체를 생성하고 SDK 환경설정을 지정합니다 (아래 구성 옵션 참조)
-
함수 호출:
UI 설정 이후, 이벤트 로깅 이전에
onCreate()에서initSingularSDK()를 호출합니다
기본 구현
기본 구성으로 초기화 메서드를 생성합니다.
private fun initSingularSDK() {
// Configure Singular with SDK key and secret
val config = SingularConfig("SDK KEY", "SDK SECRET")
try {
Singular.init(applicationContext, config)
Log.d("Singular", "SDK initialized successfully")
} catch (e: Exception) {
Log.e("Singular", "SDK initialization failed: ${e.message}")
}
}
private void initSingularSDK() {
// Configure Singular with SDK key and secret
SingularConfig config = new SingularConfig("SDK KEY", "SDK SECRET");
try {
Singular.init(getApplicationContext(), config);
Log.d("Singular", "SDK initialized successfully");
} catch (Exception e) {
Log.e("Singular", "SDK initialization failed: " + e.getMessage());
}
}
MainActivity의 onCreate에서 호출
MainActivity의
onCreate()
메서드에서 초기화 메서드를 호출합니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initialize Singular SDK
initSingularSDK()
// Proceed with your app setup (e.g., UI initialization)
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize Singular SDK
initSingularSDK();
// Proceed with your app setup (e.g., UI initialization)
}
구현 가이드라인
SDK 초기화를 구현할 때 다음 핵심 가이드라인을 따르세요.
- 배치 위치: 올바른 세션 트래킹을 보장하기 위해 초기화 메서드를 Application 클래스가 아닌 MainActivity에 추가합니다
- 오류 처리: try-catch 블록은 초기화 오류(예: 잘못된 자격 증명)를 앱 충돌 없이 로깅합니다
- 딥링크: 딥링크(앱을 실행하는 URL)를 처리하려면 추가 설정 방법은 딥링크 지원 을 참조하세요
-
META Install Referrer:
Meta Install Referrer 어트리뷰션
을 활성화하려면
config.withFacebookAppId("FacebookAppID")을 추가합니다
2025년 6월 18일부로 , Meta의 Advanced Mobile Measurement Reporting (AMM) 은 Meta Install Referrer 구현의 필요성을 제거합니다. AMM 보고가 활성화되어 있는 경우 Meta Install Referrer를 구현하지 않는 것을 권장합니다.
Pro Tip:
앱이 여러 진입점(예: 딥링크)을 지원하는 경우, 일관된 동작을 보장하기 위해
각 관련 Activity의
onCreate()
에서
initSingularSDK()
가 호출되도록 하세요.
구성 옵션
SingularConfig 메서드
SingularConfig 객체를 통해 체이닝 가능한 구성 메서드를 사용하여 SDK 동작을 사용자 지정할 수 있습니다. 사용 가능한 모든 옵션은 아래 표를 참조하세요.
| 메서드 | 설명 |
|---|---|
.withFacebookAppId(String facebookAppID)
|
Facebook App ID를 구성합니다.
Meta Install Referrer 어트리뷰션
에 필수입니다.
자세한 내용은
앱의 Facebook App ID는 어디서 확인할 수 있나요?
를 참조하세요.
2025년 6월 18일부로 , Meta의 Advanced Mobile Measurement Reporting (AMM) 은 Meta Install Referrer 구현의 필요성을 제거합니다. AMM 보고가 활성화되어 있는 경우 Meta Install Referrer를 구현하지 않는 것을 권장합니다. |
.withCustomUserId(String customId)
|
유저 ID를 Singular에 전송합니다 |
.withSingularLink(Intent intent, SingularLinkHandler handler)
.withSingularLink(Intent intent, SingularLinkHandler handler, long shortlinkTimeoutSec)
|
Singular Links로 딥링크를 활성화합니다. Singular 인자 오버로드는 기본적으로
10초 short link 해결 타임아웃을 사용합니다. 이를 재정의하려면
세 개 인자 오버로드를 사용하세요. 이 호출은 deferred deep link도 처리하므로,
별도의
withDDLHandler
/
withDDLTimeoutInSec
구성은 더 이상 필요하지 않습니다.
|
.withOpenURI(URI openURI)
|
intent에서 URI를 가져옵니다 (Singular에서 시작되지 않은 링크를 통해 앱이 열릴 때 딥링크를 처리하기 위함) |
.withGlobalProperty(String key, String value, boolean overrideExisting)
|
전역 속성에 주어진 값을 설정합니다. key와 value는 앱에서 전송되는 모든 이벤트/세션과 함께 Singular에 전송됩니다 |
.withSessionTimeoutInSec(long timeout)
|
세션 타임아웃을 설정합니다 |
.withFCMDeviceToken(String token)
|
첫 번째 세션에 전송할 FCM 토큰을 설정합니다 |
.withLoggingEnabled()
|
로깅을 활성화합니다 |
.withLogLevel(int level)
|
로깅 레벨을 구성합니다 (기본값은 Log.ERROR) |