Файл открытия ошибки: нет такого файла или каталога (2)

Я получаю ошибку выше:

Ошибка открытия файла трассировки: нет такого файла или каталога (2)

когда я запускаю приложение для Android на эмуляторе. Может ли кто-нибудь сказать мне, что может быть причиной этого?

Я использую android-sdk-20 и ниже строки добавляются в AndroidManifest.xml

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" />

Я также добавил строку:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

так как я думал, что может возникнуть проблема с записью на SD-карту.

Ответ 1

Это происходит потому, что вы не установили minSdkVersion или targetSdkVersion на свой компьютер. Я протестировал его прямо сейчас.

Например, если у вас есть эти строки в вашем манифесте .xml:

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />

И вы установили только API17 на свой компьютер, он сообщит вам об ошибке. Если вы хотите протестировать его, попробуйте установить другую версию API (в данном случае API 8).

Тем не менее, это не важная ошибка. Это не значит, что ваше приложение ошибочно.

Извините за мое выражение. Английский язык не мой. Bye!

Ответ 2

Я думаю, что это проблема

Немного фона

Traceview - это графическое средство просмотра журналов выполнения, созданных с помощью класса Debug для записи информации о трассировке в вашем коде. Traceview может помочь вам отладить ваше приложение и профилировать его производительность. Включение этого файла создает файл .trace в корневой папке sdcard, который затем может быть извлечен ADB и обработан файлом batview traceview для обработки. Он также может быть добавлен DDMS.

Это система, внутренне используемая регистратором. В общем случае, если вы не используете traceview для извлечения файла трассировки, эта ошибка не должна вас беспокоить. Вы должны посмотреть на ошибки/журналы, напрямую связанные с вашим приложением

Как включить его:

Существует два способа генерации журналов трассировки:

  • Включите класс Debug в свой код и вызовите его методы, такие как startMethodTracing() и stopMethodTracing(), для запуска и остановки запись информации трассировки на диск. Эта опция очень точная потому что вы можете точно указать, с чего начать и прекратить протоколирование трассировки данных в вашем коде.

  • Используйте функцию профилирования методов DDMS для генерации журналов трассировки. Эта опция менее точная, потому что вы не изменяете код, а скорее указать, когда запускать и останавливать ведение журнала с помощью DDMS. Хотя у вас есть меньше контроля над тем, где начинается и останавливается ведение журнала, эта опция полезно, если у вас нет доступа к коду приложения, или если вы не нужно точное время регистрации.

Но для вышеуказанного

существуют следующие ограничения:

Если вы используете класс Debug, ваше приложение должно иметь разрешение на запись на внешнее хранилище (WRITE_EXTERNAL_STORAGE).

Если вы используете DDMS: Android 2.1 и более ранние устройства должны иметь SD карты, и ваша заявка должна иметь разрешение на запись в SD Card. Android 2.2 и более поздние устройства не нуждаются в SD-карте. файлы журнала трассировки передаются непосредственно на вашу машину разработки.

Таким образом, по существу доступ к traceFile требует двух вещей

1.) Разрешение написать файл журнала трассировки, т.е. WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE для хорошей оценки

2.) Эмулятор с SDCard с достаточным пространством. Документ не говорит, что если это только для DDMS, но также и для отладки, поэтому я предполагаю, что это также верно для отладки через приложение.

Что мне делать с этой ошибкой:

Теперь ошибка, по сути, является изъятием либо отсутствия пути sdcard для создания файла трассировки, либо отсутствия разрешения на его доступ. Это старый поток, но разработчик за щедростью, проверьте, соответствуют ли эти две предпосылки. Затем вы можете найти файл .trace в папке sdcard в своем эмуляторе. Если он существует, он не должен давать вам эту проблему, если он не пытается создать его, добавив startMethodTracing в ваше приложение.
Я не уверен, почему он автоматически ищет этот файл, когда записывает журнал. Я думаю, что когда происходит событие ошибки/журнала, регистратор внутренне пытается записать в файл трассировки и не находит его, и в этом случае он выдает ошибку. Просматривая документы, я не нахожу слишком много ссылок на то, почему это происходит автоматически. Но в целом это не влияет на вас напрямую, вы должны проверить прямые журналы/ошибки приложения. Кроме того, в отличие от Android 2.2 и более поздних устройств не требуется SD-карта для ведения журнала DDMS. Файлы журнала трассировки передаются непосредственно на вашу машину разработки.

Дополнительная информация о Traceview:

Копирование файлов трассировки на хост-машину

После запуска приложения и система создала ваши файлы трассировки .trace on устройства или эмулятора, вы должны скопировать эти файлы в свою разработку компьютер. Вы можете использовать adb pull для копирования файлов. Вот пример который показывает, как скопировать файл примера calc.trace из значения по умолчанию расположение эмулятора в каталоге /tmp на хосте эмулятора машина:

adb pull/sdcard/calc.trace/tmp Просмотр файлов трассировки в Traceview To запустите Traceview и просмотрите файлы трассировки, введите traceview, Например, чтобы запустить Traceview в файлах примеров скопированный в предыдущем разделе, используйте:

traceview/tmp/calc Примечание. Если вы пытаетесь просмотреть журналы трассировки приложение, которое встроено в ProGuard (режим выпуска build), некоторые методы и имена членов могут быть запутаны. Вы можете использовать файл proguard mapping.txt, чтобы выяснить исходный unobfuscated имена. Для получения дополнительной информации об этом файле см. Proguard документация.

Я думаю, что любой другой ответ относительно позиционирования операторов oncreate или удаления uses-sdk не связан, но это Android, и я могу ошибаться. Было бы полезно перенаправить этот вопрос на инженера андроида или опубликовать его как ошибку

Подробнее в docs

Ответ 3

Попробуйте удалить файл формы uses-sdk AndroidManifest.xml. это сработало для меня!

Не используйте Android Virtual Device с слишком низкой конфигурацией. Пусть он будет средним.

Ответ 4

Запишите все свои коды под этими двумя строками: -

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

Он работал у меня без повторной установки снова.

Ответ 5

Я не хотел переустанавливать все, потому что у меня так много версий SDK, и моя среда разработки настроена правильно. При повторном подключении он занимает слишком много времени.

Что сработало для меня, так это удаление, а затем повторное создание Android Virtual Device, конечно же, чтобы установить значение для SD Card Size (я использовал 200 MiB).

screenshot of the AVD creation screen

Дополнительная информация:

в то время как вышеупомянутое исправляет проблему временно, оно повторяется. Я просто попробовал свое приложение в Android Studio и увидел это в журнале вывода, который я раньше не заметил в Eclipse:

"/Applications/Android Studio.app/sdk/tools/emulator" -avd AVD_for_Nexus_S_by_Google -netspeed full -netdelay none

WARNING: Data partition already in use. Changes will not persist!
WARNING: SD Card image already in use: /Users/[user]/.android/avd/AVD_for_Nexus_S_by_Google.avd/sdcard.img
ko:Snapshot storage already in use: /Users/[user]/.android/avd/AVD_for_Nexus_S_by_Google.avd/snapshots.img

Я подозреваю, что изменения в журнале не сохраняются на SD-карте, поэтому, когда LogCat пытается получить доступ к журналам, их там нет, вызывая сообщение об ошибке. Акт удаления AVD и его повторного создания удаляет файлы, а следующий запуск - это новый запуск, позволяющий LogCat получать доступ к виртуальной SD-карте.

Ответ 6

У вас не будет доступа к вашей реальной SD-карте в эмуляторе. Вам нужно будет выполнить шаги в этом tutorial, чтобы направить ваш эмулятор в каталог вашей среды разработки, действующий как ваша SD-карта.

Ответ 7

На самом деле проблема заключается в том, что либо /sys/kernel/debug не монтируется, либо что запущенное ядро ​​не имеет трассировщиков ftrace, скомпилированных таким образом, что /sys/kernel/debug/tracing недоступен. Это код, выдающий ошибку (platform_frameworks_native/libs/utils/Trace.cpp):

void Tracer::init() {
    Mutex::Autolock lock(sMutex);

    if (!sIsReady) {
        add_sysprop_change_callback(changeCallback, 0);

        const char* const traceFileName =
                "/sys/kernel/debug/tracing/trace_marker";
        sTraceFD = open(traceFileName, O_WRONLY);
        if (sTraceFD == -1) {
            ALOGE("error opening trace file: %s (%d)", strerror(errno), errno);
            sEnabledTags = 0;   // no tracing can occur
        } else {
            loadSystemProperty();
        }

        android_atomic_release_store(1, &sIsReady);
    }
}

Сообщение журнала может быть немного более информативным.