読者です 読者をやめる 読者になる 読者になる

干し石榴長文用

長文以外はTumblrへ徐々に移します。

ProGuard with SQLCipher for Android

THE GUARDIAN PROJECT の SQLCipher for Androidを導入することに.
まずgithubから1.1.0をダウンロードしてlibsとassetsの中身をプロジェクトにコピー,jarをビルドパスに追加する.
デバッグインストールなら動くものの,署名付きAPKを作ろうとするとProGuardでエラー.
SQLCipher for AndroidGuavaに依存しているようなのですが,Guavaを含む場合にProGuardで問題があるようなので以下を参照して解決.

しかし実行時に以下のエラー

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.** {*;}

ふー