错误打开跟踪文件:没有这样的文件或目录(2)

时间:2012-07-12 06:22:18

标签: android eclipse android-emulator logcat android-sdcard

我收到了上述错误:

  

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

7 个答案:

答案 0 :(得分:10)

这是因为您没有在计算机中安装minSdkVersion或targetSdkVersion。我现在已经测试过了。

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

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

您只在计算机中安装了API17,它会报告错误。如果要测试它,请尝试安装其他API版本(在本例中为API 8)。

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

抱歉我的表情。英语不是我的语言。 再见!

答案 1 :(得分:8)

我认为这是问题

一点背景

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

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

如何启用它:

  

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

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

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

  4.   

但上述

存在以下限制
  

如果您正在使用Debug类,那么您的应用程序必须具有   写入外部存储(WRITE_EXTERNAL_STORAGE)的权限。

     

如果您使用DDMS:Android 2.1及更早版本的设备必须具有SD   卡存在,您的申请必须有权写入   SD卡。 Android 2.2及更高版本的设备不需要SD卡。该   跟踪日志文件将直接流式传输到您的开发计算机。

因此,本质上traceFile访问需要两件事

  

1。)编写跟踪日志文件的权限,即WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE以获得良好的衡量标准

     

2。)带有足够空间的SD卡的仿真器。 doc没有说这是仅用于DDMS还是用于调试,所以我假设通过应用程序调试也是如此。

如何处理此错误:

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

有关Traceview的其他信息:

  

将跟踪文件复制到主机

     

您的应用程序运行后   并且系统已创建跟踪文件.trace on   在设备或模拟器中,您必须将这些文件复制到开发中   电脑。您可以使用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工程师或将其作为错误发布

会很有用

docs

中的更多内容

答案 2 :(得分:6)

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

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

答案 3 :(得分:5)

将这些代码写在这2行以下: -

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

没有重新安装它对我有用。

答案 4 :(得分:4)

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

对我来说有用的是删除,然后重新创建Android虚拟设备,确保输入SD卡大小的值(我使用了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卡。

答案 5 :(得分:3)

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

答案 6 :(得分:1)

实际上,问题是未安装/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);
    }
}

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