# Frak

object Frak

Entry point. Call [initialize](/developers/references/android/id-frak-sdk/frak/initialize/) once from `Application.onCreate`, then use [client](/developers/references/android/id-frak-sdk/frak/client/).

Java callers use `Frak.getClient()` and the `*Async` twin of every suspending member.

## Properties

| Name | Summary |
|---|---|
| [client](/developers/references/android/id-frak-sdk/frak/client/) | val [client](/developers/references/android/id-frak-sdk/frak/client/): [FrakClient](/developers/references/android/id-frak-sdk/frakclient/) |
| [clientOrNull](/developers/references/android/id-frak-sdk/frak/clientornull/) | val [clientOrNull](/developers/references/android/id-frak-sdk/frak/clientornull/): [FrakClient](/developers/references/android/id-frak-sdk/frakclient/)?<br>Same as [client](/developers/references/android/id-frak-sdk/frak/client/), but null instead of throwing. |
| [isInitialized](/developers/references/android/id-frak-sdk/frak/isinitialized/) | val [isInitialized](/developers/references/android/id-frak-sdk/frak/isinitialized/): [Boolean](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html)<br>Whether [initialize](/developers/references/android/id-frak-sdk/frak/initialize/) has run. For merchants guarding optional integrations. |

## Functions

| Name | Summary |
|---|---|
| [initialize](/developers/references/android/id-frak-sdk/frak/initialize/) | fun [initialize](/developers/references/android/id-frak-sdk/frak/initialize/)(context: Context, config: [FrakConfig](/developers/references/android/id-frak-sdk-core/frakconfig/))<br>Non-blocking, does no I/O, never throws. Second call is a no-op; first config wins. |
| [parseReferralLink](/developers/references/android/id-frak-sdk/frak/parsereferrallink/) | fun [parseReferralLink](/developers/references/android/id-frak-sdk/frak/parsereferrallink/)(url: [String](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html)): [FrakContext](/developers/references/android/id-frak-sdk-sharing/frakcontext/)?<br>Pure and static; callable before [initialize](/developers/references/android/id-frak-sdk/frak/initialize/). Only decodes — does not track arrival. |
| [shutdown](/developers/references/android/id-frak-sdk/frak/shutdown/) | suspend fun [shutdown](/developers/references/android/id-frak-sdk/frak/shutdown/)()<br>Tears the SDK down: cancels background coroutines, unregisters the deep-link observer, and drops the client so [initialize](/developers/references/android/id-frak-sdk/frak/initialize/) can run again. Not a privacy control — use [FrakClient.setTrackingEnabled](/developers/references/android/id-frak-sdk/frakclient/settrackingenabled/) for that. Idempotent; Java uses [shutdownAsync](/developers/references/android/id-frak-sdk/frak/shutdownasync/). |
| [shutdownAsync](/developers/references/android/id-frak-sdk/frak/shutdownasync/) | fun [shutdownAsync](/developers/references/android/id-frak-sdk/frak/shutdownasync/)(): [CompletableFuture](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/CompletableFuture.html)&lt;[Void](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Void.html)?&gt;<br>[shutdown](/developers/references/android/id-frak-sdk/frak/shutdown/) for Java. Runs on its own scope, not the client's, which `shutdown()` cancels. Blocking it from the main thread throws rather than deadlocking; sequence a following [initialize](/developers/references/android/id-frak-sdk/frak/initialize/) off the future (`thenRun`) rather than beside it, or the new client races the old one's teardown. |