[Android] SO 파일 만들어 다른 프로젝트에서 사용해보기
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에 문자열이 노출되는 것을 확인되어 파악이 쉽진않겠지만 보안이 보장되지 않는것을 확인하였습니다.
이상입니다.