63

我收到上述错误:

打开跟踪文件时出错:没有这样的文件或目录 (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 卡可能存在一些问题。

4

7 回答 7

10

发生这种情况是因为您尚未在计算机中安装 minSdkVersion 或 targetSdkVersion。我现在已经测试过了。

例如,如果您的 Manifest.xml 中有这些行:

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

而你的电脑只安装了API17,它会报错。如果您想对其进行测试,请尝试安装其他 API 版本(在本例中为 API 8)。

即便如此,这也不是一个重要的错误。这并不意味着您的应用程序是错误的。

对不起我的表情。英语不是我的语言。再见!

于 2013-08-06T17:25:43.927 回答
8

我认为这是问题所在

一点背景

Traceview 是用于执行日志的图形查看器,您可以使用 Debug 类在代码中记录跟踪信息。Traceview 可以帮助您调试应用程序并分析其性能。启用它会.trace在 sdcard 根文件夹中创建一个文件,然后该文件可由 ADB 提取并由 traceview bat 文件处理以进行处理。它也可以由 DDMS 添加。

它是记录器内部使用的系统。一般来说,除非您使用 traceview 提取跟踪文件,否则此错误不会打扰您。 您应该查看与您的应用程序直接相关的错误/日志

如何启用它:

有两种方法可以生成跟踪日志:

  1. 在代码中包含 Debug 类并调用其方法,例如startMethodTracing()stopMethodTracing(),以启动和停止将跟踪信息记录到磁盘。此选项非常精确,因为您可以在代码中准确指定开始和停止记录跟踪数据的位置。

  2. 使用 DDMS 的方法分析功能生成跟踪日志。此选项不太精确,因为您不修改代码,而是指定何时开始和停止使用 DDMS 进行日志记录。尽管您对日志记录开始和停止的确切位置控制较少,但如果您无权访问应用程序的代码,或者如果您不需要精确的日志计时,则此选项很有用。

但上述情况存在以下限制

如果您使用的是 Debug 类,您的应用程序必须有权写入外部存储 ( WRITE_EXTERNAL_STORAGE)。

如果您使用的是 DDMS:Android 2.1 和更早版本的设备必须有 SD 卡,并且您的应用程序必须有权写入 SD 卡。Android 2.2 及更高版本的设备不需要 SD 卡。跟踪日志文件直接流式传输到您的开发机器。

所以本质上traceFile访问需要两件事

1.) 写入跟踪日志文件的权限,即WRITE_EXTERNAL_STORAGE良好READ_EXTERNAL_STORAGE的措施

2.) 带有足够空间的 SDCard 的仿真器。文档没有说这是否仅适用于 DDMS 也适用于调试,所以我假设这对于通过应用程序进行调试也是如此。

我该怎么办这个错误:

现在,该错误本质上是由于没有 sdcard 路径来创建跟踪文件或没有访问它的权限。这是一个旧线程,但赏金背后的开发人员检查是否满足两个先决条件。然后,您可以在模拟器的 sdcard 文件夹中搜索该.trace文件。如果它存在,它不应该给你这个问题,如果它没有尝试通过添加startMethodTracing到你的应用程序来创建它。
我不确定为什么当记录器启动时它会自动查找此文件。我认为当发生错误/日志事件时,记录器在内部尝试写入跟踪文件但没有找到它,在这种情况下它会抛出错误.浏览了文档后,我没有找到太多关于为什么会自动打开的参考资料。但通常这不会直接影响您,您应该检查直接应用程序日志/错误。另外,Android 2.2 和更高版本的设备不需要 SD 卡来进行 DDMS 跟踪记录。跟踪日志文件直接流式传输到您的开发机器。

关于 Traceview 的其他信息:

将跟踪文件复制到主机

在您的应用程序运行并且系统在设备或模拟器上创建了您的跟踪文件 .trace 之后,您必须将这些文件复制到您的开发计算机。您可以使用 adb pull 来复制文件。下面的示例展示了如何将示例文件 calc.trace 从模拟器上的默认位置复制到模拟器主机上的 /tmp 目录:

adb pull /sdcard/calc.trace /tmp 在 Traceview 中查看跟踪文件 要运行 Traceview 并查看跟踪文件,请输入 traceview 。例如,要对上一节中复制的示例文件运行 Traceview,请使用:

traceview /tmp/calc 注意:如果您尝试查看启用 ProGuard 构建的应用程序的跟踪日志(发布模式构建),某些方法和成员名称可能会被混淆。您可以使用 Proguard mapping.txt 文件找出原始的未混淆名称。有关此文件的更多信息,请参阅 Proguard 文档。

我认为关于oncreate语句定位或删除的任何其他答案uses-sdk都不相关,但这是 Android,我可能是错的。将此问题重定向给android工程师或将其作为错误发布会很有用

更多在文档中

于 2015-04-21T05:24:30.987 回答
6

尝试删除uses-sdk零件表单AndroidManifest.xml文件。它对我有用!

不要使用配置太低的 Android 虚拟设备。让它成为中等。

于 2012-11-02T23:43:34.190 回答
5

将所有代码写在这 2 行下面:-

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

它对我有用,无需再次重新安装。

于 2013-07-12T19:22:09.483 回答
4

我不想重新安装所有东西,因为我安装了很多 SDK 版本,而且我的开发环境设置得恰到好处。重新设置它需要很长时间。

对我有用的是删除,然后重新创建 Android 虚拟设备,确保输入 SD 卡大小的值(我使用 200 MiB)。

AVD 创建屏幕截图

附加信息:

虽然上述确实暂时解决了问题,但它会反复出现。我刚刚在 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 卡。

于 2013-07-09T19:12:26.413 回答
3

您将无法在模拟器中访问您的真实 SD 卡。您必须按照本教程中的步骤将模拟器定向到开发环境中充当 SD 卡的目录。

于 2012-07-12T06:50:25.800 回答
2

实际上,问题是要么/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);
    }
}

日志消息肯定会提供更多信息。

于 2015-08-25T11:37:12.300 回答