android.system.ErrnoException: ошибка ioctl: EBADF (неверный дескриптор файла) с файлом из папки данных / данных - PullRequest
0 голосов
/ 16 ноября 2018

Я устанавливаю одно и то же приложение из Android Studio на разные устройства, оно успешно установлено на всех устройствах, но после запуска я получаю следующую ошибку при работе с файлами во внутреннем хранилище в этом приложении на некоторых устройствах:

E/java: [FileUploader] java.io.IOException: ioctl failed: EBADF (Bad file descriptor)
        at libcore.io.IoBridge.available(IoBridge.java:74)
        at java.io.FileInputStream.available(FileInputStream.java:108)
        at packagename.FileUploader$1.contentLength(FileUploader.java:530)
        at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:67)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at com.android.tools.profiler.agent.okhttp.OkHttp3Interceptor.intercept(OkHttp3Interceptor.java:57)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
        at okhttp3.RealCall.execute(RealCall.java:77)
        at packagename.performFileUploadRequest(FileUploader.java:483)
        at packagename.FileUploader.performUploadRequestByType(FileUploader.java:429)
        at com


11-16 11:45:03.138 20253-21432/packagename E/java: .packagename.FileUploader.tryUploadFileToServer(FileUploader.java:393)
        at packagename.FileUploader.lambda$uploadFileToServer$2(FileUploader.java:302)
        at packagename.-$$Lambda$FileUploader$MZ_TG9wHD8CqIUeh0jeiS8COakc.call(lambda)
        at rx.Observable.unsafeSubscribe(Observable.java:10256)
        at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:248)
        at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:148)
        at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77)
        at rx.observers.Subscribers$5.onNext(Subscribers.java:235)
        at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:276)
        at rx.Subscriber.setProducer(Subscriber.java:211)
        at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
        at rx.Subscriber.setProducer(Subscriber.java:205)
        at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:138)
        at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:129)
        at rx.Observable.unsafeSubscribe(Observable.java:10256)
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
        at rx.Observable.unsafeSubscribe(Observable.java:10256)
        at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
        at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
        at rx.Observable.unsafeSubscribe(Observable.java:10256)
        at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.

11-16 11:45:03.138 20253-21432/packagename E/java: java:41)
        at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
        at rx.Observable.unsafeSubscribe(Observable.java:10256)
        at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
        at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
        at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
     Caused by: android.system.ErrnoException: ioctl failed: EBADF (Bad file descriptor)
        at libcore.io.Posix.ioctlInt(Native Method)
        at libcore.io.ForwardingOs.ioctlInt(ForwardingOs.java:103)
        at libcore.io.IoBridge.available(IoBridge.java:58)
            ... 60 more

И в то же время одно и то же приложение работает на другом устройстве без исключения. Я проверил это на корневом устройстве, и даже когда возникает это исключение, zip-файл существует в папке data/data/packagename/files. Код, на который указывает исключение, следующий (строка с fileStream.available()):

RequestBody requestBody = new RequestBody() {
            @Override
            public MediaType contentType() {
                return MediaType.parse(file.getMimeType());
            }

            @Override
            public long contentLength() throws IOException {
                return fileStream.available();
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {
                Source source = null;
                try {
                    source = Okio.source(fileStream);
                    sink.writeAll(source);
                } finally {
                    Util.closeQuietly(source);
                }
            }
        };

, где RequestBody - абстрактный класс из библиотеки okhttp3. В чем причина этой ошибки?

PS Я также пытался установить apk этого приложения, которое было построено на другом компьютере (я установил его с помощью adb на моем компьютере), которое не имело каких-либо существенных изменений в работе с этими файлами, и он работает без исключения на тех же устройствах, где это исключение встречалось раньше ... Так что это смущает меня еще больше ...

P.S.S. И когда я создаю то же приложение в Android Studio, используя терминал и задачу gradlew, а не кнопку Запуск , это приложение работает без этой ошибки. Так что, похоже, что-то с моей Android Studio, но я даже не мог себе представить, что именно, и это поражает меня ...

1 Ответ

0 голосов
/ 16 ноября 2018

В это невозможно поверить, но причиной этого был установлен флажок в Конфигурация запуска / отладки : " Включить расширенное профилирование (требуется только для уровня API <26) </strong>".И это объясняет, почему на некоторых устройствах все работает правильно - потому что это работает правильно на устройстве с Android 8.0 - то есть API 26. Но как этот флажок связан с файловой системой Android (или, в частности, с внутренним хранилищем), я все еще не могупонять ...

...