Skip to content

Android SDK Initialization ​

Initialization Timing ​

The UjuAd SDK must be initialized in your Application class's onCreate() method to ensure it's ready when the app starts and prepared for subsequent ad loading.

Basic Initialization ​

1. Create Application Class with Initialization ​

If your app doesn't have a custom Application class, create one:

kotlin
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        initializeSdk()
    }

    private fun initializeSdk() {
        // Create config object
        val config = UjuAdInitConfig(
            appId = "YOUR_APP_ID", // Required, app ID
            appKey = "YOUR_APP_KEY", // Required, RSA public key from dashboard, pass as-is
            channel = "test_channel", // Required, channel ID for stats and revenue
            subChannel = "test_sub_channel", // Optional, sub-channel
            isDebug = false, // Debug mode, recommended during development
            wxAppId = "wx_xxxxx", // WeChat AppId for WeChat ad channel
            // Preset strategy
            presetStrategyFileName = "placement_config.json",
            // Privacy config: developer can pass AndroidId, SDK won't auto-collect
            privacyConfig = UjuPrivacyConfig(
                androidId = getAndroidId(this)
            )
        )

        // Step 1: Initialize
        UjuAdSdk.init(this, config)

        // Step 2: Start SDK with callback listener
        UjuAdSdk.start(object : BaseInitListener {
            override fun onInitSuccess() {
                // SDK started successfully, ready to load ads
            }

            override fun onInitFailed(error: UjuException) {
                // Handle initialization failure
                Log.e("UjuAd", "SDK init failed: ${error.message}")
            }
        })
    }
}

2. Configuration Parameters ​

ParameterTypeRequiredDescription
appIdStringYesApp ID from UjuAd dashboard
appKeyStringYesRSA public key from UjuAd dashboard, pass as-is
channelStringYesChannel ID for stats and revenue allocation, no default
subChannelStringNoSub-channel for finer segmentation, default ""
isDebugBooleanNoDebug mode toggle, recommended during development, default false
wxAppIdStringNoWeChat AppId for WeChat ad channel
presetStrategyFileNameStringNoPreset strategy filename, e.g. "placement_config.json", for local preset ad strategy
privacyConfigUjuPrivacyConfigNoPrivacy config, developer can pass AndroidId to prevent SDK auto-collection
personalizationUjuPersonalizedConfigNoPersonalization config, requires user consent

3. Personalization Config ​

UjuPersonalizedConfig provides user data for personalized ad strategies. Must only be passed after obtaining user consent:

FieldTypeRequiredDescription
userIdStringYesUnique user identifier
userAgeIntYesUser age, e.g. 25
userGenderIntNoGender: 0 unknown (default) / 1 male / 2 female
userKeywordsList<String>NoUser tag keywords, e.g. ["game","sports"], default empty
kotlin
// Example: Pass personalization config after user consent
val personalization = UjuPersonalizedConfig(
    userId = "user_123",
    userAge = 25,
    userGender = 1, // 1=male, 2=female, 0=unknown
    userKeywords = listOf("game", "sports")
)
val config = UjuAdInitConfig(
    appId = "YOUR_APP_ID",
    appKey = "YOUR_APP_KEY", // RSA public key
    channel = "YOUR_CHANNEL",
    personalization = personalization
)

Update Channel Info ​

After initialization, you can dynamically update channel and sub-channel via updateChannel:

kotlin
// Update channel info
UjuAdSdk.updateChannel("new_channel", "new_sub_channel")

Check Initialization State ​

You can check the SDK initialization state at any time:

kotlin
// Check if SDK has completed init (phase 1)
if (UjuAdSdk.isSdkInitialized()) {
    // SDK initialized, ready to load ads
}

Other Public Methods ​

Besides init/start/updateChannel, UjuAdSdk provides:

MethodReturnDescription
isSdkInitialized()BooleanWhether SDK completed init (phase 1)
getVersion()StringGet SDK version
getOAID()StringGet device OAID
getGoogleAdId()StringGet Google Advertising ID
getInitializeState()UjuAdInitStatusInit state enum (IDLE/INITIALIZING/INITIALIZED/INITIALIZATION_FAILED)
getAppId()StringGet current app ID
destroy()voidRelease SDK resources
kotlin
// Get SDK version
val version = UjuAdSdk.getVersion()
Log.d("UjuAd", "SDK version: $version")

// Get initialization state enum
val state = UjuAdSdk.getInitializeState()
when (state) {
    UjuAdInitStatus.IDLE -> Log.d("UjuAd", "Not initialized")
    UjuAdInitStatus.INITIALIZING -> Log.d("UjuAd", "Initializing")
    UjuAdInitStatus.INITIALIZED -> Log.d("UjuAd", "Initialized")
    UjuAdInitStatus.INITIALIZATION_FAILED -> Log.d("UjuAd", "Init failed")
}

ProGuard Configuration ​

If your app uses code obfuscation, add the following rules to proguard-rules.pro.

UJU AD-SDK Core Rules (Required) ​

groovy
# UJU AD-SDK ProGuard
-keep class com.ujusdk.**. *AdapterFactory {
    public <init>();
    *;
}

-keep class com.ujusdk.adcore.api.base.BaseAdapterFactory { *; }

OAID Rules (Required) ​

groovy
# OAID ProGuard
-keep class repeackage.com.uodis.opendevice.aidl.** { *; }
-keep interface repeackage.com.uodis.opendevice.aidl.** { *; }
-keep class repeackage.com.asus.msa.SupplementaryDID.** { *; }
-keep interface repeackage.com.asus.msa.SupplementaryDID.** { *; }
-keep class repeackage.com.bun.lib.** { *; }
-keep interface repeackage.com.bun.lib.** { *; }
-keep class repeackage.com.heytap.openid.** { *; }
-keep interface repeackage.com.heytap.openid.** { *; }
-keep class repeackage.com.samsung.android.deviceidservice.** { *; }
-keep interface repeackage.com.samsung.android.deviceidservice.** { *; }
-keep class repeackage.com.zui.deviceidservice.** { *; }
-keep interface repeackage.com.zui.deviceidservice.** { *; }
-keep class repeackage.com.coolpad.deviceidsupport.** { *; }
-keep interface repeackage.com.coolpad.deviceidsupport.** { *; }
-keep class repeackage.com.android.creator.** { *; }
-keep interface repeackage.com.android.creator.** { *; }
-keep class repeackage.com.google.android.gms.ads.identifier.internal.** { *; }
-keep interface repeackage.com.google.android.gms.ads.identifier.internal.* { *; }
-keep class repeackage.com.oplus.stdid.** {*; }
-keep interface repeackage.com.oplus.stdid.** {*; }
-keep class com.huawei.hms.ads.** {*; }
-keep interface com.huawei.hms.ads.** {*; }
-keep class com.hihonor.ads.** {*; }
-keep interface com.hihonor.ads.** {*; }
-keep class repeackage.com.qiku.id.** { *; }
-keep interface repeackage.com.qiku.id.** { *; }

Gromore Aggregation Rules (Optional — skip if not using Gromore) ​

groovy
# Gromore aggregation, skip if not using gromore
-keep class bykvm*.**
-keep class com.bytedance.msdk.adapter.**{ public *; }
-keep class com.bytedance.msdk.api.** {
public *;
}

Baidu SDK Rules (Optional — skip if not using Baidu) ​

groovy
# baidu sdk, skip if not using baidu sdk
-ignorewarnings
-dontwarn com.baidu.mobads.sdk.api.**
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class com.baidu.mobads.** { *; }
-keep class com.style.widget.** {*;}
-keep class com.component.** {*;}
-keep class com.baidu.ad.magic.flute.** {*;}
-keep class com.baidu.mobstat.forbes.** {*;}

Kuaishou SDK Rules (Optional — skip if not using Kuaishou) ​

groovy
# ks, skip if not using ks sdk
-keep class org.chromium.** {*;}
-keep class org.chromium.** { *; }
-keep class aegon.chrome.** { *; }
-keep class com.kwai.**{ *; }
-keep class com.yxcorp.kuaishou.addfp.android.Orange {*;}
-dontwarn com.kwai.**
-dontwarn com.kwad.**
-dontwarn com.ksad.**
-dontwarn aegon.chrome.**

WeChat SDK Rules (Optional — skip if not using WeChat mini-game) ​

groovy
# If integrating WeChat mini-game, add these keep rules
-keep class com.tencent.mm.opensdk.** {
    *;
}
-keep class com.tencent.wxop.** {
    *;
}
-keep class com.tencent.mm.sdk.** {
    *;
}

FAQ ​

Q: What to do if initialization fails? ​

A: Possible causes:

  • Network issues: Check network connection
  • Wrong App ID/Key: Verify App ID and App Key
  • Device restrictions: Some devices may be restricted
  • Version issues: Check SDK version compatibility

Q: How to improve initialization success rate? ​

A: Recommendations:

  • Initialize as early as possible in Application.onCreate()
  • Ensure stable network connection
  • Avoid heavy operations during initialization
  • Handle initialization failure properly

Q: How to handle AndroidId in privacyConfig? ​

A: Developers should obtain AndroidId and pass it via UjuPrivacyConfig. When provided, the SDK uses the developer-supplied ID instead of auto-collecting device IDs, which helps meet privacy compliance requirements.

Best Practices ​

  1. Initialize early: In Application.onCreate() to ensure ads are ready
  2. Handle failures: Add failure callback to ensure app runs normally on init failure
  3. Test mode: Use test devices and test ads during development, set isDebug = true
  4. Monitor init: Monitor initialization success rate in production
  5. Version management: Keep SDK version up to date
  6. Privacy compliance: Pass AndroidId via privacyConfig per privacy policy
  7. ProGuard: Add corresponding rules based on actual ad channels integrated

Next Steps ​

After SDK initialization, start integrating ad types: