Android

Cordova 환경에서 SDK 설치

이 문서는 Cordova 환경에서의 IMQA SDK를 적용하는 방법을 제공합니다.

IMQA MPM, Crash 설치 가이드를 통해 IMQA agent 코드 적용 후, 이 문서의 내용을 추가적으로 적용해주세요.

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.6' ... 
    } 
} 
  • java

app.gradle(app module) -> 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'
    } 
} 

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

app.gradle(app module) -> java + kotlin
...
    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'
    } 
} 

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

2. Android Manifest에 권한 추가

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

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

3. Cordova Library 설정

IMQABridge 추가 방법은 Cordova를 이용하여 개발되는 케이스마다 달라질 수 있습니다.

3.1. WebView HTTP 요청

Web Server 설정

웹뷰 데이터 수집을 원한다면 웹뷰 를 제공하는 웹 페이지에 IMQA Webview Javascript 라이브러리를 삽입해 주어야 합니다. 원하는 경우 파일을 다운받아 웹 서버에서 직접 제공할 수 있습니다.

(크로스 오리진 문제 발생시 직접 import 해서 쓰시는걸 권장드립니다.)

웹뷰 파일 삽입
<!-- IMQA Webview Agent(1.1.3버전 이하) 입니다. -->
<script type="text/javascript" src="https://imqawebviewagent.blob.core.windows.net/agent/webview-agent-1.1.2.js"
crossorigin></script>

// min 파일로 적용하고 싶을 경우
<script type="text/javascript" src="https://imqawebviewagent.blob.core.windows.net/agent/webview-agent-1.1.2.min.js"
crossorigin></script>
index.html
<!-- IMQA Webview Agent (1.1.3버전 이상) 입니다. -->
<script type="text/javascript" src="https://cdn.imqa.io/agent/webview-agent-1.1.3.js"
crossorigin></script>

<script>
    ((w, c, _wv, _w, _wk, _mh, _b) => {        
       w[_wv](w); // 웹뷰 에이전트 실행함수
    })(window, 'imqaClientConfig', 'IMQAWebviewMain', 'IMQAWebMain', 'webkit', 'messageHandlers', 'ImqaBridge')
</script>

그래들( build.gradle ) 설정

Cordova 라이브러리 내부에서 IMQA 코드를 선언할 수 있도록 IMQA SDK를 추가해주어야 합니다.

build.gradle ( Cordova Library )
dependencies {
    ...
    Implementation 'androidx.appcompat:appcompat:1.3.0'

    //최신 IMQA SDK를 추가
       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'
		
}

Android Agent 설정

MPM은 WebView 에 관련된 페이지 및 요청을 수집합니다. 수집을 하기위해서는 Option 설정과 MPMWebviewInterface 를 추가해 주어야 합니다.

org/apache/cordova/CordovaActivity.java

..

protected void init() {
   appView = makeWebView();
   createViews();
   if (!appView.isInitialized()) {
       appView.init(cordovaInterface, pluginEntries, preferences);
   }
   cordovaInterface.onCordovaInit(appView.getPluginManager());

   // WebView Interface 삽입 (ImqaBridge 필수)
   WebView wV = (WebView) appView.getEngine().getView();
   wV.addJavascriptInterface(new     io.imqa.mpm.network.webview.WebviewInterface(),"ImqaBridge");
   // Wire the hardware volume controls to control media if desired.

   String volumePref = preferences.getString("DefaultVolumeStream", "");
   if ("media".equals(volumePref.toLowerCase(Locale.ENGLISH))) {
       setVolumeControlStream(AudioManager.STREAM_MUSIC);
   }
}
org/apache/cordova/engine/SystemWebviewEngine.java

..

private static void exposeJsInterface(WebView webView, CordovaBridge bridge) {
   if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)) {
       LOG.i(TAG, "Disabled addJavascriptInterface() bridge since Android version is old.");
       // Bug being that Java Strings do not get converted to JS strings automatically.
       // This isn't hard to work-around on the JS side, but it's easier to just
       // use the prompt bridge instead.
       return;
   }
   SystemExposedJsApi exposedJsApi = new SystemExposedJsApi(bridge);

   // WebView Interface 삽입 (ImqaBridge 필수)
   webView.addJavascriptInterface(new io.imqa.mpm.network.webview.WebviewInterface(),"ImqaBridge");

   webView.addJavascriptInterface(exposedJsApi, "_cordovaNative");
}

Last updated