커스텀 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를 참고 하자
이상.
'모바일프로그래밍 > 안드로이드' 카테고리의 다른 글
SQLCiper를 통한 안드로이드 Sqlite 데이터베이스 암호화 하기 (0) | 2023.04.01 |
---|---|
[Android] MVP 접근 방식으로 상용구 코드를 줄여 봅시다 (0) | 2023.03.28 |
디버깅 가능한 Android 애플리케이션 공격하기 (0) | 2023.03.07 |
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 부록 (0) | 2023.03.06 |
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 3 (1) | 2023.03.05 |