ここ1年から2年ぐらいの間に Android 開発環境が大きく変化し、過去のドキュメントが役に立たなくなることが散見されるようになりました。
具体的には JCenter や Kotlin synthetics が非推奨になったりしたわけですが、モバイルデータベース Realm も気がついたら以前の設定のままでは使えなくなっていました。
そこで設定方法を一通り検索してみたのですが、情報が錯綜しているようで、断片的には正しいと言える情報しか見つけられませんでした。
MongoDB Realm Android Kotlin Tutorial を見ても要領を得ないというわけで、備忘録も兼ねて設定方法を記載します。
使用するのは Android Studio 2020.3.1 (Gradle Plugin Version 7.0.3/ Gradle Version 7.0.2) および io.realm : realm-android-library : 10.5.1 です。
どこかに解決策としてバージョンをダウングレードすると書かれていましたが、正しく設定できればその必要はありません。
詳しい動作環境は以下のとおりです。
$ cat /usr/local/android-studio/product-info.json
{
"name": "Android Studio",
"version": "dev build",
"buildNumber": "203.7717.56.2031.7784292",
"productCode": "AI",
"dataDirectoryName": "AndroidStudio2020.3",
"svgIconPath": "bin/studio.svg",
"launch": [
{
"os": "Linux",
"launcherPath": "bin/studio.sh",
"vmOptionsFilePath": "bin/studio64.vmoptions",
"startupWmClass": "jetbrains-studio"
}
],
"customProperties": []
$ hostnamectl
Static hostname: ubuntu
Icon name: computer-desktop
Chassis: desktop
Operating System: Ubuntu 20.04.3 LTS
Kernel: Linux 5.4.0-89-generic
Architecture: x86-64
1. build.gradle (Project)
Project の build.gradle ファイルの中にある dependencies のなかに Realm の classpath を追記します。
古い記事などでは repositories のなかに jcenter() を追記すると書かれているものもありますが、あと数ヶ月で使えなくなるので無視して構いません。
むしろ、気をつけなければならないのは、MavenCentral レポジトリには Realm バージョン 10.4.0 以降しか 登録されていないので、それ以前のバージョンを設定するとエラーになることです。
buildscript {
dependencies {
classpath "io.realm:realm-gradle-plugin:10.5.1"
}
}
2. build.gradle (:app)
次に App の build.gradle ファイルの中にある plugins のなかに kotlin-kapt と realm-android を追記します。
plugins {
id 'kotlin-kapt'
id 'realm-android'
}
ここも調べてみると、さまざまな追記の方法が見つかり、その中には本当に動作するのか疑わしいようなものも見られるのですが、ほかの設定ファイルにならって普通に追記すれば良いです。
3. settings.gradle (Project Settings)
ここまでで Sync Project を実行すると App の設定を変更したことにより、以下のようなエラーが生じます。
Caused by: org.gradle.api.InvalidUserCodeException: Build was configured to prefer settings repositories over project repositories but repository ‘MavenRepo’ was added by plugin ‘realm-android’
これはプロジェクト内でリポジトリが宣言されたときに、強制的にビルドを失敗させられる設定になっているために生じているエラーなので settings.gradle ファイルを開いて repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) をコメントアウトし、ドキュメントに従って PREFER_PROJECT または PREFER_SETTINGS を設定します。
dependencyResolutionManagement {
// repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
}
この設定ファイルを書き換えた後に保存して、Sync Project を実行した場合にエラーが生じなければ Realm を使えるようになっているはずです。
適当なクラスを作成して Realm をインポートしてみると、無事に読み込めることが確認できます。
package info.femoghalvfems.example
import android.app.Application
import io.realm.Realm
import io.realm.RealmConfiguration
open class ExampleApplication : Application() {
override fun onCreate() {
super.onCreate()
Realm.init(this@ExampleApplication)
val conf = RealmConfiguration.Builder().build()
Realm.setDefaultConfiguration(conf)
}
}

