Xamarin で SQLite.Net-PCL を使うと Android 7 では unauthorized access to "/system/lib64/libsqlite.so" と出た

シェアする

Xamarin で SQLite を扱う際に SQLite.Net-PCL を試していたのだけど、Nexus 5X(Android 7) で実行してみたところアプリケーションの起動時に以下のようなエラーメッセージが出た。

Detected problems with app native libraries(please consult log for detail):
libonosgen-64bit-2.0.so:
unauthorized access to "/system/lib64/libsqlite.so"

意味がわからなかったのだが、Xmarin のページを見てみると Android 7 からの仕様変更により libsqlite.so へアクセスできなくなったみたいな事が書いてある。

Note: Due to a change by Google, Android N will now only permit linking to NDK-provided native libraries. libsqlite.so is not an NDK-provided native library. Consequently, existing apps using e.g. Mono.Data.Sqlite.dll will crash when running on Android N. This may include other SQLite-using assemblies, not distributed with Xamarin.Android.

なので Android 6 で確かめた際は上記のエラーメッセージは表示されなかった。

SQLite.Net-PCL の情報を確認すると最終更新日が 2015年11月で止まっているようであった。Android 7 がリリースされたのが 2016 年なので対応していないのだろう。

というわけで Xamarin で SQLite を扱う際は sqlite-net-pcl を利用すると良さそうだ。名前がややこしいが、こちらは Android 7 にも対応しておりエラーメッセージなど表示されない。

Xamarin 公式でもこっちを利用しているようだ。

SQLite.Net-PCL から sqlite-net-pcl への移行も簡単にできる。試しに BuildINSIDER の 「Xamarin.Formsでローカルデータベースを使用するには?」で作成したプロジェクトを sqlite-net-pcl へ移行してみた。

まず Packages から SQLite.Net-PCL を削除し、NuGet より sqlite-net-pcl を追加する。

sqlite-net-pcl を入れると必要なものとして SQLite-PCLRaw.core とかイロイロついてくる。

次に using SQLite.Net となっている箇所を using SQLite; と書き換える。

最後にデバイス毎に new SQLiteConnection している箇所を以下のように変更する。

// これを
return new SQLiteConnection(new SQLitePlatformAndroid(), path);
// こうする
return new SQLiteConnection(path);

これでビルドでき、Android 7 でもエラーダイアログが表示される事なく SQLite を利用できると思う。

Sponsored Link

シェアする

フォローする