MPM 설치

안드로이드 MPM SDK 설치 방법을 한 눈에 확인하실 수 있습니다.

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

  • Min SDK : 14

  • Target SDK : 34

  • Build Tool : ~8.2

  • Gradle Wrapper : ~ 8.2

  • Kotlin : ~ 1.9.22

  • Android Studio : ~ Iguana

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

1. 그래들 플러그인(Gradle Plugin) 설치

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

파일을 업데이트한 후 Gradle 파일을 동기화해야 합니다.

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

  • java

app.gradle(app module) -> java
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.3'
       implementation 'io.imqa:imqa-mpm-client:2.29.3'
       implementation 'io.imqa:imqa-crash-client:2.29.3'
    } 
} 

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)
    }
}

  • kotlin

app.gradle(app module)
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.3'
       implementation 'io.imqa:imqa-mpm-client:2.29.3'
       implementation 'io.imqa:imqa-crash-client:2.29.3'
    } 
} 

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)
    }
}

  • java + kotlin

app.gradle(app module)
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.3'
       implementation 'io.imqa:imqa-mpm-client:2.29.3'
       implementation 'io.imqa:imqa-crash-client:2.29.3'
    } 
} 

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)
    }
    }
}
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

Kotlin DSL 적용시

app.gradle.kts (project root)

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

  • java

app.gradle.kts(app module)
...
    dependencies {
    // dependencies 추가
        implementation("io.imqa:imqa-core:2.29.3")
        implementation("io.imqa:imqa-mpm-client:2.29.3")
        implementation("io.imqa:imqa-crash-client:2.29.3")
    } 
} 

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)
    }
}
  • kotlin

app.gradle.kts(app module)
...
    dependencies {
    // dependencies 추가
        implementation("io.imqa:imqa-core:2.29.3")
        implementation("io.imqa:imqa-mpm-client:2.29.3")
        implementation("io.imqa:imqa-crash-client:2.29.3")
    } 
} 

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)
    }
}
  • java + kotlin

app.gradle.kts(app module)
...
    dependencies {
    // dependencies 추가
        implementation("io.imqa:imqa-core:2.29.3")
        implementation("io.imqa:imqa-mpm-client:2.29.3")
        implementation("io.imqa:imqa-crash-client:2.29.3")
    } 
} 

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)
    }
}

2. 그래들 플러그인(Gradle Plugin) 상세 설정

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

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

파일을 업데이트 한 후 Gradle 파일을 동기화 해야 합니다.

app.gradle(app module) -> java
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.3'
       implementation 'io.imqa:imqa-mpm-client:2.29.3'
       implementation 'io.imqa:imqa-crash-client:2.29.3'
    } 
} 

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)
    }
}
app.gradle(app module) -> kotlin
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.3'
       implementation 'io.imqa:imqa-mpm-client:2.29.3'
       implementation 'io.imqa:imqa-crash-client:2.29.3'
    } 
} 

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)
 
app.gradle(app module) -> java + kotlin
...
    dependencies {
    // dependencies 추가
       implementation 'io.imqa:imqa-core:2.29.3'
       implementation 'io.imqa:imqa-mpm-client:2.29.3'
       implementation 'io.imqa:imqa-crash-client:2.29.3'
    } 
} 
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)
    }
}
  • Kotlin DSL

build.gradle.kts(app module) -> java
...
    dependencies {
    // dependencies 추가
       implementation("io.imqa:imqa-core:2.29.3")
       implementation("io.imqa:imqa-mpm-client:2.29.3")
       implementation("io.imqa:imqa-crash-client:2.29.3")
    } 
} 

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

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)
    }
}
app.gradle(app module) -> java + kotlin
...
    dependencies {
    // dependencies 추가
       implementation("io.imqa:imqa-core:2.29.3")
       implementation("io.imqa:imqa-mpm-client:2.29.3")
       implementation("io.imqa:imqa-crash-client:2.29.3")
    } 
} 
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)
    }
}

3. Android Manifest에 권한 추가

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

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

4. 소스코드에 IMQA 초기화 코드 삽입

IMQA 시작 코드 작성

Activity 가 아닌 Application 클래스에 삽입해야 합니다.

이때 ‘PROJECT_KEY’ 부분에 복사한 ‘Project Key’ 값을 넣어줍니다.

MyApplication.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) // MPM 의 동작 방식을 정하는 옵션을 설정합니다.
        .setContext(this, BuildConfig.FLAVOR) 
        // Application Context 를 초기화 합니다. (Flavor 가 없는 경우 빈 문자열 삽입)
        .setProjectKey("PROJECT_KEY") 
        // IMQA MPM Client 의 Project Key 를 설정합니다.
        .init(); 
        // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...
MyApplication.kt
...
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) 
        // MPM 의 동작 방식을 정하는 옵션을 설정합니다.
        .setContext(this, BuildConfig.FLAVOR) 
        // Application Context 를 초기화 합니다. (Flavor 가 없는 경우 빈 문자열 삽입)
        .setProjectKey("PROJECT_KEY") 
         // IMQA MPM Client 의 Project Key 를 설정합니다.
        .init(); 
         // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...

MPM Mode Option

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

단축 모드

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

MyApplication.java
...
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() // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...
MyApplication.kt
...
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() // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...

HTTPS (API level > 27)

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

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

MyApplication.java or MyApplication.kt
...
imqaOption.setServerUrl('https://collector.imqa.io');
...

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

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

Zstandard 압축 알고리즘 사용

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

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

MyApplication.java or MyApplication.kt
...
imqaOption.setCompressZstd(true);
...

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

app.gradle(app module)
...
    dependencies {
    // dependencies 추가
       ...
       implementation 'com.github.luben:zstd-jni:1.5.2-3@aar'
       ...
    } 
} 

5. 현재 버전에서의 이슈 사항

ASM

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

APK Repackaging

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

Library 정보 수집

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

6. 설치형 고객 필수 설정

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

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

    /*
     * 기본값 : 'https://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() // 등록한 옵션을 초기화 및 실행합니다.
    ...
}
...

Last updated