# Installing MPM SDK

If you add IMQA MPM to an Android project, you can check the performance issues of the application, which occur in the app developed with Java or Kotlin, in various viewpoints.

{% hint style="warning" %}

* Min SDK : 14&#x20;
* Target SDK : 33
* Build Tool : \~7.2
* Gradle Wrapper : \~ 7.1.3
* Kotlin : \~ 1.3.21
* Android Studio : \~ Giraffe
  {% endhint %}

{% hint style="warning" %}
Please install Crash SDK after creating an Android project at the IMQA project page and <mark style="color:red;">**receiving the project key.**</mark>
{% endhint %}

* [MPM installation - React Native](https://docs.imqa.io/imqa-guide/eng/installation-guide/react-native)
* [MPM installation - Cordova](https://docs.imqa.io/imqa-guide/eng/installation-guide/cordova)
* [MPM installation - Morpheus](https://docs.imqa.io/imqa-guide/eng/installation-guide/morpheus)

## 1. Installing Gradle plugin <a href="#gradle" id="gradle"></a>

In the “app.gradle” file, add “imqa-mpm-injector” to the ”dependencies” block in “buildscript” and add “plugin” to the top. Generally, it can be found in “\<project\_dir> /app/build.gradle”.

{% hint style="warning" %}
If the app project structure is not the basic Android Project structure, quick build using Gradle's daemon is set, or SDK is not applied properly (native UI loading time (Webview X), network response time, etc. are not collected. Please apply by referring to '[Installing MPM SDK > Gradle Plugin Detailed setting](#authority)'.
{% endhint %}

{% hint style="warning" %}
The gradle file should be synchronized after updating the file.
{% endhint %}

{% code title="app.gradle(project root)" %}

```gradle
// Add Build script dependencies 
buildscript { 
    repositories { 
        mavenCentral()
    } 
    
    dependencies {
    // Add dependencies.
        classpath 'io.imqa:imqa-mpm-injector:2.25.7' ... 
    } 
} 
```

{% endcode %}

* **java**

{% code title="app.gradle(app module) -> java" %}

```gradle
...
    dependencies {
    // Add dependencies.
       implementation 'io.imqa:imqa-core:2.27.5'
       implementation 'io.imqa:imqa-mpm-client:2.27.9'
       implementation 'io.imqa:imqa-crash-client:2.27.5'
    } 
} 

io.imqa.IMQAPlugin imqaPlugin = new io.imqa.IMQAPlugin()
imqaPlugin.init(project)
new io.imqa.injector.GJavacAction(project.name).setConfiguration(project)
android.applicationVariants.all { variant ->
    variant.javaCompile.doLast { task ->
        new io.imqa.injector.CompileAction(
                io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.javacClasses,
                project.name,
                io.imqa.injector.GJavacAction.convertBuildType(variant.getBuildType()),
                io.imqa.injector.GJavacAction.makeFlavor(variant.getBuildType().name,
                        variant)
        ).execute(task)
    }
}
```

{% endcode %}

* **kotlin**

{% code title="app.gradle(app module)" %}

```gradle
...
    dependencies {
    // Add dependencies.
       implementation 'io.imqa:imqa-core:2.27.5'
       implementation 'io.imqa:imqa-mpm-client:2.27.9'
       implementation 'io.imqa:imqa-crash-client:2.27.5'
    } 
} 

io.imqa.IMQAPlugin imqaPlugin = new io.imqa.IMQAPlugin()
imqaPlugin.init(project)
new io.imqa.injector.GJavacAction(project.name).setConfiguration(project)
android.applicationVariants.all { variant ->
    variant.javaCompile.doLast { task ->
        new io.imqa.injector.CompileAction(
                io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.kotlin,
                project.name,
                io.imqa.injector.GJavacAction.convertBuildType(variant.getBuildType()),
                io.imqa.injector.GJavacAction.makeFlavor(variant.getBuildType().name,
                        variant)
        ).execute(task)
    }
}
```

{% endcode %}

* **java + kotlin**

{% code title="app.gradle(app module) " %}

```gradle
...
    dependencies {
    // Add dependencies.
       implementation 'io.imqa:imqa-core:2.27.5'
       implementation 'io.imqa:imqa-mpm-client:2.27.9'
       implementation 'io.imqa:imqa-crash-client:2.27.5'
    } 
} 

io.imqa.IMQAPlugin imqaPlugin = new io.imqa.IMQAPlugin()
imqaPlugin.init(project)
new io.imqa.injector.GJavacAction(project.name).setConfiguration(project)
android.applicationVariants.all { variant ->
    variant.javaCompile.doLast { task -> {
        new io.imqa.injector.CompileAction(
                io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.kotlin,
                project.name,
                io.imqa.injector.GJavacAction.convertBuildType(variant.getBuildType()),
                io.imqa.injector.GJavacAction.makeFlavor(variant.getBuildType().name,
                        variant)
        ).execute(task)

        new io.imqa.injector.CompileAction(
                io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.javacClasses,
                project.name,
                io.imqa.injector.GJavacAction.convertBuildType(variant.getBuildType()),
                io.imqa.injector.GJavacAction.makeFlavor(variant.getBuildType().name,
                        variant)
        ).execute(task)
    }
    }
}
```

{% endcode %}

{% code title="gradle.properties" %}

```
...

project.home=Path of project (ex:/user/workspace/project1)
#Add only Kotlin project
project.kotlin.path=$PROJECT_HOME/app/build/tmp/kotlin-classes 
#Add only Java project
project.java.path=$PROJECT_HOME/app/build/intermediates/javac/debug/classes
#Path to built manifest file
project.manifest.path=$PROJECT_HOME/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml
#gradle action
project.task.execute=:assemble
```

{% endcode %}

* **Kotlin DSL**

{% code title="app.gradle.kts (project root)" %}

```kts
buildscript { 
    repositories { 
        mavenCentral()
    } 
    
    dependencies {
    // Add dependencies.
        classpath("io.imqa:imqa-mpm-injector:2.25.6") ... 
    } 
}
```

{% endcode %}

* **java**

{% code title="app.gradle.kts(app module) " %}

```kts
...
    dependencies {
    // Add dependencies.
        implementation("io.imqa:imqa-core:2.27.5")
        implementation("io.imqa:imqa-mpm-client:2.27.9")
        implementation("io.imqa:imqa-crash-client:2.27.5")
    } 
} 

val imqaPlugin: io.imqa.IMQAPlugin = io.imqa.IMQAPlugin()
imqaPlugin.init(project)
io.imqa.injector.GJavacAction(project.name)
android.applicationVariants.all {
    val variant = this
    val javaCompileTask = variant.javaCompileProvider?.get()
    javaCompileTask?.doLast {
        val task = this

        io.imqa.injector.CompileAction(
            io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.javacClasses, project.name,
            io.imqa.injector.GJavacAction.convertBuildType(variant.buildType),
            io.imqa.injector.GJavacAction.makeFlavor(variant.buildType.name, variant)
        ).execute(task)
    }
}
```

{% endcode %}

* **kotlin**

{% code title="app.gradle.kts(app module) " %}

```kts
...
    dependencies {
    // Add dependencies.
        implementation("io.imqa:imqa-core:2.27.5")
        implementation("io.imqa:imqa-mpm-client:2.27.9")
        implementation("io.imqa:imqa-crash-client:2.27.5")
    } 
} 

val imqaPlugin: io.imqa.IMQAPlugin = io.imqa.IMQAPlugin()
imqaPlugin.init(project)
io.imqa.injector.GJavacAction(project.name)
android.applicationVariants.all {
    val variant = this
    val javaCompileTask = variant.javaCompileProvider?.get()
    javaCompileTask?.doLast {
        val task = this

        io.imqa.injector.CompileAction(
            io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.kotlin, project.name,
            io.imqa.injector.GJavacAction.convertBuildType(variant.buildType),
            io.imqa.injector.GJavacAction.makeFlavor(variant.buildType.name, variant)
        ).execute(task)
    }
}
```

{% endcode %}

* **java + kotlin**

{% code title="app.gradle.kts(app module) " %}

```kts
...
    dependencies {
    // Add dependencies.
        implementation("io.imqa:imqa-core:2.27.5")
        implementation("io.imqa:imqa-mpm-client:2.27.9")
        implementation("io.imqa:imqa-crash-client:2.27.5")
    } 
} 

val imqaPlugin: io.imqa.IMQAPlugin = io.imqa.IMQAPlugin()
imqaPlugin.init(project)
io.imqa.injector.GJavacAction(project.name)
android.applicationVariants.all {
    val variant = this
    val javaCompileTask = variant.javaCompileProvider?.get()
    javaCompileTask?.doLast {
        val task = this

        io.imqa.injector.CompileAction(
            io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.kotlin, project.name,
            io.imqa.injector.GJavacAction.convertBuildType(variant.buildType),
            io.imqa.injector.GJavacAction.makeFlavor(variant.buildType.name, variant)
        ).execute(task)

        io.imqa.injector.CompileAction(
            io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.javacClasses, project.name,
            io.imqa.injector.GJavacAction.convertBuildType(variant.buildType),
            io.imqa.injector.GJavacAction.makeFlavor(variant.buildType.name, variant)
        ).execute(task)
    }
}
```

{% endcode %}

## 2. Gradle Plugin Detailed setting <a href="#plugin" id="plugin"></a>

It can be applied when the app project structure is not the basic Android Project structure, when quick build using gradle's daemon is set up, when SDK application does not work properly (native UI loading time (Webview X), or when network response time, etc. cannot be collected.

In the “app.gradle” file, add “imqa-mpm-injector” to the “dependencies” block in the "buildscript" followed by “plugin” at the top. This is typically located in “\<project\_dir>/app/build.gradle”.

{% hint style="warning" %}
The gradle file should be synchronized after updating the file.
{% endhint %}

* **java**

{% code title="app.gradle(app module) -> java" %}

```java
...
    dependencies {
    // Add dependencies.
       implementation 'io.imqa:imqa-core:2.27.5'
       implementation 'io.imqa:imqa-mpm-client:2.27.9'
       implementation 'io.imqa:imqa-crash-client:2.27.5'
    } 
} 

io.imqa.injector.IMQABuildOption imqaBuildOption = new io.imqa.injector.IMQABuildOption();

imqaBuildOption.setProjectHomePath("Path of project") 
// Path of project (ex:/user/workspace/project1)

imqaBuildOption.setAndroidManifestPath("Path to built manifest file")
// Path to built manifest file (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

imqaBuildOption.setJavaBuildPath("")
// Add only java project (ex:/user/workspace/project1/app/build/intermediates/javac/debug/classes) 

io.imqa.IMQAPlugin imqaPlugin = new io.imqa.IMQAPlugin()
imqaPlugin.init(project, imqaBuildOption)
new io.imqa.injector.GJavacAction(project.name).setConfiguration(project)
android.applicationVariants.all { variant ->
    variant.javaCompile.doLast { task ->
        new io.imqa.injector.CompileAction(
                io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.javacClasses,
                project.name,
                io.imqa.injector.GJavacAction.convertBuildType(variant.getBuildType()),
                io.imqa.injector.GJavacAction.makeFlavor(variant.getBuildType().name,
                        variant),
                imqaBuildOption
        ).execute(task)
    }
}
```

{% endcode %}

* **kotlin**

{% code title="app.gradle(app module) -> kotlin" %}

```kotlin
...
    dependencies {
    // Add dependencies.
       implementation 'io.imqa:imqa-core:2.27.5'
       implementation 'io.imqa:imqa-mpm-client:2.27.9'
       implementation 'io.imqa:imqa-crash-client:2.27.5'
    } 
} 

io.imqa.injector.IMQABuildOption imqaBuildOption = new io.imqa.injector.IMQABuildOption();

imqaBuildOption.setProjectHomePath("Path of project") 
// Path of project (ex:/user/workspace/project1)

imqaBuildOption.setAndroidManifestPath("Path to built manifest file")
// Path to built manifest file (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

imqaBuildOption.setKotlinBuildPath("")
// Add only kotlin project (ex:/user/workspace/project1/app/build/tmp/kotlin-classes/debug) 

io.imqa.IMQAPlugin imqaPlugin = new io.imqa.IMQAPlugin()
imqaPlugin.init(project, imqaBuildOption)
new io.imqa.injector.GJavacAction(project.name).setConfiguration(project)
android.applicationVariants.all { variant ->
    variant.javaCompile.doLast { task ->
        new io.imqa.injector.CompileAction(
                io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.kotlin,
                project.name,
                io.imqa.injector.GJavacAction.convertBuildType(variant.getBuildType()),
                io.imqa.injector.GJavacAction.makeFlavor(variant.getBuildType().name,
                        variant),
                imqaBuildOption
        ).execute(task)
    }
}
```

{% endcode %}

* **java + kotlin**

{% code title="app.gradle(app module) -> java + kotlin" %}

```java
...
    dependencies {
    // Add dependencies.
       implementation 'io.imqa:imqa-core:2.27.5'
       implementation 'io.imqa:imqa-mpm-client:2.27.9'
       implementation 'io.imqa:imqa-crash-client:2.27.5'
    } 
} 
io.imqa.injector.IMQABuildOption imqaBuildOption = new io.imqa.injector.IMQABuildOption();

imqaBuildOption.setProjectHomePath("") 
// Path of project (ex:/user/workspace/project1)

imqaBuildOption.setAndroidManifestPath("")
// Path to built manifest file (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

imqaBuildOption.setJavaBuildPath("")
// Add only java project (ex:/user/workspace/project1/app/build/intermediates/javac/debug/classes) 

imqaBuildOption.setKotlinBuildPath("")
// Add only kotlin project (ex:/user/workspace/project1/app/build/tmp/kotlin-classes/debug) 


io.imqa.IMQAPlugin imqaPlugin = new io.imqa.IMQAPlugin()
imqaPlugin.init(project, imqaBuildOption)
new io.imqa.injector.GJavacAction(project.name).setConfiguration(project)
android.applicationVariants.all { variant ->
    variant.javaCompile.doLast { task ->
        new io.imqa.injector.CompileAction(
                io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.javacClasses,
                project.name,
                io.imqa.injector.GJavacAction.convertBuildType(variant.getBuildType()),
                io.imqa.injector.GJavacAction.makeFlavor(variant.getBuildType().name,
                        variant),
                imqaBuildOption
        ).execute(task)
        new io.imqa.injector.CompileAction(
                io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.kotlin,
                project.name,
                io.imqa.injector.GJavacAction.convertBuildType(variant.getBuildType()),
                io.imqa.injector.GJavacAction.makeFlavor(variant.getBuildType().name,
                        variant),
                imqaBuildOption
        ).execute(task)
    }
}
```

{% endcode %}

### Kotlin DSL <a href="#dsl" id="dsl"></a>

* **java**

{% code title="build.gradle.kts(app module) -> java" %}

```java
...
    dependencies {
    // dependencies 추가
       implementation("io.imqa:imqa-core:2.27.5")
       implementation("io.imqa:imqa-mpm-client:2.27.9")
       implementation("io.imqa:imqa-crash-client:2.27.5")
    } 
} 

val imqaBuildOption: io.imqa.injector.IMQABuildOption = io.imqa.injector.IMQABuildOption();

imqaBuildOption.projectHomePath = "" // Path of the project (ex:/user/workspace/project1)

imqaBuildOption.javaBuildPath = "" // Add only java project (ex:/user/workspace/project1/app/build/intermediates/javac/debug/classes) 

imqaBuildOption.androidManifestPath = ""  // Path to built manifest file (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

val imqaPlugin: io.imqa.IMQAPlugin = io.imqa.IMQAPlugin()
imqaPlugin.init(project,imqaBuildOption)
io.imqa.injector.GJavacAction(project.name)
android.applicationVariants.all {
    val variant = this
    val javaCompileTask = variant.javaCompileProvider?.get()
    javaCompileTask?.doLast {
        val task = this
        io.imqa.injector.CompileAction(
            io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.javacClasses,
            project.name,
            io.imqa.injector.GJavacAction.convertBuildType(variant.buildType),
            io.imqa.injector.GJavacAction.makeFlavor(variant.buildType.name, variant),
            imqaBuildOption
        ).execute(task)
    }
}
```

{% endcode %}

* **kotlin**

{% code title="app.gradle(app module) -> kotlin" %}

```kotlin
...
    dependencies {
    // Add dependencies.
       implementation("io.imqa:imqa-core:2.27.5")
       implementation("io.imqa:imqa-mpm-client:2.27.9")
       implementation("io.imqa:imqa-crash-client:2.27.5")
    } 
} 

val imqaBuildOption: io.imqa.injector.IMQABuildOption = io.imqa.injector.IMQABuildOption();

imqaBuildOption.projectHomePath = "" // Path of the project (ex:/user/workspace/project1)

imqaBuildOption.kotlinBuildPath = "" // Add only kotlin project
(ex:/user/workspace/project1/app/build/tmp/kotlin-classes/debug) 

imqaBuildOption.androidManifestPath = "" // Path to built manifest file (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

val imqaPlugin: io.imqa.IMQAPlugin = io.imqa.IMQAPlugin()
imqaPlugin.init(project,imqaBuildOption)
io.imqa.injector.GJavacAction(project.name)
android.applicationVariants.all {
    val variant = this
    val javaCompileTask = variant.javaCompileProvider?.get()
    javaCompileTask?.doLast {
        val task = this
        io.imqa.injector.CompileAction(
            io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.kotlin,
            project.name,
            io.imqa.injector.GJavacAction.convertBuildType(variant.buildType),
            io.imqa.injector.GJavacAction.makeFlavor(variant.buildType.name, variant),
            imqaBuildOption
        ).execute(task)
    }
}
```

{% endcode %}

* **java + kotlin**

{% code title="app.gradle(app module) -> java + kotlin" %}

```java
...
    dependencies {
    // Add dependencies.
       implementation("io.imqa:imqa-core:2.27.5")
       implementation("io.imqa:imqa-mpm-client:2.27.9")
       implementation("io.imqa:imqa-crash-client:2.27.5")
    } 
} 
val imqaBuildOption: io.imqa.injector.IMQABuildOption = io.imqa.injector.IMQABuildOption();

imqaBuildOption.projectHomePath = "" // Path of project (ex:/user/workspace/project1)

imqaBuildOption.javaBuildPath = "" // Add only java project (ex:/user/workspace/project1/app/build/intermediates/javac/debug/classes) 

imqaBuildOption.kotlinBuildPath = "" // Add only kotlin project 
(ex:/user/workspace/project1/app/build/tmp/kotlin-classes/debug) 

imqaBuildOption.androidManifestPath = "" // Path to built manifest file (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

val imqaPlugin: io.imqa.IMQAPlugin = io.imqa.IMQAPlugin()
imqaPlugin.init(project,imqaBuildOption)
io.imqa.injector.GJavacAction(project.name)
android.applicationVariants.all {
    val variant = this
    val javaCompileTask = variant.javaCompileProvider?.get()
    javaCompileTask?.doLast {
        val task = this
        io.imqa.injector.CompileAction(
            io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.kotlin,
            project.name,
            io.imqa.injector.GJavacAction.convertBuildType(variant.buildType),
            io.imqa.injector.GJavacAction.makeFlavor(variant.buildType.name, variant),
            imqaBuildOption
        ).execute(task)

        io.imqa.injector.CompileAction(
            io.imqa.injector.util.BuildOption.BUILD_LOCATION_TYPE.javacClasses,
            project.name,
            io.imqa.injector.GJavacAction.convertBuildType(variant.buildType),
            io.imqa.injector.GJavacAction.makeFlavor(variant.buildType.name, variant),
            imqaBuildOption
        ).execute(task)
    }
}
```

{% endcode %}

## 3. Adding authority to the Android Manifest <a href="#authority" id="authority"></a>

You have to grant Internet authority to upload occurred crash information to AndroidManifest.xml.

{% code title="AndroidManifest.xml" %}

```xml
<uses-permission android:name="android.permission.INTERNET"/>
```

{% endcode %}

## 4. Inserting the IMQA initialization code into the source code <a href="#initialization" id="initialization"></a>

### Writing the IMQA start code <a href="#code" id="code"></a>

{% hint style="warning" %}
The code should be inserted into the application class, not activity.

At this time, insert the copied “Project Key” value into “PROJECT\_KEY”.
{% endhint %}

{% code title="MyApplication.java" %}

```java
...
@Override
public void onCreate() {
    super.onCreate();
    io.imqa.core.IMQAOption imqaOption = new io.imqa.core.IMQAOption();
    imqaOption.setBuildType(false);
    imqaOption.setUploadPeriod(true);
    imqaOption.setKeepFileAtUploadFail(false);
    imqaOption.setDumpInterval(10000);
    imqaOption.setFileInterval(5);
    imqaOption.setHttpTracing(true);


    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setOption(imqaOption) // Sets an option to decide the MPM operation method.
        .setContext(this, BuildConfig.FLAVOR) 
        // Initializes the application context. (Insert an empty string if there is no flavor)
        .setProjectKey("PROJECT_KEY") 
        // Sets the project key of the IMQA MPM client.
        .init(); 
        // Initializes and executes the registered option.
    ...
}
...
```

{% endcode %}

{% code title="MyApplication.kt" %}

```kotlin
...
override fun onCreate() {
    super.onCreate()
    val imqaOption : IMQAOption = io.imqa.core.IMQAOption()
    imqaOption.setBuildType(false)
    imqaOption.setUploadPeriod(true)
    imqaOption.setKeepFileAtUploadFail(false)
    imqaOption.setDumpInterval(10000)
    imqaOption.setFileInterval(5)
    imqaOption.setHttpTracing(true)


    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setOption(imqaOption) 
        // Sets an option to decide the MPM operation method.
        .setContext(this, BuildConfig.FLAVOR) 
        // Initializes the application context. (Insert an empty string if there is no flavor)
        .setProjectKey("PROJECT_KEY") 
         // Sets the project key of the IMQA MPM client.
        .init(); 
         // Initializes and executes the registered option.
    ...
}
...
```

{% endcode %}

### **MPM Mode Option** <a href="#mpm-mode-option" id="mpm-mode-option"></a>

You can change the IMQA MPM execution options using parameters or options. Check the execution options in Android MPM Configuration Options.

### Shortcut mode <a href="#shorten" id="shorten"></a>

You can initialize IMQA MPM using the shortcut mode.

{% code title="MyApplication.java" %}

```java
...
override fun onCreate() {
    super.onCreate()

    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setContext(this, BuildConfig.FLAVOR) // Initializes the application context. (Insert an empty string if there is no flavor)
        .setProjectKey("PROJECT_KEY") // Sets the project key of the IMQA MPM client.
        .init() // Initializes and executes the registered option.
    ...
}
...
```

{% endcode %}

{% code title="MyApplication.kt" %}

```kotlin
...
override fun onCreate() {
    super.onCreate()

    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setContext(this, BuildConfig.FLAVOR) // Initializes the application context. (Insert an empty string if there is no flavor)
        .setProjectKey("PROJECT_KEY") // Sets the project key of the IMQA MPM client.
        .init() // Initializes and executes the registered option.
    ...
}
...
```

{% endcode %}

### **HTTPS (API level > 27)** <a href="#https" id="https"></a>

The HTTPS request is required from Android API level 28 and above due to the enhanced network security policy. The following measures are needed to meet the requirement:

1. **Authenticated HTTPS request**\
   Request authenticated HTTPS to the IMQA server to collect the data normally.

{% code title="MyApplication.java or MyApplication.kt" %}

```kotlin
...
imqaOption.setServerUrl('https://collector.imqa.io');
...
```

{% endcode %}

2. &#x20;**Forced HTTP request**\
   You can allow all cleartext HTTP traffic by setting this flag.

{% code title="AndroidManifest.xml" %}

```xml
...
<application
    ...
    android:usesCleartextTraffic="true"
    />
...
```

{% endcode %}

### Using Zstandard (Zstd)

You can use Zstandard, which is an algorithm enabling more secure and efficient data compression, instead of the typical gzip. To use it, you need the following settings:  (\* Only available in paid plan.)

**Setting the MPM Mode Option**\
You can set whether to use Zstd in the settings when inserting the IMQA startup code.

{% code title="MyApplication.java or MyApplication.kt" %}

```
...
imqaOption.setCompressZstd(true);
...
```

{% endcode %}

**Add Zstd Library**\
In the “app.gradle” file, add the “zstd-jni” aar library to the “dependencies” block in “buildscript”.

{% code title="app.gradle(app module)" %}

```
...
    dependencies {
    // Add dependencies.
       ...
       implementation 'com.github.luben:zstd-jni:1.5.2-3@aar'
       ...
    } 
} 
```

{% endcode %}

## 5. Issues in the current version <a href="#issue" id="issue"></a>

### ASM <a href="#asm" id="asm"></a>

Conflict may occur with the library using ASM.<br>

### APK Repackaging <a href="#apk" id="apk"></a>

Source line information disappears while repackaging the APK. The auto-insert function should be executed during compilation, in order to include line information.<br>

### Collecting library information

The auto-insert function is not executed in the class file added to the library. The auto-insert function should be executed while repackaging the API, in order to collect information on what is executed in the library.

## 6. Settings required for the installation-type

Any client who selects an IMQA installation-type must set the collection server.

{% code title="MyApplication.java" %}

```java
...
@Override
public void onCreate() {
    super.onCreate();
    io.imqa.core.IMQAOption imqaOption = new io.imqa.core.IMQAOption();

    /*
     * Default value: 'https://collector.imqa.io'
     * Sets the MPM server URL.
     * String: Server information
     */
    imqaOption.setServerUrl('https://(IPAddress)');

    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setOption(imqaOption) // Sets the option to decide the MPM operation method.
        .setContext(this, BuildConfig.FLAVOR) // AInitializes the application context. (Insert an empty string if there is no flavor)
        .setProjectKey("PROJECT_KEY") // Sets the project key of the IMQA MPM client.
        .init() // Initializes and executes the registered option.
    ...
}
...
```

{% endcode %}
