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모드에서만 발생하고,
minifyEnabled를 false로 변경했을때 정상적으로 실행된다면 이문제일 확률이 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코드를 포함한 라이브러리를 다른 프로젝트에서 사용할때 상기의 이슈가 발생함)
'안드로이드' 카테고리의 다른 글
Android NDK 용 Crypto++ 라이브러리를 Windows에서 빌드하는 방법 (0) | 2021.07.02 |
---|---|
kotlin basic ( 1) (0) | 2020.10.29 |
Realeas 모드 디버깅 세팅 (0) | 2020.07.16 |
[Android] ndk-build를 이용한 Native Code 빌드 및 사용방법 (1) | 2019.12.12 |
CardView (0) | 2019.04.09 |