val fos = FileOutputStream(application.dataDir.resolve(file.name))
Как-то так должно работать.все эти объекты, которые не были удалены, которые показывает профайлер, это разве не утечка?На скриншоте показано только общее количество аллокаций, а не текущее количество объектов в памяти. Там правее ещё deallocations и total count. Вот total count - это текущее количество объектов в памяти.
никакого canarylink.install(this)
Это в старой версии так было. Новую достаточно просто подключить, она сама запустится. Неужели документацию не прочитать? https://square.github.io/leakcanary/getting_started/