자신만의 Sqlite 설치하고 개발하기

2023. 3. 23. 19:49모바일프로그래밍/안드로이드

728x90

커스텀 Sqlite 설치하고 개발하기

일단 안드로이드에서 sqlite은 기본은 내장된 데이터베이스로 알고 있다.

더 깊이 들어가고 싶으나 아는 것은 여기 까지고,

대신 이 데이터베이스를 사용해서 기본적을 디바이스 내에서 데이터의

CRUD 작업을 할 수 있다고들 한다.

 

그러면...

과연 도데체 왜? 커스텀으로 sqlite을 설치하려고 하는 것인가에 대한 문제가 남는 것 같다..

사실 그냥 내장 sqlite을 사용하는 것이 더 쉽고 간단한 일인데, 굳이 컴파일 해서

라이브러리를 빌드 할 이유가 무엇일까?

추측컨데, 물론 극히 개인적인 견해인데, 다음 두가지가 아닐까 한다.

첫번째는 개발자의 자존심 - 황당하기는 하다만 나도 할 수 있다는 것을 보여주고 싶다

두번째는 다음 사이트1에서 서두에 언급한 내용이다.

역시 대단한 사람들이 SQLite 바인딩을 만들어 두면서, 다음과 같이 한마디 날린다.


One disadvantage of using Android's built-in SQLite support is that
the application is forced to use the version of SQLite that the current
version of Android happened to ship with. If your application happens
to require a newer version of SQLite, or a build with a custom extension
or VFS installed, you're out of luck.
 

한마디로 말하자면 최신에 sqlite을 쓰고 싶다면 어떻게 할래? 라는 물음에 대한 대답이 아닐까 한다.

 본론으로 들어가서 커스텀 Sqlite를 어떻게 설치 할 것인가에 대한 순서만을 정해 보는 것으로 한다.

0. 설치 전 사항

안드로이드 ndk가 설치되어 있다고 가정한다.

그리고 나의 ndk 홈은 다음과 같이 설정 하였다.

export NDK_HOME=/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows
 

현재 GCC 버전 보다는 하위버전인 4.8을 사용하도록 한다. 왠지 최신 버전은 좀 그렇다.

 

1. 설치 하기 

git 로 간단히 설치 할 수 있을 것이다.

대략 다음 그림 처럼 리스트가 보일 것이다.

 

간략하게 설명하자면 우선 sqlite도 자바 인터페이스가 존재 한다는 것이고, 당연히 이 자바인터페이스가 사용하는 것을 네이티브 sqlite 코드 일 것이다 고로 JNI(Java Native Interface)를 사용하고 있다는 뜻. 따라서 관심을 가져야 할 곳은 'jni' 디렉토리가 된다.

jni 디렉토리로 들어가 보면 익숙한 파일들이 존재하는 것이 보일 것이다.

안드로이드에서 제공해주는 Makefile 인 Android.mk Application.mk 파일들이 그것이다.

 

2. 컴파일 하기

컴파일 및 빌드는 은 대략 다음과 같이 하면 될 듯하다.

왜 아래와 같이 해야 하는 지 묻는 다면....

ndk-build 하면 그냥 될 것 같다고 말해 주고 싶기는 하다. 대신 약간 더 알고 싶은 맘에 아래와 같이 파고 들수도 있다는 것이다.

arm-linux-androideabi-g++ \
-DSQLITE_HAS_CODEC \
-DHAVE_CONFIG_H \
-DKHTML_NO_EXCEPTIONS \
-DGKWQ_NO_JAVA \
-DNO_SUPPORT_JS_BINDING \
-DQT_NO_WHEELEVENT \
-DKHTML_NO_XBL -U__APPLE__ \
-DHAVE_STRCHRNUL=0 \
-Wno-unused-parameter \
-Wno-int-to-pointer-cast \
-Wno-maybe-uninitialized \
-Wno-parentheses \
-Wno-conversion-null \
-I. \
-I/ndk/platforms/android-19/arch-arm/usr/include \
-I./nativehelper --sysroot /ndk/platforms/android-19/arch-arm -shared \
-I/ndk/sources/cxx-stl/stlport/stlport \
-c android_database_SQLiteCommon.cpp -o android_database_SQLiteCommon.o

arm-linux-androideabi-g++ \
-DSQLITE_HAS_CODEC \
-DHAVE_CONFIG_H \
-DKHTML_NO_EXCEPTIONS \
-DGKWQ_NO_JAVA \
-DNO_SUPPORT_JS_BINDING \
-DQT_NO_WHEELEVENT \
-DKHTML_NO_XBL -U__APPLE__ \
-DHAVE_STRCHRNUL=0 \
-Wno-unused-parameter \
-Wno-int-to-pointer-cast \
-Wno-maybe-uninitialized \
-Wno-parentheses \
-Wno-conversion-null \
-I. \
-I/ndk_libs/sqlite/jni_sqlite_tobee/sqlite/include \
-I/ndk/platforms/android-19/arch-arm/usr/include \
-I./nativehelper --sysroot /ndk/platforms/android-19/arch-arm -shared \
-I/ndk/sources/cxx-stl/stlport/stlport \
-c android_database_SQLiteConnection.cpp -o android_database_SQLiteConnection.o

arm-linux-androideabi-g++ \
-DSQLITE_HAS_CODEC \
-DHAVE_CONFIG_H \
-DKHTML_NO_EXCEPTIONS \
-DGKWQ_NO_JAVA \
-DNO_SUPPORT_JS_BINDING \
-DQT_NO_WHEELEVENT \
-DKHTML_NO_XBL -U__APPLE__ \
-DHAVE_STRCHRNUL=0 \
-Wno-unused-parameter \
-Wno-int-to-pointer-cast \
-Wno-maybe-uninitialized \
-Wno-parentheses \
-Wno-conversion-null \
-I. \
-I/ndk_libs/sqlite/jni_sqlite_tobee/sqlite/include \
-I/ndk/platforms/android-19/arch-arm/usr/include \
-I./nativehelper --sysroot /ndk/platforms/android-19/arch-arm -shared \
-I/ndk/sources/cxx-stl/stlport/stlport \
-c android_database_SQLiteGlobal.cpp -o android_database_SQLiteGlobal.o

arm-linux-androideabi-g++ \
-DSQLITE_HAS_CODEC \
-DHAVE_CONFIG_H \
-DKHTML_NO_EXCEPTIONS \
-DGKWQ_NO_JAVA \
-DNO_SUPPORT_JS_BINDING \
-DQT_NO_WHEELEVENT \
-DKHTML_NO_XBL -U__APPLE__ \
-DHAVE_STRCHRNUL=0 \
-Wno-unused-parameter \
-Wno-int-to-pointer-cast \
-Wno-maybe-uninitialized \
-Wno-parentheses \
-Wno-conversion-null \
-I. \
-I/ndk_libs/sqlite/jni_sqlite_tobee/sqlite/include \
-I/ndk/platforms/android-19/arch-arm/usr/include \
-I./nativehelper --sysroot /ndk/platforms/android-19/arch-arm -shared \
-I/ndk/sources/cxx-stl/stlport/stlport \
-c android_database_SQLiteDebug.cpp -o android_database_SQLiteDebug.o
arm-linux-androideabi-g++ \
-DSQLITE_HAS_CODEC \
-DHAVE_CONFIG_H \
-DKHTML_NO_EXCEPTIONS \
-DGKWQ_NO_JAVA \
-DNO_SUPPORT_JS_BINDING \
-DQT_NO_WHEELEVENT \
-DKHTML_NO_XBL -U__APPLE__ \
-DHAVE_STRCHRNUL=0 \
-Wno-unused-parameter \
-Wno-int-to-pointer-cast \
-Wno-maybe-uninitialized \
-Wno-parentheses \
-Wno-conversion-null \
-I. \
-I/ndk_libs/sqlite/jni_sqlite_tobee/sqlite/include \
-I/ndk/platforms/android-19/arch-arm/usr/include \
-I./nativehelper --sysroot /ndk/platforms/android-19/arch-arm -shared \
-I/ndk/sources/cxx-stl/stlport/stlport \
-c JNIHelp.cpp -o JNIHelp.o

arm-linux-androideabi-g++ \
-DSQLITE_HAS_CODEC \
-DHAVE_CONFIG_H \
-DKHTML_NO_EXCEPTIONS \
-DGKWQ_NO_JAVA \
-DNO_SUPPORT_JS_BINDING \
-DQT_NO_WHEELEVENT \
-DKHTML_NO_XBL -U__APPLE__ \
-DHAVE_STRCHRNUL=0 \
-Wno-unused-parameter \
-Wno-int-to-pointer-cast \
-Wno-maybe-uninitialized \
-Wno-parentheses \
-Wno-conversion-null \
-I. \
-I/ndk_libs/sqlite/jni_sqlite_tobee/sqlite/include \
-I/ndk/platforms/android-19/arch-arm/usr/include \
-I./nativehelper --sysroot /ndk/platforms/android-19/arch-arm -shared \
-I/ndk/sources/cxx-stl/stlport/stlport \
-c JniConstants.cpp -o JniConstants.o

arm-linux-androideabi-gcc \
-DSQLITE_HAS_CODEC \
-DHAVE_CONFIG_H \
-DKHTML_NO_EXCEPTIONS \
-DGKWQ_NO_JAVA \
-DNO_SUPPORT_JS_BINDING \
-DQT_NO_WHEELEVENT \
-DKHTML_NO_XBL -U__APPLE__ \
-DHAVE_STRCHRNUL=0 \
-Wno-unused-parameter \
-Wno-int-to-pointer-cast \
-Wno-maybe-uninitialized \
-Wno-parentheses \
-I. \
-I/ndk_libs/sqlite/jni_sqlite_tobee/sqlite/include \
-I/ndk/platforms/android-19/arch-arm/usr/include \
-I./nativehelper \
-c sqlite3secure.c -o sqlite3secure.o

--------------------------------------------
/ndk1_libs/sqlite/jni_sqlite_tobee/sqlite/lib/libsqliteX.so
Program Linking
---------------------------------------------
arm-linux-androideabi-g++ \
-DSQLITE_HAS_CODEC \
-DHAVE_CONFIG_H \
-DKHTML_NO_EXCEPTIONS \
-DGKWQ_NO_JAVA \
-DNO_SUPPORT_JS_BINDING \
-DQT_NO_WHEELEVENT \
-DKHTML_NO_XBL -U__APPLE__ \
-DHAVE_STRCHRNUL=0 \
-Wno-unused-parameter \
-Wno-int-to-pointer-cast \
-Wno-maybe-uninitialized \
-Wno-parentheses \
--sysroot /ndk/platforms/android-19/arch-arm -shared \
-o /ndk_libs/sqlite/jni_sqlite_tobee/sqlite/lib/libsqliteX.so \
android_database_SQLiteCommon.o \
android_database_SQLiteConnection.o \
android_database_SQLiteGlobal.o \
android_database_SQLiteDebug.o \
JNIHelp.o \
JniConstants.o \
sqlite3secure.o \
-L/ndk/sources/cxx-stl/stlport/libs/armeabi-v7a \
-lstlport_static -ldl -llog
arm-linux-androideabi-strip lib/libsqliteX.so
 

근데 문제점이 하나 있는 데 원래 이 분이 컴파일 한 것은 약 400k 인데 내가 이렇게 컴파일 하면 900k 정도 나온다는 거다 거의 두배 수준인 데 이 부분은 어케 고쳐야 하는 지 알아보아야 할 듯 하다.

최적화 옵션이 들어가야 하는 듯 하다...

-O2 : 성능 최적화 옵션

-Os​ : 크기 최적화 옵션

위의 둘 중 하나의 옵션이 들어가면 될 듯...​

 

3. 테스트 프로그램

org.sqlite.app.customsqlite 패키지 내에 있는 CustomSqlite 자바 파일을 참고 하도록 하자.

 대충 비슷하게 흉내만 내고 있는 데 다음과 같이 수정을 해보았다.

private File SQL_DB_FILE;


private SQLiteHandler()
{
	SQL_DB_PATH = FileManager.getInstance().getStoragePath(false) + DB_PATH;
	SQL_DB_FILE = new File(SQL_DB_PATH);
	SQL_DB_FILE.mkdirs();

	LogUtil.logD(TAG, "SQLite DB path [%s]\n\n", SQL_DB_PATH);
}


public void report_version(){
	SQLiteDatabase db = null;
	SQLiteStatement st;
	String res;

	db = SQLiteDatabase.openOrCreateDatabase(":memory:", null);
	st = db.compileStatement("SELECT sqlite_version()");
	res = st.simpleQueryForString();
	LogUtil.logD(TAG, "SQLite version [%s]\n\n", res);
}
 
 

또 다른 접근 방식도 있는 데 다음사이트2를 참고 하자

 

이상.

 

 


 

728x90