# MPM 설치

IMQA MPM 을 Android 프로젝트에 추가하면, Java 및 Kotlin 로 개발한 앱에서 발생하는 어플리케이션의 성능 문제를 다양한 시각으로 확인할 수 있습니다.&#x20;

{% hint style="info" %}

* Min SDK : 14&#x20;
* Target SDK : 34
* Build Tool : \~8.2
* Gradle Wrapper : \~ 8.2
* Kotlin : \~ 1.9.22
* Android Studio : \~ Iguana
  {% endhint %}

React Native, Cordova 환경에서 설치하시는 경우, 아래 페이지에서 설치 방법을 확인해 주세요.

* [React Native 환경에서 SDK 설치](https://docs.imqa.io/imqa-guide/installation/react-native/android)
* [Cordova 환경에서 SDK 설치](https://docs.imqa.io/imqa-guide/installation/cordova/android)

## 1. 그래들 플러그인(Gradle Plugin) 설치 <a href="#gradle" id="gradle"></a>

‘app.gradle’ 파일에서 ‘buildscript’ 내 ‘dependencies’ 블럭에 ‘imqa-mpm-injector’ 와 상단에 ‘plugin’을 추가합니다. 일반적으로 ‘\<project\_dir>/app/build.gradle’에 있습니다.

{% hint style="warning" %}
파일을 업데이트한 후 Gradle 파일을 동기화해야 합니다.
{% endhint %}

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

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

{% endcode %}

* java

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

```gradle
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.13'
       implementation 'io.imqa:imqa-mpm-client:2.29.13'
       implementation 'io.imqa:imqa-crash-client:2.29.13'
    } 
} 

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 {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.13'
       implementation 'io.imqa:imqa-mpm-client:2.29.13'
       implementation 'io.imqa:imqa-crash-client:2.29.13'
    } 
} 

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 {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.13'
       implementation 'io.imqa:imqa-mpm-client:2.29.13'
       implementation 'io.imqa:imqa-crash-client:2.29.13'
    } 
} 

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=프로젝트의 경로 (ex:/user/workspace/project1)
#코틀린 프로젝트일경우에만 추가
project.kotlin.path=$PROJECT_HOME/app/build/tmp/kotlin-classes 
#자바 프로젝트일경우에만 추가
project.java.path=$PROJECT_HOME/app/build/intermediates/javac/debug/classes
#빌드된 manifest파일의 경로
project.manifest.path=$PROJECT_HOME/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml
#gradle action
project.task.execute=:assemble
```

{% endcode %}

#### Kotlin DSL 적용시&#x20;

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

```kts

buildscript { 
    repositories { 
        mavenCentral()
    } 
    
    dependencies {
    // dependencies 추가
        classpath("io.imqa:imqa-mpm-injector:2.25.11") ... 
    } 
}
```

{% endcode %}

* java

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

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

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 {
    // dependencies 추가
        implementation("io.imqa:imqa-core:2.29.13")
        implementation("io.imqa:imqa-mpm-client:2.29.13")
        implementation("io.imqa:imqa-crash-client:2.29.13")
    } 
} 

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 {
    // dependencies 추가
        implementation("io.imqa:imqa-core:2.29.13")
        implementation("io.imqa:imqa-mpm-client:2.29.13")
        implementation("io.imqa:imqa-crash-client:2.29.13")
    } 
} 

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) 상세 설정

앱 프로젝트 구조가 기본적인 Android Project 구조가 아닌 경우, gradle 의 daemon 을 이용한 퀵빌드 설정이 되어있는 경우 또는 SDK 적용이 제대로 안되는 경우 ( 네이티브 화면 로딩시간(웹뷰X) , 네트워크 응답시간 등이 수집이 안되는 경우에 적용 가능합니다.

‘app.gradle’ 파일에서 ‘buildscript’ 내 ‘dependencies’ 블럭에 ‘imqa-mpm-injector’ 와 상단에 ‘plugin’을 추가합니다. 일반적으로 ‘\<project\_dir>/app/build.gradle’ 에 있습니다.

{% hint style="warning" %}
파일을 업데이트 한 후 Gradle 파일을 동기화 해야 합니다.
{% endhint %}

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

```java
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.13'
       implementation 'io.imqa:imqa-mpm-client:2.29.13'
       implementation 'io.imqa:imqa-crash-client:2.29.13'
    } 
} 

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

imqaBuildOption.setProjectHomePath("프로젝트의 경로") 
// 프로젝트의 경로 (ex:/user/workspace/project1)

imqaBuildOption.setAndroidManifestPath("빌드된 Manifest 파일의 경로")
// 빌드된 Manifest 파일의 경로 (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

imqaBuildOption.setJavaBuildPath("")
// 자바 프로젝트일경우에만 추가 (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 %}

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

```kotlin
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.13'
       implementation 'io.imqa:imqa-mpm-client:2.29.13'
       implementation 'io.imqa:imqa-crash-client:2.29.13'
    } 
} 

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

imqaBuildOption.setProjectHomePath("프로젝트의 경로") 
// 프로젝트의 경로 (ex:/user/workspace/project1)

imqaBuildOption.setAndroidManifestPath("빌드된 Manifest 파일의 경로")
// 빌드된 Manifest 파일의 경로 (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

imqaBuildOption.setKotlinBuildPath("")
// 코틀린 프로젝트인 경우 추가 (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 %}

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

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

imqaBuildOption.setProjectHomePath("") 
// 프로젝트의 경로 (ex:/user/workspace/project1)

imqaBuildOption.setAndroidManifestPath("")
// 빌드된 Manifest 파일의 경로 (ex:/user/workspace/project1/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml)

imqaBuildOption.setJavaBuildPath("")
// 자바 프로젝트일경우에만 추가 (ex:/user/workspace/project1/app/build/intermediates/javac/debug/classes) 

imqaBuildOption.setKotlinBuildPath("")
// 코틀린 프로젝트인 경우 추가 (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**

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

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

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

imqaBuildOption.projectHomePath = "" // 프로젝트의 경로 (ex:/user/workspace/project1)

imqaBuildOption.javaBuildPath = "" // 자바 프로젝트일경우에만 추가 (ex:/user/workspace/project1/app/build/intermediates/javac/debug/classes) 

imqaBuildOption.androidManifestPath = ""  // 빌드된 Manifest 파일의 경로 (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 %}

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

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

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

imqaBuildOption.projectHomePath = "" // 프로젝트의 경로 (ex:/user/workspace/project1)

imqaBuildOption.kotlinBuildPath = "" // 코틀린 프로젝트인 경우 추가 
(ex:/user/workspace/project1/app/build/tmp/kotlin-classes/debug) 

imqaBuildOption.androidManifestPath = "" // 빌드된 Manifest 파일의 경로 (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 %}

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

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

imqaBuildOption.projectHomePath = "" // 프로젝트의 경로 (ex:/user/workspace/project1)

imqaBuildOption.javaBuildPath = "" // 자바 프로젝트일경우에만 추가 (ex:/user/workspace/project1/app/build/intermediates/javac/debug/classes) 

imqaBuildOption.kotlinBuildPath = "" // 코틀린 프로젝트인 경우 추가 
(ex:/user/workspace/project1/app/build/tmp/kotlin-classes/debug) 

imqaBuildOption.androidManifestPath = "" // 빌드된 Manifest 파일의 경로 (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. Android Manifest에 권한 추가 <a href="#authority" id="authority"></a>

AndroidManifest.xml 에 발생한 크래시 정보를 업로드 하기 위해 인터넷 권한을 주어야합니다.

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

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

{% endcode %}

## 4. 소스코드에 IMQA 초기화 코드 삽입 <a href="#initialization" id="initialization"></a>

### **IMQA 시작 코드 작성** <a href="#code" id="code"></a>

{% hint style="warning" %}
Activity 가 아닌 Application 클래스에 삽입해야 합니다.

이때 ‘PROJECT\_KEY’ 부분에 복사한 ‘Project Key’ 값을 넣어줍니다.
{% endhint %}

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

```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.setFileInterval(5);
    imqaOption.setHttpTracing(true);

    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setOption(imqaOption) // MPM 의 동작 방식을 정하는 옵션을 설정합니다.
        .setContext(this, BuildConfig.FLAVOR) 
        // Application Context 를 초기화 합니다. (Flavor 가 없는 경우 빈 문자열 삽입)
        .setProjectKey("PROJECT_KEY") 
        // IMQA MPM Client 의 Project Key 를 설정합니다.
        .init(); 
        // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...
```

{% endcode %}

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

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

    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setOption(imqaOption) 
        // MPM 의 동작 방식을 정하는 옵션을 설정합니다.
        .setContext(this, BuildConfig.FLAVOR) 
        // Application Context 를 초기화 합니다. (Flavor 가 없는 경우 빈 문자열 삽입)
        .setProjectKey("PROJECT_KEY") 
         // IMQA MPM Client 의 Project Key 를 설정합니다.
        .init(); 
         // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...
```

{% endcode %}

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

IMQA MPM 실행 옵션을 파라미터나 Option을 이용해 변경할 수 있습니다. Android MPM Configuration Options 에서 실행 옵션을 확인하세요.

### **단축 모드** <a href="#shorten" id="shorten"></a>

단축모드를 이용하여 IMQA MPM을 초기화 할 수 있습니다.

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

```java
...
@Override
public void onCreate() {
    super.onCreate()

    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setContext(this, BuildConfig.FLAVOR) // Application Context 를 초기화 합니다. (Flavor 가 없는 경우 빈 문자열 삽입)
        .setProjectKey("PROJECT_KEY") // IMQA MPM Client 의 Project Key 를 설정합니다.
        .init() // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...
```

{% endcode %}

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

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

    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setContext(this, BuildConfig.FLAVOR) // Application Context 를 초기화 합니다. (Flavor 가 없는 경우 빈 문자열 삽입)
        .setProjectKey("PROJECT_KEY") // IMQA MPM Client 의 Project Key 를 설정합니다.
        .init() // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...
```

{% endcode %}

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

Android API 28 부터 강화된 네트워크 보안 정책에 의해 HTTPS 요청이 필요해졌습니다. 이를 해결하기위해 다음 조치가 필요합니다.

**인증된 HTTPS 요청**\
IMQA 서버로 인증된 HTTPS 를 요청하여 정상적으로 수집을 합니다.

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

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

{% endcode %}

**강제 HTTP 요청**\
이 flag를 설정하여 모든 cleartext 트래픽에 대해 허용처리를 할 수 있습니다.

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

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

{% endcode %}

### Zstandard 압축 알고리즘 사용

일반적인 gzip 이 아닌 보안성, 압축 효율이 높아진 Zstandard 압축 알고리즘을 사용할 수 있습니다. 이를 사용하기 위해 다음 설정이 필요합니다.  (\* Zstandard 압축 방식은 유료 버전만 사용 가능합니다.)

**MPM Mode Option 설정**\
IMQA 시작 코드 삽입 시 설정에서 zstd 사용 여부를 설정할 수 있습니다.

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

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

{% endcode %}

**Zstd 라이브러리 추가**\
‘app.gradle’ 파일에서 ‘buildscript’ 내 ‘dependencies’ 블럭에 ‘zstd-jni’ aar 라이브러리를 추가합니다.

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

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

{% endcode %}

## 5. 현재 버전에서의 이슈 사항 <a href="#issue" id="issue"></a>

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

ASM을 사용하는 라이브러리와 충돌이 발생할 수 있습니다.<br>

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

APK Repackaging 중에 소스 라인정보가 사라집니다. 라인정보를 포함하고 싶으시다면 자동삽입 기능을 Compile 중에 실행해야 합니다.<br>

### Library 정보 수집 <a href="#library" id="library"></a>

Library로 추가된 class 파일은 자동삽입 기능이 실행되지 않습니다. Library에서 수행되는 정보까지 수집하기 원하신다면 자동삽입 기능을 APK Repackaging 중에 실행해야 합니다.

## 6. 설치형 고객 필수 설정

IMQA 설치형을 사용하시는 고객사에서는 반드시 수집서버를 설정해주시길 바랍니다.&#x20;

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

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

    /*
     * 기본값 : 'https://main.collector.imqa.io'
     * MPM 서버 URL을 설정합니다.
     * String : 서버 정보
     */
    imqaOption.setServerUrl('https://(IPAddress)');

    io.imqa.mpm.IMQAMpmAgent.getInstance()
        .setOption(imqaOption) // MPM 의 동작 방식을 정하는 옵션을 설정합니다.
        .setContext(this, BuildConfig.FLAVOR) // Application Context 를 초기화 합니다. (Flavor 가 없는 경우 빈 문자열 삽입)
        .setProjectKey("PROJECT_KEY") // IMQA MPM Client 의 Project Key 를 설정합니다.
        .init() // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...
```

{% endcode %}
