THE GUARDIAN PROJECT の SQLCipher for Androidを導入することに.
まずgithubから1.1.0をダウンロードしてlibsとassetsの中身をプロジェクトにコピー,jarをビルドパスに追加する.
デバッグインストールなら動くものの,署名付きAPKを作ろうとするとProGuardでエラー.
SQLCipher for AndroidはGuavaに依存しているようなのですが,Guavaを含む場合にProGuardで問題があるようなので以下を参照して解決.
- UsingProGuardWithGuava - guava-libraries - Guava: Google Core Libraries for Java 1.6+ - Google Project Hosting
- Using ProGuard with Guava on Android - _development,
しかし実行時に以下のエラー
02-21 16:11:12.812: E/Database(3497): Can't find SQLiteDatabase.mNativeHandle 02-21 16:11:12.812: E/Cursor(3497): Can't find info/guardianproject/database/sqlcipher/SQLiteCompiledSql 02-21 16:11:12.812: E/Cursor(3497): Can't find info/guardianproject/database/sqlcipher/SQLiteQuery 02-21 16:11:12.812: E/Cursor(3497): Can't find info/guardianproject/database/sqlcipher/SQLiteProgram 02-21 16:11:12.812: E/Cursor(3497): Can't find info/guardianproject/database/sqlcipher/SQLiteStatement 02-21 16:11:12.812: E/CursorWindow(3497): Can't find info/guardianproject/database/CursorWindow 02-21 16:11:12.812: W/dalvikvm(3497): threadid=9: thread exiting with uncaught exception (group=0x4001d7d8) 02-21 16:11:12.832: E/AndroidRuntime(3497): FATAL EXCEPTION: pool-2-thread-1 02-21 16:11:12.832: E/AndroidRuntime(3497): java.lang.NoClassDefFoundError: info.guardianproject.database.CursorWindow 02-21 16:11:12.832: E/AndroidRuntime(3497): at java.lang.Runtime.nativeLoad(Native Method) 02-21 16:11:12.832: E/AndroidRuntime(3497): at java.lang.Runtime.loadLibrary(Runtime.java:448) 02-21 16:11:12.832: E/AndroidRuntime(3497): at java.lang.System.loadLibrary(System.java:557) 02-21 16:11:12.832: E/AndroidRuntime(3497): at info.guardianproject.database.sqlcipher.SQLiteDatabase.a(Unknown Source) (中略) 02-21 16:11:12.832: E/AndroidRuntime(3497): Caused by: java.lang.NoClassDefFoundError: info.guardianproject.database.sqlcipher.SQLiteStatement 02-21 16:11:12.832: E/AndroidRuntime(3497): ... 24 more 02-21 16:11:12.832: E/AndroidRuntime(3497): Caused by: java.lang.NoClassDefFoundError: info.guardianproject.database.sqlcipher.SQLiteProgram 02-21 16:11:12.832: E/AndroidRuntime(3497): ... 24 more 02-21 16:11:12.832: E/AndroidRuntime(3497): Caused by: java.lang.NoClassDefFoundError: info.guardianproject.database.sqlcipher.SQLiteQuery 02-21 16:11:12.832: E/AndroidRuntime(3497): ... 24 more 02-21 16:11:12.832: E/AndroidRuntime(3497): Caused by: java.lang.NoClassDefFoundError: info.guardianproject.database.sqlcipher.SQLiteCompiledSql 02-21 16:11:12.832: E/AndroidRuntime(3497): ... 24 more 02-21 16:11:12.832: E/AndroidRuntime(3497): Caused by: java.lang.NoSuchFieldError: mNativeHandle 02-21 16:11:12.832: E/AndroidRuntime(3497): ... 24 more
ProGuardの最適化フェイズで削除されている模様.検索してたらフォーラムでジャストなやりとりを発見.proguard.cfgに以下を追加して解決.
-keep class info.guardianproject.database.** {*;} -keep class info.guardianproject.database.sqlcipher.** {*;}
ふー