Я пытаюсь запустить подключенные тесты для своего приложения, используя Android ISO, установленный на VirtualBox. Я получил ISO-образ Android 7.1 с сайта http://www.android-x86.org/ . Он установлен под VirtualBox и работает корректно.
Наше приложение использует PocketSphinx, который создает несколько каталогов и хранит в них файлы. Приложение корректно работает на некоторых планшетах с Android 7.0 и в эмуляторе, входящем в состав Android Studio. Некоторое время он работает правильно под VirtualBox, но попадает в какое-то странное состояние, когда он не может читать или писать в нужные ему каталоги.
AndroidManifest содержит это разрешение (наряду с другими):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Разрешения отображаются как включенные в Настройки => Приложения => [Наше приложение] => Разрешения.
Вот фактическое сообщение об ошибке:
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.hcs.android.orconnect/files/sync/cmudict-en-us.dict (No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
at edu.cmu.pocketsphinx.Assets.copy(Assets.java:224)
at edu.cmu.pocketsphinx.Assets.syncAssets(Assets.java:269)
Если я установлю точку останова перед этим вызовом, я увижу, что все они возвращают false:
new File("/storage/emulated/0/Android/data/").canRead()
new File("/storage/emulated/0/Android/data/").canWrite()
new File("/storage/emulated/0/Android/data/com.hcs.android.orconnect").canRead()
new File("/storage/emulated/0/Android/data/com.hcs.android.orconnect").canWrite()
Однако что-то создало папку /storage/emulated/0/Android/data/com.hcs.android.orconnect/files. Если я вручную удалю эту папку из приглашения оболочки adb, она будет воссоздана при следующем запуске моего теста приложения, но у приложения все еще будут те же проблемы.
Я действительно в недоумении, почему у меня возникают эти проблемы с разрешениями. Любые идеи о том, что происходит и как исправить разрешения?
(Примечание: я не хочу использовать эмулятор Android, потому что мы используем VirtualBox по другим причинам, и они не будут работать друг с другом.)
(Примечание. Неудивительно, что запуск приложения из отладчика показывает те же проблемы, что и при запуске подключенного теста.)
Действия для воспроизведения:
- Настройте и запустите образ VirtualBox под управлением Android 7.1 ISO.
- Беги
adb connect <ip address>
- Беги
./gradlew connectAndroidTest
- Тест пройдет
- Выполнить
./gradlew connectAndroidTest
- Тест завершится неудачно, как и все будущие прогоны.
Временное решение:
- Установите приложение (если оно еще не установлено)
- Покрутите разрешение «Хранилище» в «Настройки» => «Приложения» => «Мое приложение».