前文我们介绍了如何编译Berkeley DB SQL(BDB SQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的 SQLite库,我们称其为drop-in模式。在这种模式下,Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到BDB SQL库以获取更高的存储和并发性能。

  本文将使用完整的Android源代码来编译构建我们的全新Android系统镜像,而Android源代码包中包含了交叉编译器,因此我们不需要事先安装NDK。

  1. 编译Android代码

  从Android官方网站获取一份Android源代码,这份源代码有2~3G之巨。

  在Linux平台上,把源代码解压到$HOME/android/android_src

  安装java 1.5版本,(1.6不行),并设置JAVA_HOME和PATH:

  $ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun

  $ export PATH=$JAVA_HOME/bin:$PATH

  先把原始的Android代码完全编译成功(这过程可能要花2~3小时):

  $ cd $HOME/android/android_src

  $ . build/envsetup.sh

  $ make

  可看到生成三个镜像:

  Install system fs image: out/target/product/generic/system.img

  Target ram disk: out/target/product/generic/ramdisk.img

  Target userdata fs image: out/target/product/generic/userdata.img

  2. 安装Android SDK并测试镜像

  安装Android SDK: http://developer.android.com/sdk/installing.html, 安装目录:$HOME/android/android-sdk-linux_86

  安装Android SDK组件: http://developer.android.com/sdk/adding-components.html,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7

  用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk,那么以下目录”android-sdk-linux_86″相应应该改成 “android-sdk-windows”。

  $ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1

  $ cp -r images images.bak

  $ cp $HOME/android/android_src/out/target/product/generic/*.img images

  创建并运行一个新的设备:

  $ cd $HOME/android/android-sdk-linux_86/tools/

接上页

  $ ./android

  (如图)使用图形界面工具创建一个Android 2.1的设备BDBSQL,并点击”start”启动。新的设备第一次启动的时间会非常长,这是正常现象。等到Android界面出现,就说明我们的镜像编译基本没问题了。接下来我们进一步把SQLite库替换为BDB。

  3. 编译BDB SQL

  从http://www.oracle.com/technology/software/products/berkeley-db/index.html下载BDB 11gR2源文件(db-5.0.x.tar.gz),然后

  $ cd $HOME/android/android_src/external/sqlite/dist

  $ tar zxvf db-5.0.x.tar.gz

  $ cp Android.mk Android.mk.bak

  $ cp db-5.0.x/build_android/Android.mk .

  编辑Android.mk,默认的BDB Log和Region文件大小总和可达到十几兆,因此我们有必要修改Android.mk来减小它(可能需要为Android.mk去掉只读属性)。修改第一处LOCAL_CFLAGS如下所示(相对于默认配置,我们删除了-DSQLITE_OMIT_TRUNCATE_OPTIMIZATION,新增了 -DSQLITE_DEFAULT_CACHE_SIZE=256 -DBDBSQL_MAX_LOCKS=1000 -DBDBSQL_MAX_LOCK_OBJECTS=1000):

  LOCAL_CFLAGS += -Wall -DHAVE_USLEEP=1

  -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576

  -DSQLITE_THREADSAFE=1 -DNDEBUG=1 -DSQLITE_TEMP_STORE=3

  -DSQLITE_OS_UNIX=1

  -D_HAVE_SQLITE_CONFIG_H -DSQLITE_THREAD_OVERRIDE_LOCK=-1

  -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_BACKWARDS -Dfdatasync=fsync

  -DSQLITE_DEFAULT_CACHE_SIZE=256

  -DBDBSQL_MAX_LOCKS=1000

  -DBDBSQL_MAX_LOCK_OBJECTS=1000

  如果确定不会在多进程间共享数据库,还可以在上述LOCAL_CFLAGS中加入”-DBDBSQL_OMIT_SHARING”,这样日志文件不会被写入文件系统,进一步节省了设备空间。

  编译系统镜像中的SQLite部分:

  $ cd $HOME/android/android_src

  $ . build/envsetup.sh

  $ make clean-libsqlite

  $ mmm -B external/sqlite/dist

  $ make snod

  编译好了,再来一次镜像替换:

  $ cp $HOME/android/android_src/out/target/product/generic/*.img

 

接上页$HOME/android/android-sdk-linux_86/platforms/android-2.1/images

 

  使用图形界面工具删除先前的设备BDBSQL,重创建一个新的Android 2.1设备BDBSQL,并点击”start”启动。这里一定要创建新的设备,因为启动过的设备,其数据库文件已被SQLite生成,BDB SQL无法访问。

  4. 使用BDB SQL

  现在Android里所有应用程序的SQL存储引擎都已被替换为BDB SQL了。我们使用”联系人”来试用一下我们的新设备吧,在Setting里面把Locate设置为中文简体,安装一个中文输入法(比如搜狗),然后打开“联系人”,随便增加一条记录:

  在主机上我们可以使用adb shell来查看并操作程序所生成的数据库。请留意sqlite3 shell输出的版本信息是Berkeley DB 11gR,同时shell的提示符是dbsql>,这说明我们已经把SQLite成功替换为BDB SQL引擎:

  $ adb shell

  # cd /data/data/com.android.providers.contacts/databases/

  # sqlite3 contacts2.db

  Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)

  Enter ".help" for instructions

  Enter SQL statements terminated with a ";"

  dbsql> .tables

  _sync_state status_updates

  _sync_state_metadata v1_settings

  activities view_contacts

  agg_exceptions view_contacts_restricted

  android_metadata view_data

  calls view_data_restricted

  contact_entities_view view_groups

  contact_entities_view_restricted view_raw_contacts

  contacts view_raw_contacts_restricted

  data view_v1_contact_methods

  groups view_v1_extensions

  mimetypes view_v1_group_membership

  name_lookup view_v1_groups

  nickname_lookup view_v1_organizations

  packages view_v1_people

  phone_lookup view_v1_phones

  raw_contacts view_v1_photos

  settings

  dbsql> select * from contacts;

  2|逍遥 李|||0|0|0|0|1|1|0nE08B4A8BFA37D4||0

 

接上页

  dbsql> select * from data;

  1||4|1|0|0|0|li|li|||||||||||||||||

  2||6|2|0|0|0|66666666|1||66666666|||||||||||||||

  3||6|2|0|0|0|88888888|2||88888888|||||||||||||||

  4||8|2|0|0|0|蜀山|1|||||||||||||||||

  5||4|2|0|0|0|逍遥 李|逍遥|李||||||||||||||||

  dbsql>

  5. 结束语

  关于BDB SQL库在Android平台上的编译和使用的介绍到这里就结束了。我们用两篇博文分别介绍了side-by-side(并存)和Drop-in(替换)这两种使用方式。在Drop-in模式下,现有的应用程序无修改就可以直接使用BDB SQL引擎。

  BDB SQL在开发过程中始终给予Android平台高度重视,在开发过程中投入了多位资深工程师致力于将BDB SQL移植到Android平台上,并将Android列为产品周期测试的主流平台。OARDC的工程师Zengfa.Dou和Stephen.Tang 给予了我这个初学者极大帮助。在此一并致谢!

 

下载数据库软件

http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐