BlogKLabは、多くのスマートフォン向けゲームを開発・提供しています。スマートフォン向けゲームの開発と運用は、Webソーシャルゲームと比べて格段に複雑で、またコンシューマゲーム開発とも異なったノウハウが求められる領域もあります。このブログでは、KLabのゲーム開発・運用の中で培われた様々な技術や挑戦とそのノウハウについて、広く紹介していきます。2016/09/12Unity製AndroidアプリでSQLCipherのライブラリサイズを削減する方法こんにちは、makki_dです。今回はKLabでも利用しているSQLCipherについて、自前ビルドすることでapkファイル内のライブラリサイズを50%(当社比)削減する方法を紹介したいと思います。暗号化機能付きSQLite、SQLCipherSQLiteはファイルベースの軽量なRDBで、クライアント(iPhone/Android)内にステージや敵の基本情報(マスタデータ)等を保持するのにとても便利です。SQLiteのデータファイルを平文のまま保持していると、改ざんされたり非公開のデータが覗き見られたりしてしまうので、暗号化しておきたいものです。そんな時には、SQLiteに暗号化機能を加えたSQLCipher(※)がとても手軽で、KLabでも活用しています。この記事では、Unity製のAndroid向けアプリで、SQLCipherを依存ファイルを少なくシンプルに使うための方法を紹介します。Editionを利用しています。Editionのバイナリパッケージも用意されています。Unity5以降であれば、aarファイルをAssets/Plugins/Android以下に入れることでライブラリ自体は簡単に導入できます。このライブラリはJavaから利用することを前提とするものですので、Javaのクラスに依存していますし、Unityから使う時もJavaの世界を経由して呼び出すことになってしまいます。icudt46.zipという2.2MBのファイルがもれなく含まれていました。GooglePlayのAPKファイルサイズ制限的にも苦しいので、依存をなくしてしまいたいところです。ネイティブ共有ライブラリとして使う方法さて、ここでUnityでSQLiteを使う時を思い出したいと思います。C#には、DllImport属性を使ってネイティブ共有ライブラリの関数を直接呼び出すことができます。Mono)Unityでもこの機能を使って、Plugins以下に配置したlibsqlite3.soの関数を呼びだすことでSQLiteが使えます。SQLCipherもネイティブ共有ライブラリとしてビルドすれば、同様にDllImportできるはずです。実際にARMv7向けのネイティブ共有ライブラリをビルドしてみたいと思います。前準備として次のように環境変数を設定します。Levelは適宜読み替えてください。PATH=$TOOLCHAIN:$PATHSQLiteの場合ここでまたSQLiteを思い出したいと思います。SQLiteのビルドは、amalgamationされた単一のcソース(sqlite3.c)からコンパイルするのが簡単です。NDKを用いて次のようにビルドします。sqlite3.sosqlite3.cは公式サイトからも入手できますが、生のソースコードツリーから生成することもできます。sqlite3.cSQLCipherの場合さて、SQLCipherではどうでしょう。SQLiteと同じようにamalgamationされたsqlite3.cからコンパイルするのが簡単です。SQLCipherではsqlite3.c単体では提供されていないので、自分で生成します。sqlite3.cです。sqliteと同じですね。sqlite3.c続いてNDKでビルドするのですが、その前にOpenSSLも用意する必要があります。SQLCipherは暗号化にOpenSSLのlibcryptoを利用しているのですが、Androidが持つlibcrypto.soは使えませんので静的リンクします。(Android6以降のlibcrypto.soはOpenSSLではなくBoringSSLのもので、ドキュメントにもリンクしてはならないと書かれてます。)同じNDKでlibcrypto.aをビルドします。build_libcryptolibcrypto.aがビルドされました。生成したsqlite3.cからsqlcipherをビルドします。../openssl/libcrypto.aできあがったlibsqlcipher.soの使い方こうしてAndroid用のlibsqlcipher.soを作ることが出来ました。これは普通のネイティブ共有ライブラリなので、DllImportで直接呼び出すことができます。Javaやicudt46.zipへの依存もありません。既存のSQLite向けの実装のDllImportだけ書き換えれば使えるはずです。aarファイルでSQLCipherを導入した場合、Javaとのブリッジのためのコードの他、ARMv5向けのバイナリもapkファイルに含まれてしまいます。Unity本体がARMv5をサポートしていないので、ARMv7とx86のネイティブ共有ライブラリのみに絞ることでapkファイルのサイズを節約できます。空プロジェクトにライブラリのみ追加して試してみたところ、apkファイルサイズは次のようになりました。MBこの記事ではARMv7のAndroid向けバイナリのビルド方法を掲載しましたが、x86のAndroidやWindows向けのクロスコンパイルも基本的には同じ方法でできるはずです。挑戦してみてください。