Android

React Native環境におけるIMQA SDKを適用する方法を提供します。

IMQA MPMインストールガイドにより、IMQA agentコードを適用した後、この文書の内容を追加で適用してください。

1. 共通

MPM Module install

React native環境においてIMQA SDKを適用するために、下記のコマンドでパッケージをインストールする必要があります。.

npmコマンドを使う時
// npm install imqa-react-native-agent --save 
yarnコマンドを使う時
yarn add imqa-react-native-agent

2. 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 {
    // Add dependencies.
        classpath 'io.imqa:imqa-mpm-injector:2.25.6' ... 
    } 
} 
  • java

app.gradle(app module) -> java
...
    dependencies {
    // Add dependencies.
       implementation 'io.imqa:imqa-core:2.27.3'
       implementation 'io.imqa:imqa-mpm-client:2.27.7'
       implementation 'io.imqa:imqa-crash-client:2.27.2'
    } 
} 

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

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

    dependencies {
    // Add dependencies.
       implementation 'io.imqa:imqa-core:2.27.3'
       implementation 'io.imqa:imqa-mpm-client:2.27.7'
       implementation 'io.imqa:imqa-crash-client:2.27.2'
    } 
} 

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

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);
    imqaOption.setRemoteControl(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.
    ...
}
...
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)
    imqaOption.setRemoteConfig(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.
    ...
}
...

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) // 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.
    ...
}
...
MyApplication.kt
...
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.
    ...
}
...

⚠️HTTPS (API level > 27)

Android API 28から強化されたネットワークセキュリティポリシーにより、HTTPSリクエストが必要となりました。 これを解決するためには、以下の措置を講じる必要があります。

  1. 認証されたHTTPSリクエスト IMQAサーバーで認証されたHTTPSのリクエストを行って正常に収集してください。

MyApplication.java or MyApplication.kt
...
imqaOption.setServerUrl('https://collector.imqa.io');
...
  1. 強制HTTPリクエスト このflagを設定すると、すべてのcleartextトラフィックに対して許可処理を実行できます。

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

Zstandard圧縮アルゴリズムの使用

一般的なgzipではなく、安全で圧縮効率の高い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 {
    // Add 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();

    /*
     * 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) // 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.
    ...
}
...

Last updated