반응형

native code에서 java class에 접근과 android 난독화(proGuard)

 

// Find the Mat classe
jclass matClass = env->FindClass("org/opencv/core/Mat");

// Get Mat class's methods<getNativeObjAddr()>
jmethodID getNativeObjAddrMethod = env->GetMethodID(matClass, "getNativeObjAddr", "()J");

native code에서 자바 클래스를 액세스 하기위해 java class나 Method를 구하는 경우,

Debug모드에서 잘 동작하던 코드가 Release 모드에서 

JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending exception java.lang.NoSuchMethodError: no non=static mathod xxxxxxx

와 같은 에러를 뱉어 내며 Crash나는 현상이 발생할 수 있다.

이러한 에러는 android app 빌드시, 자바 클래스가 난독화 되어 class나 method를 찾지 못하여 발생하는 것으로 보인다.

 

관련 설정은

bundle.gradle(Module: app) 의

buildTypes {
	release {
    	minifyEnabled true 
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 
        }
    }

와 관련된 부분으로

release모드에서만 발생하는 이유는 당연하게도 프로젝트 생성시, release모드에 난독화 활성화 되도록 디폴트로 설정되기 때문이다.

 

release모드에서만 발생하고,

minifyEnabledfalse로 변경했을때 정상적으로 실행된다면 이문제일 확률이 99.9%이다.

 

하지만, 난독화를 아예 비활성 시키기에는 찜찜하니 조그만 더 알아 보자면

난독화는 'proguard-rules.pro'파일에 설정된 내용을 기본으로 반영하므로 해당 파일을 수정해서 특정 Class, method, field등을 난독화 예외 대상으로 지정하면 난독화를 유지한 상태에서 일부 Class만 예외 적용 할 수 있다.

class 전체 예외

-keep class org.opencv.core.Mat { *; }

class 필드 예외

-keep class org.opencv.core.Mat { <fields>; }

class 메소드 예외

-keep class org.opencv.core.Mat { <methods>; }

특정 도메인 이하를 예외하거나 특정 class에서 상속받은 클래스를 예외할 수 있는 방법도 있는 모양이지만,

지금은 귀찮으니 여기까지만 알아본다.

 

*테스트 결과 native코드를 프로젝트에 포함한 경우에는 난독화가 문제가 되지 않았다.

(native코드를 포함한 라이브러리를 다른 프로젝트에서 사용할때 상기의 이슈가 발생함)

 

반응형

+ Recent posts