Pelacakan Asli

Panduan ini menjelaskan cara menggunakan API pelacakan asli (trace.h) untuk menulis kejadian pelacakan ke buffer sistem. Kemudian Anda bisa menganalisis keluaran pelacakan ini menggunakan alat Systrace. API pelacakan asli ini didukung untuk Android API level 23 dan yang lebih tinggi.

Ringkasan

Membuat pelacakan khusus dalam kode asli sama seperti teknik untuk bahasa pemrograman Java, yang dijelaskan dalam Kode Aplikasi Pelacakan. Biasanya Anda tidak perlu menempatkan kode pelacakan asli dalam block try/catch kecuali bagian yang dilacak melempar pengecualian asli atau menggunakan pengembalian dini.

Untuk setiap panggilan ATrace_beginSection() pastikan Anda juga memiliki panggilan ATrace_endSection() yang sesuai, jika tidak ini akan mengakibatkan file pelacakan rusak.

Untuk menghindari string atau argumen kompleks saat pelacakan tidak aktif, Anda bisa menambahkan pelindung dengan memanggil ATrace_isEnabled() .

Pelacakan Fungsi

Satu kasus penggunaan untuk API pelacakan asli adalah mengamati waktu yang diambil oleh blok kode tertentu. Biasanya, pelacakan ini akan selama tahap pemrosesan pipeline (misalnya, saat mendekode gambar, menggambar bingkai, atau menunggu permintaan jaringan).

Untuk melacak waktu yang diambil oleh blok kode, ikuti langkah-langkah berikut:

  1. Sertakan file trace.h header.
    #include <android/trace.h>
    
  2. Tentukan variabel sebagai nama bagian dalam ATrace_beginSection(). Pada akhir balok kode yang ingin Anda lacak, pastikan panggilan yang sesuai ke ATrace_endSection(). Ini sangat penting saat bagian yang dilacak melempar pengecualian asli atau menggunakan pengembalian dini.
    void myExpensiveFunction() {
      ATrace_beginSection("myExpensiveFunction");
      ... // trace-worthy work here
      ATrace_endSection();
    }
    
  3. (Opsional) Buat struktur objek/makro yang tepat untuk melacak blok kode. Contoh berikut menunjukkan cara menerapkan objek/makro seperti itu yang disebut ATRACE_CALL().
    #define ATRACE_NAME(name) ScopedTrace ___tracer(name)
    
    // ATRACE_CALL is an ATRACE_NAME that uses the current function name.
    #define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)
    
    class ScopedTrace {
      public:
        inline ScopedTrace(const char *name) {
          ATrace_beginSection(name);
        }
    
        inline ~ScopedTrace() {
          ATrace_endSection();
        }
    };
    
    Menggunakan ATRACE_CALL() objek/makro, Anda bisa menyederhanakan kode dari langkah sebelumnya sebagai berikut. Menggunakan objek/makro dengan cara ini, Anda tidak perlu khawatir menambahkan blok try/catch saat bagian yang dilacak melempar pengecualian atau menggunakan pengembalian dini.
    void myExpensiveFunction() {
      ATRACE_CALL();
      ... // trace-worthy work here
    }