Android SDK - 基础集成

视频指南可用

观看本视频以获取集成流程的详细演示。 为获得最佳效果,请同时使用视频和下方的书面指南。


前置条件

在继续此集成之前,请先完成 Singular SDK 集成:规划与前置条件 中的步骤。

重要: 任何 Singular SDK 集成都必须完成这些前置条件步骤。


安装

安装方法

注意: Android Studio 现在对新项目默认使用 Kotlin DSL (build.gradle.kts)。 下方所有代码示例同时展示了 Kotlin DSL(推荐) Groovy DSL 两种格式。

方法 1:Gradle(推荐)

方法 1:Gradle(推荐)

添加 SDK 仓库

在项目的依赖管理中配置 Singular Maven 仓库。

注意: 从 Gradle 7 开始,Android 推荐在 settings.gradle settings.gradle.kts 中使用集中式的仓库声明,而不是在项目或模块级别的 build.gradle 中声明。

Gradle 7+ 配置

将 Singular SDK 仓库添加到 settings 文件中:

settings.gradle.kts (Kotlin DSL - 推荐) settings.gradle (Groovy DSL)
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://maven.singular.net/")
        }
    }
}

较旧的 Gradle 版本

对于较旧的 Gradle 版本,请将仓库添加到项目级别的构建文件中:

build.gradle.kts (Kotlin DSL - 推荐) build.gradle (Groovy DSL)
repositories {
    mavenCentral()
    maven {
        url = uri("https://maven.singular.net/")
    }
}

添加 Singular 库依赖项

将 Singular 库添加到应用模块的依赖项中。

app/build.gradle.kts (Kotlin DSL - 推荐) app/build.gradle (Groovy DSL)
dependencies {
    implementation("com.singular.sdk:singular_sdk:12.14.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 或导致冲突的其他依赖项中 排除冲突的传递依赖。

app/build.gradle.kts (Kotlin DSL - 推荐) app/build.gradle (Groovy DSL)
dependencies {
    // Exclude specific Google Play Services modules from Singular SDK
    implementation("com.singular.sdk:singular_sdk:12.14.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")
}

全局排除规则

如果重复类冲突影响项目中的多个依赖项,可以应用全局排除规则。

app/build.gradle.kts (Kotlin DSL - 推荐) app/build.gradle (Groovy DSL)
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 依赖项。

app/build.gradle.kts (Kotlin DSL - 推荐) app/build.gradle (Groovy DSL)
dependencies {
    implementation("store.galaxy.samsung.installreferrer:samsung_galaxystore_install_referrer:4.0.0")
}

传递依赖项

如果你已为 Singular SDK 禁用传递依赖项, 请手动将以下必需的库添加到应用模块的依赖项中。

app/build.gradle.kts (Kotlin DSL - 推荐) app/build.gradle (Groovy DSL)
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 或更高版本, 请添加以下依赖项。

app/build.gradle.kts (Kotlin DSL - 推荐) app/build.gradle (Groovy DSL)
dependencies {
    implementation("com.google.android.gms:play-services-ads-identifier:17.0.0")
}
方法 2:手动安装

替代安装方法

手动下载

下载并手动将 SDK AAR 文件集成到你的项目中。

  1. 下载 SDK: 从本页顶部的链接下载 SDK
  2. 解压并添加到 libs: 解压 SDK 包,并将 Singular.aar 添加到 Android 项目的 libs 目录中
  3. 创建 libs 目录: 如果不存在,请在项目文件夹中创建一个名为 libs 的目录(通常位于 <project>/app/libs )
方法 3:Maven 安装

Maven 安装

将 Singular Maven 仓库添加到项目的 pom.xml 文件中。

pom.xml
<project ...>
    <repositories>
        <repository>
            <id>singular.net</id>
            <url>http://maven.singular.net/</url>
        </repository>
    </repositories>
</project>

添加依赖项:

pom.xml
<dependency>
    <groupId>com.singular.sdk</groupId>
    <artifactId>singular_sdk</artifactId>
    <version>12.14.0</version>
</dependency>
方法 4:Eclipse 安装

Eclipse 安装

按照以下步骤使用 Eclipse 集成 SDK。

你可以使用 Eclipse AAR 插件: gradle-eclipse-aar-plugin

如果你不想使用该插件,请按照以下步骤操作:

  1. 解压 AAR: 解压 singular_sdk-12.14.0.aar
  2. 重命名 JAR 文件: classes.jar 重命名为 singular_sdk-12.14.0.jar (这是 SDK 的主 jar)
  3. 添加 install referrer: com.android.installreferrer:installreferrer:2.2 库添加到你的项目中
  4. 复制权限: 将 AAR 中包含的 AndroidManifest.xml 中的 BIND_GET_INSTALL_REFERRER_SERVICE 权限复制到你自己的 AndroidManifest.xml
  5. 复制许可证权限: 将 AAR 中包含的 AndroidManifest.xml 中的 CHECK_LICENSE 权限复制到你自己的 AndroidManifest.xml

ProGuard 配置

ProGuard 规则

将以下规则添加到 proguard.config 文件中,以避免代码混淆问题。

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> 标签下。

AndroidManifest.xml
<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 中添加以下内容。

AndroidManifest.xml
<queries>
    <package android:name="com.sec.android.app.samsungapps" />
</queries>

SDK 集成

隐私合规: 在实施 Singular SDK 时,请遵守你所在业务地区生效的隐私法规, 包括 GDPR、CCPA 和 COPPA。请参阅 SDK Opt-In 和 Opt-Out 实践 以获取相关指引。

导入 Singular SDK

添加导入语句

在 MainActivity 文件中导入 Singular 库。

Kotlin Java
import com.singular.sdk.*

初始化 SDK

创建初始化函数

要启用会话追踪和归因,请创建一个 private 方法并在 MainActivity 的 onCreate() 方法中调用它,从而在每次应用启动时初始化 Singular SDK。

请按照以下步骤操作:

  1. 添加函数: 将初始化方法放在 MainActivity 类(或任何入口 Activity)内
  2. 插入凭据: SDK KEY SDK SECRET 替换为你 dashboard 中的 Singular SDK key 和 secret
  3. 更新 SingularConfig: 在初始化 SDK 之前,创建一个 SingularConfig 对象并设置任何 SDK 偏好 (请参阅下方的配置选项)
  4. 调用函数: 在 UI 设置之后、记录事件之前,在 onCreate() 中调用 initSingularSDK()

基础实现

使用基础配置创建初始化方法。

Kotlin Java
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}")
    }
}

从 MainActivity onCreate 调用

在 MainActivity 的 onCreate() 方法中调用初始化方法。

Kotlin Java
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)
}

实施指南

在实施 SDK 初始化时,请遵循以下关键指南。

  • 放置位置: 将初始化方法添加到 MainActivity 中,而不是 Application 类中, 以确保正确的会话追踪
  • 错误处理: try-catch 代码块可在不让应用崩溃的情况下记录初始化错误 (例如无效凭据)
  • 深度链接: 要处理深度链接(用于启动你的应用的 URL),请参阅 深度链接支持 以了解扩展配置
  • META Install Referrer: 添加 config.withFacebookAppId("FacebookAppID") 以启用 Meta Install Referrer 归因

自 2025 年 6 月 18 日起 ,Meta 的 Advanced Mobile Measurement Reporting (AMM) 已不再需要实施 Meta Install Referrer。如果已启用 AMM 报告, 不建议再实施 Meta Install Referrer。

专业提示: 如果你的应用支持多个入口点(例如深度链接), 请确保在每个相关 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 启用深度链接。带一个参数的重载方法默认使用 10 秒的短链接解析超时;若要覆盖此值,请使用带三个参数的重载方法。此调用还 会处理延迟深度链接,因此不再需要单独配置 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 token
.withLoggingEnabled() 启用日志
.withLogLevel(int level) 配置日志级别(默认为 Log.ERROR)