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

这是因为你没有安装minSdkVersion或targetSdkVersion在你的电脑。 我现在已经testing过了。

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

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

而且您只在计算机上安装了API17,它会向您报告错误。 如果您想testing它,请尝试安装其他API版本(在这种情况下,API 8)。

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

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

我认为这是问题

一点背景

Traceview是用于执行日志的graphics查看器,您可以使用Debug类在代码中logging跟踪信息。 Traceview可以帮助您debugging应用程序并描述其性能。 启用它在sdcard根文件夹中创build.trace文件,然后由ADB提取并由traceview bat文件处理进行处理。 它也可以被DDMS添加。

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

我如何启用它:

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

  1. 在代码中包含Debug类并调用其方法(如startMethodTracing()stopMethodTracing()来启动和停止将跟踪信息logging到磁盘。 这个选项非常精确,因为您可以指定在哪里开始并停止在代码中logging跟踪数据。

  2. 使用DDMS的方法分析function来生成跟踪日志。 这个选项不太精确,因为你不修改代码,而是指定何时开始和停止使用DDMS进行logging。 尽pipe您对日志logging的启动和停止位置的控制较less,但如果您无法访问应用程序的代码,或者您不需要精确的日志logging时间,则此选项非常有用。

但是,上述存在以下限制

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

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

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

1.)写入跟踪日志文件的权限,例如WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE

2.)带有足够空间的SD卡的仿真器。 该文件不说,如果这只是为了DDMS,但也为了debugging,所以我假设这也是通过应用程序进行debugging。

我该如何处理这个错误:

现在错误本质上是没有SD卡path创build一个跟踪文件或没有权限访问它。 这是一个古老的线索,但在赏金背后的开发者,请检查是否符合这两个先决条件。 然后,您可以search模拟器中sdcard文件夹中的.trace文件。 如果它存在,它不应该给你这个问题,如果它不尝试通过添加startMethodTracing到您的应用程序创build它。
我不知道为什么当logging器启动时它会自动查找这个文件。我认为当发生错误/日志事件时,logging器在内部尝试写入跟踪文件并且没有find它,在这种情况下,它会抛出错误在文档中search,我没有find太多的参考,为什么这是自动的。 但一般来说这不会直接影响到你,你应该检查直接的应用程序日志/错误。 另外,Android 2.2及更高版本的设备不需要用于DDMS跟踪logging的SD卡。 跟踪日志文件直接传输到您的开发机器。

有关Traceview的更多信息:

将跟踪文件复制到主机

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

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

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

我认为关于oncreate语句的定位或删除uses-sdk任何其他答案是不相关的,但这是Android,我可能是错的。 将这个问题redirect到一个android工程师或将其作为一个bug发布是有用的

更多在文档中

尝试从AndroidManifest.xml文件中删除uses-sdk部分。 它为我工作!

不要使用configuration太低的Android虚拟设备。 让它是中等的。

把所有的代码写在这两行下面:

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

它为我工作,无需重新安装。

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

什么对我来说是删除,然后重新创buildAndroid虚拟设备,一定要把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并重新创build它的行为将删除这些文件,而下一次启动是全新的启动,允许LogCat访问虚拟SD卡。

您将无法访问模拟器中的真实SD卡。 您将不得不按照本教程中的步骤操作,将您的模拟器指向您的开发环境中作为SD卡的目录。

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

日志消息肯定可以提供更多的信息。