Tenjin的android原生SDK #
Tenjin Android SDK允许客户在他们的Android应用程序中跟踪事件和安装。 要了解有Tenjin和我们产品的更多信息,请访问https://www.tenjin.com.
- 请查看我们的发行说明中的版本详情和变化。
- 我们推荐使用最新的Android Studio
- 对于Unity集成,请在这里查看详细内容:
https://github.com/tenjin/tenjin-unity-sdk. - 如果有任何技术问题或需要支持,请邮件至 support@tenjin.com, 我们有遍布全球的支持团队为你服务。
基础设置 #
手动安装 #
请遵循下方“Android Studio”一节中列出的步骤。
Maven #
如果您使用Maven,就只需添加com.tenjin:android-sdk:{VERSION}到Gradle依赖项中,如果源存储库中尚不存在,请同时添加mavenCentral()。
Android工作室 #
- 点击这里下载最新版的Android SDK。
- 将Tenjin SDK添加到Android Studio中,在Android Studio中进入Project Navigator, 选择
Project,你将在Android Studio project里的app模块下看到libs文件夹 。 - 你需要将
tenjin.jar或tenjin.aar文件添加到libs文件夹中。
- 在你的Android Studio项目的
app模块,选择build.gradle文件,确保将以下添加到dependencies block 中:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation files('libs/tenjin.aar')
}可参考我们的demo项目 - tenjin-android-sdk-demo,可以将此项目作为示例,来理解如何集成tenjin-android-sdk。
Google Play或Amazon应用商店 #
如果你在Google Play或者Amazon应用商店发布你的App,请参考以下进行设置:
权限 #
Tenjin SDK需要以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Required to get network connectivity (i.e. wifi vs. mobile) -->Google Play服务要求所有在目标API级别设置为32(Android 13)以上、使用advertising_id(Android Advertising ID (AAID))的应用 。必须在Manifest文件中声明Google Play服务的AD_ID 权限(如下所示)。
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>AndroidAdvertising ID (AAID)和Install Referrer #
在你的build.gradle文件中添加Android Advertising ID (AAID) 和 Install Referrer库。
dependencies {
implementation 'com.google.android.gms:play-services-ads-identifier:{version}'
implementation 'com.android.installreferrer:installreferrer:{version}'
}为了能够收集Meta’s Install Referrer, 请将以下查询添加到您的Android Manifest中
<queries>
<package android:name="com.facebook.katana" />
</queries>
<queries>
<package android:name="com.instagram.android" />
</queries>接下来,在你的strings.xml文件中添加以下值:
<string name="facebook_app_id" translatable="false">YOUR_META_APP_ID</string>应用商店类型 #
默认情况下,unspecified为默认的应用商店。请根据你的应用情况,将应用商店的值更新为googleplay或amazon。
AndroidManifest.xml:
<meta-data
android:name="TENJIN_APP_STORE"
android:value="googleplay" />setAppStore():
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
instance.setAppStore(TenjinSDK.AppStoreType.googleplay);应用商店类型选项 #
TenjinSDK.AppStoreType.googleplay // Google Play App Store
TenjinSDK.AppStoreType.amazon // Amazon AppStore
TenjinSDK.AppStoreType.other // OtherApp初始化 #
- 您可以在App页面获取
SDK_KEY。 请注意:每个应用的SDK_KEY都是唯一的,您可以为每个应用生成最多3个SDK_KEY。

- 在Activity中导入Tenjin
import com.tenjin.android.TenjinSDK; - 在你的主
Activity类onResume方法中,需要添加如下代码:
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
instance.connect();注意: 如果您的应用在onCreate和 onResume之间包含请求用户授权的逻辑,请改用onCreate(而非onResume),来初始化Tenjin SDK,因为对于哪些未同意隐私条款的用户,系统将不会在onResume中进行追踪。
注意:请确保你在每次onResume中都会实施这段代码,而不仅仅是在应用首次打开时。
其他Android应用商店 #
如果你在除了Google、Amazon以外其他的安卓应用商店发布产品,请参照以下设置:
权限 #
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Required to get network connectivity (i.e. wifi vs. mobile) -->谷歌商店要求所有Android 13系统(API级别32)及以上系统中使用advertising_id(Android Advertising ID (AAID))的应用,在manifest文件中声明谷歌商店AD_ID的权限(如下所示)。
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>AndroidAdvertising ID (AAID)和Install Referrer #
在你的build.gradle文件中添加Android Advertising ID (AAID) 和 Install Referrer库。
dependencies {
implementation 'com.google.android.gms:play-services-ads-identifier:{version}'
implementation 'com.android.installreferrer:installreferrer:{version}'
}如果你使用的广告渠道对IMEI进行定位,那么需要添加以下权限启用。(如果你的应用计划在Google Play上架,不要添加此权限。)
<uses-permission android:name="android.permission.READ_PHONE_STATE" />OAID #
Tenjin支持使用Android OAID在其他Android商店渠道推广App。我们有以下用于集成OAID库的选项。
MSA OAID #
MSA OAID是由MSA library提供的\用于中国制造设备的advertising ID,如需进行集成,你需要下载 oaid\_sdk\_1.0.25.aar和 supplierconfig.json.
在项目gradle文件中添加以下内容:
implementation files('libs/oaid_sdk_1.0.25.aar')并确保在项目中复制了supplierconfig.json文件到 assets 。
Huawei OAID (华为海外) #
对于中国以外的地区,你可以使用华为OAID库来收集OAID。如需与华为OAID库进行集成,请将以下内容添加到你的项目中:
在build.gradle文件中,为华为SDK添加Maven address:
allprojects {
repositories {
google()
maven { url 'https://developer.huawei.com/repo/' }
}
}dependencies {
implementation 'com.huawei.hms:ads-identifier:{version}'
}Huawei Install Referrer #
如果华为 Huawei App Gallery进行推广,请将上面的Huawei OAID SDK和Install Referrer库都进行添加。
dependencies {
implementation 'com.huawei.hms:ads-identifier:{version}'
implementation 'com.huawei.hms:ads-installreferrer:{version}'
}
应用商店类型 #
App Store默认值为unspecified。 更新App商店值设为other
AndroidManifest.xml:
<meta-data
android:name="TENJIN_APP_STORE"
android:value="other" />setAppStore():
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
instance.setAppStore(TenjinSDK.AppStoreType.other);App初始化 #
- 您可以在App页面获取
SDK_KEY。 请注意:每个应用的SDK_KEY都是唯一的,您可以为每个应用生成最多3个SDK_KEY。

- 在Activity中导入Tenjin
import com.tenjin.android.TenjinSDK; - 在你的主
Activity类onResume方法中,需要添加如下代码:
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
instance.connect();注意:请确保在每一次都执行了这段代码,而不仅仅是在应用首次打开时。如果我们发现您未按照要求遵循此建议,我们将无法为你提供正常的技术支持,我们会暂停支持并停用您的账户。onResume
Proguard设置 #
-keep class com.tenjin.** { *; }
-keep public class com.google.android.gms.ads.identifier.** { *; }
-keep public class com.google.android.gms.common.** { *; }
-keep public class com.android.installreferrer.** { *; }
-keep class * extends java.util.ListResourceBundle {
protected java.lang.Object[][] getContents();
}
# Keep the signatures that Gson/TypeToken rely on
-keepattributes Signature
-keepattributes *Annotation*
# General Gson/TypeToken protection
-keep class com.google.gson.reflect.TypeToken { *; }
-keep class * extends com.google.gson.reflect.TypeToken请不要混淆oaid类:
-keep class XI.CA.XI.**{*;}
-keep class XI.K0.XI.**{*;}
-keep class XI.XI.K0.**{*;}
-keep class XI.xo.XI.XI.**{*;}
-keep class com.asus.msa.SupplementaryDID.**{*;}
-keep class com.asus.msa.sdid.**{*;}
-keep class com.bun.lib.**{*;}
-keep class com.bun.miitmdid.**{*;}
-keep class com.huawei.hms.ads.identifier.**{*;}
-keep class com.samsung.android.deviceidservice.**{*;}
-keep class com.zui.opendeviceidlibrary.**{*;}
-keep class org.json.**{*;}
-keep public class com.netease.nis.sdkwrapper.Utils {public <methods>;}如果你使用华为库,你可以使用以下设置:
-keep class com.huawei.hms.ads.** { *; }
-keep interface com.huawei.hms.ads.** { *; }附加集成 #
GDPR #
通用数据保护条例 (EU) (GDPR) 是欧盟法律中关于欧盟 (EU) 和欧洲经济区 (EEA) 数据保护和隐私的条例。
您需要在第一次打开应用程序时获得用户同意是否允许跟踪,然后将结果写入checkOptInValue()。 之后,您可以按照以下代码进行操作。 如果您不需要在您的应用程序中遵守GDPR,请忽略这整个部分。
作为GDPR合规的一部分,使用Tenjin SDK,你可以为设备和用户选择加入或者推出(opt-in/opt-out),或依据特定于设备的相关参数选择要加入或退出。optOut()不会向Tenjin发送任何API请求,我们也不会处理任何事件。
选择opt-in/opt-out:
import com.tenjin.android.TenjinSDK;
public class TenjinDemo extends ActionBarActivity {
@Override
public void onResume() {
//standard code
super.onResume()
//Integrate TenjinSDK connect call
String apiKey = " ";
TenjinSDK instance = TenjinSDK.getInstance(this, apiKey);
boolean userOptIn = checkOptInValue();
if (userOptIn) {
instance.optIn();
}
else {
instance.optOut();
}
instance.connect();
//Your other code...
//...
}
protected boolean checkOptInValue(){
// check opt-in value
// return true; // if user opted-in
return false;
}
}要选择加入/退出特定的设备相关参数,可以使用 optInParams() 或 optOutParams()</code。
OptInParams()将仅发送指定的设备相关参数.OptOutParams()将发送除指定参数外的所有与设备相关的参数。- 请注意,我们至少需要以下参数来正确地对设备进行追踪监测:
advertising_id
- 如果你使用依赖 IMEI 和/或 OAID 的广告渠道,以下参数为必须:
imeioaid
- 如果你计划使用 Google AdWords, 以下参数为必需项:
platformos_versionapp_versionlocaledevice_modelbuild_idadvertising_id
如果只想获取设备相关的特定参数,使用optInParams(),以下样例中,仅使用了设备相关的参数 ip_address, advertising_id, limit_ad_tracking, 和referrer.
String apiKey = " ";
TenjinSDK instance = TenjinSDK.getInstance(this, apiKey);
String[] optInParams = {"ip_address", "advertising_id", "limit_ad_tracking", "referrer"};
instance.optInParams(optInParams);
instance.connect();如果你想要发送除特定设备相关参数以外的所有参数,使用OptOutParams(),如下样例中,我们会发送所有相关的参数除了:
String apiKey = " ";
TenjinSDK instance = TenjinSDK.getInstance(this, apiKey);
String[] optOutParams = {"locale", "timezone", "build_id"};
instance.optOutParams(optOutParams);
instance.connect();Opt in/out using CMP #
您可以使用CMP (目的 1)的条款,实现自动选择opt in/out功能,并返回布尔值(boolean)。该功能基于用户设备中已存储的信息,无需额外交互。
optInOutUsingCMP()
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
optInOut = instance.optInOutUsingCMP(); 设备层级数据 #
| 参数 | 说明 |
|---|---|
| ip_address | IP 地址 |
| advertising_id | 设备的广告标识符 |
| limit_ad_tracking | 设备是否限制广告追踪 |
| oaid | 启用 Advertising ID 广告标识符 |
| imei | 设备的 IMEI |
| platform | 平台 |
| referrer | Google Play Install Referrer |
| os_version | 操作系统版本 |
| device | 设备名称 |
| device_manufacturer | 设备名称 |
| device_model | 设备型号 |
| device_brand | 设备品牌 |
| device_product | 设备产品 |
| carrier | 电话运营商 |
| connection_type | 移动流量或 Wifi |
| screen_width | 设备屏幕宽度 |
| screen_height | 设备屏幕高度 |
| os_version_release | 操作系统版本 |
| build_id | 包名 |
| locale | 设备区域设置 |
| country | 设备国家设置 |
| timezone | timezone |
购买事件 #
理解用户收入和购买行为,你可以发送transaction事件到 Tenjin,Tenjin 将为你的transaction收据进行验证。
请注意: 请在 Tenjin面板上,找到对应应用的设置,并添加您public key。 添加的路径:Tenjin dashboard >对应APP > Edit 可以从 Google Play Developer Console \>页面获取Public key 具体路径为: Select your app > Monetize > Monetization setup > Google Play Billing > Licensing: Base64-encoded RSA public key

在 Tenjin 面板上添加好 Public Key 后,你可以使用以下方法:
public void transaction(String productId, String currencyCode, int quantity, double unitPrice, String purchaseData, String dataSignature)例如
public void sendPurchaseEvent(Purchase purchase, Double price, String currencyCode) {
String sku = purchase.getSku();
String purchaseData = purchase.getOriginalJson();
String dataSignature = purchase.getSignature();
TenjinSDK instance = getTenjinInstance();
instance.transaction(sku, currencyCode, 1, price, purchaseData, dataSignature);
}你可以通过我们的Live Test Device Data Tool来验证内购收据,你将会看到类似以下内容:
在上报购买到 Tenjin 之前,请先 'acknowledge / 确认' 该笔交易。具体详情,请参见谷歌的要求
通过我们的新设置,您可以选择0%、 15% 到 30% 的 App Store 收入佣金。 步骤是:
- 前往CONFIGURE –> Apps
- 单击您想要更改的应用程序
- 在“App Store Commission”部分下单击“Edit”
- 在0%、15%或30%中选择您想要的应用商店佣金比例。
- 选择开始日期和结束日期(或者,如果您不需要结束日期,可以将结束日期留空)
- 点击“Save”保存(注意:佣金设置只会应用于变更日期之后的数据,历史数据不会受影响。因此请将开始日期设置为修改当天及之后的日期)。
Amazon 商店
Amazon商店内购收据验证需要receiptId 和 userId字段.
重要提示: 你需要将 Amazon 密钥添加至Tenjin面板。 你可以在开发者账户 Amazon Appstore account里查看相应的密钥。
自定义事件 #
注意: connect()事件的初始化必须在自定义事件之前进行上报。
重要:自定义事件名称请限制在80个字符以内。自定义事件的数量不得超过500个。
你可以使用 Tenjin SDK 上报自定义事件: eventWithName(String name).
通过 Tenjin服务,你可以通过自定义事件,将买量的渠道和成本和应用内的交互进行关联绑定,示例如下:
String apiKey = <SDK_KEY>;
TenjinSDK instance = TenjinSDK.getInstance(this, apiKey);
//Integrate a custom event with a distinct name - ie. swiping right on the screen
instance.eventWithName("swipe_right");赋值的自定义事件 #
你可以使用 Tenjin SDK 上报值为整数的自定义事件: eventWithNameAndValue(String name, int value).
上报一个有name (名称)的自定义事件, value(值)需为整数,你可以直接在面板上查看汇总和跟踪的平均值。如果你计划使用 Datavault,这些数值可以被用在更多有用的的指标计算上。
String sdkKey = <SDK_KEY>;
TenjinSDK.instance = TenjinSDK.getInstance(this, sdkKey);
//Integrate a custom event with a distinct name and value - ie. paying 100 virtual coins for an item
instance.eventWithNameAndValue("item", 100);通过以上的样例, Tenjin 面板可以在对应的自定义事件名称下,汇总并平均对应的值。 item.
请注意,如果这个值不是整数,目前面板是不会显示的。
//Integrate a custom event with a distinct name and value - ie. paying 100 virtual coins for an item
instance.eventWithNameAndValue("item", "1");S2S 服务端集成 #
Tenjin提供s2s服务端集成。这允许你直接从自己的服务器向Tenjin服务器发送安装和安装后事件,无需集成SDK。
应用子版本及 A/B 测试(需要DataVault) #
如果你想进行 A/B 测试并查看差异报告,我们可以使用appendAppSubversion方法将数字值附加到你的应用程序版本中。例如,如果你的应用程序版本 1.0.1设置了appendAppSubversion: @8888,就可以上报 App version 为1.0.1.8888的数据。
这些数据将在 DataVault 中,你可以通对应的过 subversion 值来查看报告。
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
instance.appendAppSubversion(8888);
instance.connect();动态运营LiveOps #
Tenjin支持通过SDK获取用户的Attribution(归因)信息,例如来源广告渠道和campaign。这使开发者能够实时收集并分析用户级别的归因数据。以下是使用Tenjin LiveOps Campaigns的一些可能应用场景:
- 如果您有自己的数据分析工具,S2S回调将允许您将归因数据与设备级别的游戏内数据联系起来,也就是将推广数据与应用内事件数据相联系。
- 根据用户的来源显示不同的应用程序内容。例如,用户A是自然量用户,而用户B是Facebook买量用户。由于用户B可能更喜欢您的应用程序,因此您可能希望在用户安装应用程序之后为用户B显示游戏内的特别优惠,这时就可以使用自定义回传。如果您想讨论更多具体的用例,请联系Tenjin成功经理。
LiveOps相关文档请参考这里。
用户ID #
您发送事件时可以设置自定义的用户ID。
.setCustomerUserId(userId: "user_id")
.getCustomerUserId()
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
instance.setCustomerUserId(userId: "user_id");
userId = instance.getCustomerUserId(); 分析ID Analytics Installation ID #
您可以在设备的本地储备中获取分析ID(Analytics Installation ID),该ID是随机生成的。 getAnalyticsInstallationId()
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
analyticsId = instance.getAnalyticsInstallationId; 用户画像–LiveOps指标 #
Tenjin Android SDK会自动跟踪用户参与度指标,帮助你了解玩家行为和生命周期价值。这些指标会自动收集,并且可以通过代码获取。
自动收集 #
Tenjin SDK目前会自动收集:
- 会话指标:会话次数,时长,首次、末次会话日期
- 应用内购买 (IAP):交易次数、按货币统计的收入、已购买的产品ID
- 广告收入 (ILRD):来自支持的广告渠道的展示层级广告收入。
获取用户画像数据 #
获取完整用户资料对象 #
返回一个包含所有指标的UserProfileData对象:
import com.tenjin.android.TenjinSDK;
import com.tenjin.android.userprofile.UserProfileData;
TenjinSDK instance = TenjinSDK.getInstance(this, "<SDK_KEY>");
UserProfileData profile = instance.getUserProfile();
// Session metrics
int sessionCount = profile.getSessionCount();
long totalTime = profile.getTotalSessionTime();
long avgLength = profile.getAverageSessionLength();
long lastSession = profile.getLastSessionLength();
long currentSession = profile.getCurrentSessionDuration();
Long firstSession = profile.getFirstSessionDate();
Long lastSessionDate = profile.getLastSessionDate();
// IAP metrics
int iapCount = profile.getIapTransactionCount();
Map<String, Double> revenueByCurrency = profile.getIapRevenueByCurrency();
List<String> productIDs = profile.getPurchasedProductIDs();
// ILRD metrics
double totalAdRevenue = profile.getTotalILRDRevenueUSD();
Map<String, Double> revenueByNetwork = profile.getIlrdRevenueByNetwork();可用属性(Java getters):
| Method | Return Type | 说明 |
|---|---|---|
getSessionCount() | int | 会话总次数 |
getTotalSessionTime() | long | 总时长(毫秒) |
getAverageSessionLength() | long | 平均会话时长(毫秒) |
getLastSessionLength() | long | 末次会话时长(毫秒) |
getCurrentSessionDuration() | long | 当前活跃会话时长(毫秒) |
getFirstSessionDate() | Long | 首次会话时间戳(Unix时间戳,单位:毫秒) |
getLastSessionDate() | Long | 末次会话时间戳(Unix时间戳,单位:毫秒) |
getIapTransactionCount() | int | 总内购次数 |
getIapRevenueByCurrency() | Map<String, Double> | 用货币代码获取内购收入 |
getPurchasedProductIDs() | List<String> | 产品ID |
getTotalILRDRevenueUSD() | double | 美元汇总的广告收入 |
getIlrdRevenueByNetwork() | Map<String, Double> | 来自广告渠道的广告收入 |
以键值对(Dictionary)形式返回用户数据。 #
返回一个包含所有指标的map,方便进行序列化。
Map<String, Object> profileDict = instance.getUserProfileDictionary();
// Example usage
Integer sessionCount = (Integer) profileDict.get("session_count");
String firstSession = (String) profileDict.get("first_session_date");
Map<String, Double> iapRevenue = (Map<String, Double>) profileDict.get("iap_revenue_by_currency");
List<String> productIds = (List<String>) profileDict.get("purchased_product_ids");Dictionary Keys:
| Key | 类型 | 说明 |
|---|---|---|
session_count | Integer | 会话次数 |
total_session_time | Long | 总时长(毫秒) |
average_session_length | Long | 平均会话时长(毫秒) |
last_session_length | Long | 末次会话时长(毫秒) |
iap_transaction_count | Integer | 总内购次数 |
total_ilrd_revenue_usd | Double | 美元汇总的广告收入 |
Dictionary Keys (Conditional – only if available):
| Key | 类型 | 说明 |
|---|---|---|
first_session_date | String | ISO8601格式的日期 |
last_session_date | String | ISO8601格式的日期 |
current_session_length | Long | 活跃会话时长(毫秒) |
iap_revenue_by_currency | Map<String, Double> | 货币 → 收入的映射关系 |
purchased_product_ids | List<String> | 产品ID的有序列表 |
ilrd_revenue_by_network | Map<String, Double> | 渠道 → 收入的映射关系 |
重置用户资料 #
清除所有用户资料数据
instance.resetUserProfile();会话配置 #
自定义会话超时时间(默认30分钟):
UserProfileManager.setSessionTimeoutMs(600000); // 10 minutesRetry Cache 重试逻辑 #
当请求失败或用户没有网络连接时,您可以启用/禁用重试和缓存所有事件。 这些事件将在新事件添加到队列并且用户恢复连接后发送。
.setCacheEventSetting(setting: true)
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
instance.setCacheEventSetting(setting: true);广告展示层级收益集成 #
Tenjin目前支持与以下聚合平台展示数据的集成:
- AppLovin MAX
- Unity LevelPlay
- HyperBid
- AdMob
- TopOn
- CAS
- TradPlus
此功能将允许您获取每一个广告展示的明细数据,该功能可用于广告投放渠道基于广告收益的优化策略,以及更精确的用户层级收益计算等。点击这里查看集成文档。
Google DMA 参数 #
若您已集成CMP的模式,Google DMA参数将由Tenjin SDK自动采集,且无需额外操作。若您希望取代CMP,或者构建自己的用户协议机制,您可以使用以下方法:
setGoogleDMAParameters(boolean, boolean)
TenjinSDK instance = TenjinSDK.getInstance(this, " ");
instance.setGoogleDMAParameters(adPersonalization, adUserData); 您可以选择加入或退出谷歌 DMA 参数的收集,从而管理谷歌DMA参数的收集。默认情况下会加入,但您可以使用 optInGoogleDMA 或 optOutGoogleDMA 方法轻松更改您的偏好,从而完全控制您的数据隐私设置:
instance.optInGoogleDMA();
instance.optOutGoogleDMA(); 集成测试 #
You can verify if the integration is working through our Live Test Device Data Tool. Add your advertising_id to the list of test devices. You can find this under Support -> Test Devices. Go to the Live Event Tool page and send the test events from your app. You should see live events come in:
