用于Android应用程序集成的SQLCipher
本教程将涵盖将SQLCipher for Android的二进制文件集成到Android应用程序中。本教程假定本地开发计算机上已经安装了Android SDK。
创建示例Android应用程序
要创建示例Android应用程序,请发出以下命令:
% mkdir demo-app
% cd demo-app
% android create project \
--target android-10 \
--name demoapp \
--path . \
--activity HelloSQLCipherActivity \
--package com.demo.sqlcipher
获取二进制文件
Android的SQLCipher的源代码在Github.com上公开维护,可在此处找到当前的二进制版本。有关构建适用于Android的SQLCipher源的信息,请参见以下说明。我们将使用以下命令手动下载压缩的tar文件并将其解压缩到您的应用程序根目录中:
% curl -L -o sqlcipher-for-android.zip https://s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+v3.1.0.zip
% unzip sqlcipher-for-android.zip
我们需要将各种库和资产文件复制到应用程序的根目录中。执行以下命令:
% cp -R SQLCipher\ for\ Android\ v3.1.0/libs/* libs
% cp -R SQLCipher\ for\ Android\ v3.1.0/libs/*assets
演示应用程序的文件应类似于以下结构:
积分
从菜单启动Eclipse和
choose File -> New -> Android Project
。为项目命名,然后从现有源中选择“创建项目”,指向您的应用程序根目录。它看起来应该类似于:
接下来,我们需要在我们的libs目录中引用3个jar文件。右键单击Package Explorer中的项目节点,然后选择
Build Path -> "Configure Build Path..."
。选择库选项卡,然后按
"Add JARs..."
按钮。选择
commons-codec.jar, guava-r09.jar and sqlcipher.jar
。选择这三个罐子后,屏幕应如下所示:
接下来,我们将修改默认 Activity 的源,以正确初始化SQLCipher的本机库,然后创建插入记录的数据库文件。特别要注意的是,导入
net.sqlcipher.database.SQLiteDatabase
而不是
android.database.sqlite.SQLiteDatabase
以及对
SQLiteDatabase.loadLibs(this)
的调用。对
SQLiteDatabase.loadLibs(this)
的调用必须在任何其他数据库操作之前进行。
package com.demo.sqlcipher;
import java.io.File;
import net.sqlcipher.database.SQLiteDatabase;
import android.app.Activity;
import android.os.Bundle;
public class HelloSQLCipherActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InitializeSQLCipher();
}
private void InitializeSQLCipher() {
SQLiteDatabase.loadLibs(this);
File databaseFile = getDatabasePath("demo.db");
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
database.execSQL("create table t1(a, b)");
database.execSQL("insert into t1(a, b) values(?, ?)", new Object[]{"one for the money",
"two for the show"});
}
}
现在,示例应用程序应该可以在仿真器或设备上运行。
适用于Android的SQLCipher生成教程本教程将涵盖从头开始为Android构建SQLCipher的源代码。本教程针对Android NDK的修订版7,旨在使Linux或OSX环境下的复杂化。
系统环境要求
为了构建用于Android的SQLCipher的源,需要一些工具。构建机器上需要提供包括
Android SDK, Android NDK and the JDK
在内的多个开发套件。我们将需要
ANDROID_NDK_ROOT
上可用的
PATH
环境变量。您还需要Git来获取源代码树。要验证是否正确配置了
PATH
,请执行以下命令:
% which ndk-build
/Users/nparker/bin/android-ndk/ndk-build
如果收到未找到的ndk-build,则需要将以下内容添加到
.bashrc
或相应的shell配置文件中。请注意,下面的
~/bin/android-ndk
路径代表Android NDK根目录在我的机器上的位置,请相应调整:
export ANDROID_NDK_ROOT=~/bin/android-ndk
export PATH=$ANDROID_NDK_ROOT:$PATH
我们将使用Make作为与NDK工具链进行交互的基础构建工具。
获取源Android的SQLCipher的源代码在Github.com上公开维护。我们将从本地克隆存储库开始:
% cd ~/code
% git clone git://github.com/sqlcipher/android-database-sqlcipher.git
建造
构建代码的过程分为两个不同的阶段。第一次执行此操作时,我们需要初始化Android的SQLCipher依赖的各种git子模块。这一切都是通过Make自动化的。
% cd android-database-sqlcipher
% make init
一旦git完成下拉编译所需的各个子模块,我们就可以开始构建过程:
%制造
此过程将需要一些时间才能完成。完成后,您应该具有以下文件可用于集成到应用程序的libs目录中:
% tree libs
libs
├── armeabi
│ ├── libdatabase_sqlcipher.so
│ ├── libsqlcipher_android.so
│ └── libstlport_shared.so
├── commons-codec.jar
├── guava-r09.jar
└── sqlcipher.jar
本地化依赖
适用于Android的SQLCipher依赖于ICU项目中的本地化数据。适用于Android的SQLCipher将尝试使用系统提供的ICU本地化数据文件,该文件位于
icudt46l.dat
中(如果可用),称为
/system/usr/icu directory
。如果未找到,则SQLCipher for Android将尝试解压缩位于应用程序资产目录内的
icudt46l.zip
文件。建议将
icudt46.zip
文件包含在您的应用程序中,以实现最佳平台兼容性。
参考:
https://www.zetetic.net/sqlcipher/sqlcipher-for-android/