无法打开跟踪文件

时间:2011-05-20 21:54:38

标签: android

我想测试我的应用的性能。我已经用简单的应用程序启动它并尝试将traceview但它突然失败在我的Android手机上强行关闭。请指导我如何设置我的代码propley为简单的Android应用程序,以获取跟踪视图

的污垢

这是代码 package test.check;

import android.app.Activity;
import android.os.Bundle;
import android.os.Debug;

public class tracev extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Debug.startMethodTracing("traceview");
        setContentView(R.layout.main);
    }
    @Override
    protected void onStop() {
        Debug.stopMethodTracing();
        super.onStop();
    }
}

这是清单文件

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="test.check"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".tracev"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

我还添加了

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

但它不起作用。我认为这是因为logcat中的这一行,但我不知道如何处理它

05-20 23:39:43.913: ERROR/dalvikvm(11673): Unable to open trace file '/sdcard/traceview.trace': Permission denied

logcat的

05-20 23:39:43.903: DEBUG/dalvikvm(11673): +++ active profiler count now 1
05-20 23:39:43.913: INFO/dalvikvm(11673): TRACE STARTED: '/sdcard/traceview.trace' 8192KB
05-20 23:39:43.913: ERROR/dalvikvm(11673): Unable to open trace file '/sdcard/traceview.trace': Permission denied
05-20 23:39:43.913: DEBUG/dalvikvm(11673): +++ active profiler count now 0
05-20 23:39:43.913: DEBUG/AndroidRuntime(11673): Shutting down VM
05-20 23:39:43.913: WARN/dalvikvm(11673): threadid=3: thread exiting with uncaught exception (group=0x4001e390)
05-20 23:39:43.913: ERROR/AndroidRuntime(11673): Uncaught handler: thread main exiting due to uncaught exception
05-20 23:39:43.983: ERROR/AndroidRuntime(11673): java.lang.RuntimeException: Unable to start activity ComponentInfo{test.check/test.check.tracev}: java.lang.RuntimeException: file open failed
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.os.Looper.loop(Looper.java:123)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.app.ActivityThread.main(ActivityThread.java:4595)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at java.lang.reflect.Method.invokeNative(Native Method)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at java.lang.reflect.Method.invoke(Method.java:521)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at dalvik.system.NativeStart.main(Native Method)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673): Caused by: java.lang.RuntimeException: file open failed
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at dalvik.system.VMDebug.startMethodTracing(Native Method)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at dalvik.system.VMDebug.startMethodTracing(VMDebug.java:156)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.os.Debug.startMethodTracing(Debug.java:443)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.os.Debug.startMethodTracing(Debug.java:391)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at test.check.tracev.onCreate(tracev.java:12)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-20 23:39:43.983: ERROR/AndroidRuntime(11673):     ... 11 more
05-20 23:39:44.013: INFO/Process(94): Sending signal. PID: 11673 SIG: 3
05-20 23:39:44.013: INFO/dalvikvm(11673): threadid=7: reacting to signal 3
05-20 23:39:44.023: INFO/dalvikvm(11673): Wrote stack trace to '/data/anr/traces.txt'
05-20 23:39:51.213: DEBUG/KeyguardViewMediator(94): pokeWakelock(15000)
05-20 23:39:51.213: INFO/HtcLockScreen(94): Press Menu key to unlock screen

我想知道sdcard中没有任何内容,在它前面没有选择任何设备。可能是它可能是错误的原因,这里是图片 enter image description here

8 个答案:

答案 0 :(得分:11)

在Marshmallow(Android-Version 6,API Level 23)上,只需要#34;写&#34;清单中的许可是不够的。您必须要求permission at runtime,或者您可以转到系统偏好设置并为您的应用授予存储权限。

答案 1 :(得分:7)

如果这是一个模拟器,请确保模拟器附加了一个SD卡。

此外,最佳做法是使用getExternalStorageDirectory()

尝试将权限行放在uses-sdk行下方。

使用与traceview不同的文件名,以确保没有其他应用锁定它。

您的SD卡似乎是空的。你之前能够访问它吗?它可能是腐败的。

答案 2 :(得分:6)

使用TraceView需要2个权限:

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

答案 3 :(得分:2)

在Android Virtual Device Manager下,选择并编辑您的模拟器。 在SD卡选项下给出一些价值:

大小:100 MB

这应该对你有用

答案 4 :(得分:2)

我找到的最简单的解决方案是使用Context.getFileDir()作为存储位置。与Context.getExternalFilesDir()相比,这具有以下优势:

  • 当没有SD卡(在您的设备或模拟器中)时它也可以使用
  • 它不需要任何其他权限

启动方法跟踪的示例代码:

final File methodTracingFile = new File(getFilesDir(), "AppStart.trace");
Log.d(TAG, "methodTracingPath=" + methodTracingFile.getPath());
Debug.startMethodTracing(methodTracingFile.getPath());

注意:最好记录methodTracingPath以查看文件的存储位置 示例:/data/data/com.YOUR_PACKAGE.debug/files/AppStart.trace

要将文件从模拟器复制到PC,您可以使用 Android设备监视器中的文件资源管理器(请参阅Working with an emulator or device's file systementer image description here

  1. 选择跟踪文件
  2. 点击从设备中提取文件按钮将其复制到本地PC
  3. 最后,您只需将跟踪文件拖放到Android Studio即可查看method trace-view

答案 5 :(得分:1)

我的跟踪文件无数据

  • Debug.stopMethodTracing();位于活动
  • onDestroy()方法内
  • 缺少请求WRITE_EXTERNAL_STORAGE权限

时找不到跟踪文件
  • 对于File Exployer -> sdcard -> Android -> data -> your_app -> files内的某些设备跟踪文件,但某些设备位于File Exployer -> sdcard内,而某些设备位于File Exployer -> data

答案 6 :(得分:0)

我在物理设备上调试时遇到了这个问题并发现了这个问题。我修理了它:

  1. 进入手机的“开发者选项”设置(如何启用:How to find and turn on USB debugging mode on Nexus 4
  2. 单击“选择调试应用程序项目”。
  3. 从列表中选择您的应用程序。

答案 7 :(得分:0)

这些答案都没有解决我的问题。我最终还是要

  1. 根我的手机
  2. 将通话更改为

    Debug.startMethodTracing(&#34; /数据/本地/启动&#34);

  3. 我在运行之前触摸文件,chmod到777。