Android

[Android] SO 파일 만들어 다른 프로젝트에서 사용해보기

Xmobile 2020. 11. 4. 17:07

SO파일에 문자열을 숨기고 암호화키로 사용할 경우 감출 수 있는지 테스트 확인하기 위하여

기본 프로젝트를 이용하여 간단히 만들어 보도록 하겠습니다.

 

참고 URL

https://developer.android.com/studio/projects/add-native-code?hl=ko

 

프로젝트 생성

1. new project -> Native c++ 디폴트 프로젝트 생성

 

 

2. 빌드후 실행

 

 

3. 정상적으로 호출되는 것을 확인했고 소스코드를 확인해 보겠습니다.

생성한 프로젝트의 cpp>native-lib.cpp stringFromJNI메소드명을 사용할 Java_패키지_액티비티_stringFromJNI으로 이름 메소드 변경필요

extern "C" JNIEXPORT jstring JNICALL 
Java_패키지_액티비티_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

액티비티에서 사용 소스

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    // Example of a call to a native method
    findViewById<TextView>(R.id.sample_text).text = stringFromJNI()
}
external fun stringFromJNI(): String
companion object {
    init {
        System.loadLibrary("native-lib")
    }
}

 

so파일 export

1. Build > Build Bundles(s) / APK(s) > Build APK(s)를 선택합니다.

2. Build > Analyze APK를 선택합니다.

3. apk압축 해제후 lib하위 폴더에 so파일이 생성된 것을 확인할 수 있습니다.

 

 

 

1. 다른 방법으로

https://developer.android.com/ndk/guides/cmake?hl=ko

toolbar gradle 명령에서 externalNativeBuild를 실행하면

 

 

로그에 so 파일 생성되고 경로가 정보창으로

...

app/build/intermediates/cmake/release/obj/x86_64/libnative-lib.so

...

으로 생성된 것을 확인할 수 있습니다.

 

다른 프로젝트에서 사용하기

so 폴더 파일들을 사용할 프로젝트에 jniLibs폴더 생성 모두 복사

Timber.tag(TAG).i("jni : " + stringFromJNI())
external fun stringFromJNI(): String

companion object {
    // Used to load the 'native-lib' library on application startup.
    init {
        System.loadLibrary("native-lib")
    }
}

 

로그로 잘 찍히는 것을 확인하였습니다.

 

 

 

SO 파일 HEX 값 확인

이와 같이 테스트한 목적은 암호화키를 하드 코딩을 숨길 수 있을까하는 관점에서 테스트해보았으며

hex editor에 문자열이 노출되는 것을 확인되어 파악이 쉽진않겠지만 보안이 보장되지 않는것을 확인하였습니다.

 

 

이상입니다.