Исключить временные файлы Realm из сборки Gradle - PullRequest
0 голосов
/ 27 ноября 2018

Realm предоставляет средство просмотра базы данных под названием «Realm Studio», которое позволяет пользователям просматривать содержимое своей базы данных.Когда приложение используется для просмотра базы данных, оно создает несколько «временных» файлов в каталоге базы данных, а именно:

  • A .realm.lock file.
  • A .realm.note file.
  • A .realm.management каталог, содержащий:
    • A access_control.control.mx file.
    • A access_control.new_commit.cv file.
    • A access_control.pick_writer.cvfile.
    • A access_control.write.mx file.

В контексте Android существующая база данных Realm иногда поставляется с приложением, помещая базу данных вкаталог /assets.Таким образом, когда Realm Studio используется для просмотра этой базы данных, вышеупомянутые файлы создаются в /assets.По неизвестным причинам это приводит к зависанию Gradle на неопределенное время после задачи :app:generateDebugAssets, по-видимому, в задаче :app:mergeDebugAssets.

Поэтому я бы хотел найти способ исключить эти файлы из сборки.Я пробовал несколько методов, таких как:

applicationVariants.all { variant ->
    if (variant.buildType.name == 'debug') {
        variant.mergeAssets.doLast {
            delete(fileTree(dir: variant.mergeAssets.outputDir, includes: ['**/*.cv', '**/*.mx', '**/*.lock', '**/*.note']))
        }
    }
}

и другие методы, такие как:

sourceSets.main.assets.exclude 'appData.realm.management'
sourceSets.main.assets.exclude 'appData.realm.management/access_control.control.mx'
sourceSets.main.assets.exclude 'appData.realm.management/access_control.new_commit.cv'
sourceSets.main.assets.exclude 'appData.realm.management/access_control.pick_writer.cv'
sourceSets.main.assets.exclude 'appData.realm.management/access_control.write.mx'
sourceSets.main.assets.exclude 'appData.realm.lock'
sourceSets.main.assets.exclude 'appData.realm.note'

безрезультатно.

Как можно научить Gradleисключить эти файлы при запуске сборки?

РЕДАКТИРОВАТЬ: Небольшой фрагмент повторного вывода из ./gradlew -d app:mergeDebugAssets:

[org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
[org.gradle.process.internal.health.memory.MemoryManager] Emitting OS memory status event {Total: 8589934592, Free: 2572066816}
[org.gradle.launcher.daemon.server.health.LowMemoryDaemonExpirationStrategy] Received memory status update: {Total: 8589934592, Free: 2572066816}
[org.gradle.process.internal.health.memory.MemoryManager] Emitting JVM memory status event {Maximum: 1431830528, Committed: 308281344}
[org.gradle.process.internal.health.memory.MemoryManager] Emitting OS memory status event {Total: 8589934592, Free: 2567909376}
[org.gradle.launcher.daemon.server.health.LowMemoryDaemonExpirationStrategy] Received memory status update: {Total: 8589934592, Free: 2567909376}
[org.gradle.process.internal.health.memory.MemoryManager] Emitting JVM memory status event {Maximum: 1431830528, Committed: 308281344}
[org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
[org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
[org.gradle.process.internal.health.memory.MemoryManager] Emitting OS memory status event {Total: 8589934592, Free: 2564087808}
[org.gradle.launcher.daemon.server.health.LowMemoryDaemonExpirationStrategy] Received memory status update: {Total: 8589934592, Free: 2564087808}
[org.gradle.process.internal.health.memory.MemoryManager] Emitting JVM memory status event {Maximum: 1431830528, Committed: 308281344}
[org.gradle.process.internal.health.memory.MemoryManager] Emitting OS memory status event {Total: 8589934592, Free: 2560860160}
[org.gradle.launcher.daemon.server.health.LowMemoryDaemonExpirationStrategy] Received memory status update: {Total: 8589934592, Free: 2560860160}
[org.gradle.process.internal.health.memory.MemoryManager] Emitting JVM memory status event {Maximum: 1431830528, Committed: 308281344}
[org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
[org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
...

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Мне кажется, проблема в том, что вы не удалили каталог .realm.management.

android {

    ...

    applicationVariants.all { variant ->
        if (variant.buildType.name == 'debug') {
            variant.mergeAssets.doLast {
                delete(fileTree(dir: variant.mergeAssets.outputDir, includes: ['**/.realm.management', '**/*.lock', '**/*.note']))
            }
        }
    }
}

содержимое каталога активов:

enter image description here

содержимое каталога активов в apk:

enter image description here

0 голосов
/ 12 декабря 2018

думаю, вы, возможно, используете более старую версию Realm Studio, потому что в соответствии с , проблемы # 842 и запрос на получение # 847 , эти каталоги должны быть должным образом очищены, а такжесообщить, на случай, если нет - вместо того, чтобы глохнуть.текущая версия 3.12 должна быть исправлена ​​(в основном любой релиз после 18 июня).если это не поможет, лучшее, что вы можете сделать, это сообщить об этом под номером 842;или подайте новую проблему, которая ссылается на проблему № 842.также проверьте разрешения файловой системы, которые пользователь, который запускает gradle, может удалить там;ручное перемещение файлов таким образом, что «может» помочь, поэтому текущий пользователь может воссоздать их, а затем впоследствии может удалить свои собственные файлы.

оба метода, использующие gradle, являются обходными путями - потому что это не должно происходитьво-первых.

, чтобы получить дополнительную информацию «почему он останавливается», запустите эту команду в терминале:

./gradlew -d app:generateDebugAssets

соответственно в Windows (вопрос также не указывает на ОСни версия Realm Studio):

gradlew.bat -d app:generateDebugAssets

edit : можно даже удалить эти файлы перед каждой сборкой:

task cleanupRealm(type: Delete) {
    delete project.projectDir.path + "/src/main/assets/.realm.management"
    delete project.projectDir.path + "/src/main/assets/appData.realm.lock"
    delete project.projectDir.path + "/src/main/assets/appData.realm.note"
}

tasks.whenTaskAdded { task ->
    if (task.name == "preDebugBuild" || task.name == "preReleaseBuild") {
        task.dependsOn cleanupRealm
    }
}

, которая изменяет график задачи на:

:app:checkDebugClasspath
:app:cleanupRealm
:app:preBuild
:app:preDebugBuild
0 голосов
/ 05 декабря 2018

Попробуйте:

android {
    aaptOptions {
        ignoreAssetsPattern "!*.cv:!*.mx:!*.lock:!*.note" 
    }
}

Из aapt двоичный файл из папки build-tools:

./aapt
[...]
--ignore-assets
   Assets to be ignored. Default pattern is:
   !.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~
...