2011-05-20 83 views
9

我想測試我的應用程序的性能。我已經開始使用簡單的應用程序,並嘗試把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中的becasue,但我不知道該如何處理它

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 

我想知道一個角度來看,有沒有在SD卡,並在前面它沒有選擇任何設備。可能是錯誤原因,這裏是圖片 enter image description here

+0

你能告訴我們你的表現? – MByD 2011-05-20 21:57:54

+0

您正在使用哪個Android版本?你在使用模擬器嗎?如果是這樣,你是否爲它創建了一個虛擬SD卡? – 2011-05-20 22:00:01

+0

@ MByD我已經添加了Manifest文件 – user667340 2011-05-20 22:04:33

回答

7

如果這是一個仿真器,請確保仿真器上附有SD卡。

此外,最佳實踐是使用getExternalStorageDirectory()

嘗試將權限行放在uses-sdk行下。

使用與traceview不同的文件名來確保沒有其他應用程序鎖定它。

您的SD卡看起來是空的。你以前能夠訪問它嗎?它可能是腐敗的。

+0

我很直接Android手機 – user667340 2011-05-20 22:06:40

+0

與其他建議編上運行。 – Haphazard 2011-05-20 22:15:21

+0

嘗試「嘗試把權限線正確的使用sdk線下」,但不工作:( – user667340 2011-05-20 22:24:54

2

在Android虛擬設備管理器下,選擇並編輯您的模擬器。 給下SD卡的選項一些值:

大小:100 MB

這應該爲你工作

6

使用TraceView需要2個權限:

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

由於SD存儲在默認情況下啓用了新的Android Studion,因此這爲我解決了問題 – MonoThreaded 2015-06-03 11:48:39

11

在棉花糖(Android的版本6,API等級23),只是有在明顯的 「寫入」 權限是不夠的。你要問爲permission at runtime,或者您也可以進入系統設置,讓存儲許可應用程式。

+0

這是我的問題,在應用程序列表中找到了我的應用程序,並在我的設備上啓用了存儲權限。 – ripple182 2016-05-25 12:49:42

0

這些答案都不對解決我的問題。我最終不得不

  1. 根我的手機
  2. 更改呼叫

    Debug.startMethodTracing( 「/數據/本地/啓動」);

,我跑和chmod之前觸及文件777

1

,我發現最簡單的解決方案是使用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

要從仿真器將文件複製到你的電腦,你可以使用文件瀏覽器Android設備監視器(見Working with an emulator or device's file systementer image description here

  1. 選擇跟蹤文件
  2. 點擊從設備拉出一個文件按鈕將它複製到本地PC

最後,您可以拖動&將跟蹤文件拖放到Android Studio以查看method trace-view