Yerel kodda özel iz etkinlikleri

Android 6.0 (API düzeyi 23) ve sonraki sürümler yerel izleme API'sini (trace.h) destekler. sistem arabelleğine izleme etkinlikleri yazmak için sistem arabelleğine Perfetto veya sistem izleme. Bu API'nin yaygın kullanım alanları arasında saatin kaç olduğunu belirli bir kod bloğunun bir kod bloğunu yürütmek ve ilişkilendirmek için istenmeyen sistem davranışıyla karşılaşabilir.

Not: API düzeyi 27 ve önceki sürümleri çalıştıran cihazlarda ve emülatörlerde (varsa) yoksa veya bellek çok parçalıysa şu mesaj var: Atrace could not allocate enough memory to record a trace. Bu durum yaşanırsa ve yakalamanızda tam bir veri kümesi yoksa arka plan işlemlerini kapatmalı veya cihazı ya da emülatörü yeniden başlatmalı.

Uygulama veya oyununuzun yerel kodunda bulunan özel etkinlikleri tanımlamak için aşağıdaki adımları tamamlayın:

  1. Şu işlemlerde kullandığınız ATrace işlevleri için fonksiyon işaretçileri tanımlayın: aşağıdaki kodda gösterildiği gibi, uygulama veya oyununuzdaki özel etkinlikleri yakalama snippet:

    #include <android/trace.h>
    #include <dlfcn.h>
    
    void *(*ATrace_beginSection) (const char* sectionName);
    void *(*ATrace_endSection) (void);
    
    typedef void *(*fp_ATrace_beginSection) (const char* sectionName);
    typedef void *(*fp_ATrace_endSection) (void);
    
  2. ATrace simgelerini aşağıdaki kodda gösterildiği gibi çalışma zamanında yükleyin snippet'i Bu işlemi genellikle bir nesne oluşturucuda gerçekleştirirsiniz.

    // Retrieve a handle to libandroid.
    void *lib = dlopen("libandroid.so", RTLD_NOW | RTLD_LOCAL);
    
    // Access the native tracing functions.
    if (lib != NULL) {
        // Use dlsym() to prevent crashes on devices running Android 5.1
        // (API level 22) or lower.
        ATrace_beginSection = reinterpret_cast<fp_ATrace_beginSection>(
            dlsym(lib, "ATrace_beginSection"));
        ATrace_endSection = reinterpret_cast<fp_ATrace_endSection>(
            dlsym(lib, "ATrace_endSection"));
    }
    

    Dikkat: Güvenlik nedeniyle, dlopen() yalnızca uygulama veya oyununuzun hata ayıklama sürümünde kullanılabilir.

    Not: İzleme desteği sağlamak için Android 4.3 (API düzeyi 18) yüklüyse şuradaki yöntemleri çağırmak için JNI'yi kullanabilirsiniz: yönetilen kod, snippet'i ekleyin.

  3. ATrace_beginSection() adlı kişiyi arayın ve (sırasıyla başında ve sonunda ATrace_endSection()) Özel etkinliğiniz:

    #include <android/trace.h>
    
    char *customEventName = new char[32];
    sprintf(customEventName, "User tapped %s button", buttonName);
    
    ATrace_beginSection(customEventName);
    // Your app or game's response to the button being pressed.
    ATrace_endSection();
    

    Not: ATrace_beginSection() adlı kişiyi birden fazla aradığınızda kez, ATrace_endSection() araması en çok sona eren yakın zamanda ATrace_beginSection() yöntemi olarak adlandırıldı. İç içe yerleştirilmiş öğeler için her çağrıyı doğru şekilde eşleştirdiğinizden emin olun. ATrace_beginSection() adlı kişiye çağrı: ATrace_endSection().

    Ayrıca, ATrace_beginSection() numaralı telefonu telefonla arayamazsınız ve başka bir ileti dizisinden sonlandırın. Her iki işlevi de aynı ileti dizisi.

Faydalı ipuçları

Aşağıdaki ipuçları isteğe bağlı olsa da yerel reklam öğelerinizi analiz etmenizi kolaylaştırabilir girin.

Bir fonksiyonun tamamını izleme

Çağrı yığınınızı veya işlev zamanlamanızı ayarlarken bunu faydalı bulabilirsiniz. fonksiyonların tamamını izlemektir. Bunu yapmak için ATRACE_CALL() makrosunu kullanabilirsiniz ayarlamak daha kolay. Ayrıca, bu tür bir makro, izlenen işlevin kullanılabileceği durumlar için try ve catch blokları istisna bildirin veya erkenden return adlı kişiyi arayın.

Bir işlevin tamamını izlemek üzere makro oluşturmak için aşağıdaki adımları tamamlayın:

  1. Makroyu tanımlayın:

    #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();
        }
    };
    
  2. İzlemek istediğiniz işlevin içindeki makroyu çağırın:

    void myExpensiveFunction() {
      ATRACE_CALL();
      // Code that you want to trace.
    }
    

İleti dizilerinizi adlandırın

Aşağıda gösterildiği gibi, etkinliklerinizin gerçekleştiği her bir ileti dizisine bir ad verebilirsiniz değerini girin. Bu adım, ileti dizilerini tanımlamayı kolaylaştırır. dönüşüm hunisinin orta kısmına yönelik stratejilere yatırım yapmanızı öneririm.

#include <pthread.h>

static void *render_scene(void *parm) {
    // Code for preparing your app or game's visual components.
}

static void *load_main_menu(void *parm) {
    // Code that executes your app or game's main logic.
}

void init_threads() {
    pthread_t render_thread, main_thread;

    pthread_create(&render_thread, NULL, render_scene, NULL);
    pthread_create(&main_thread, NULL, load_main_menu, NULL);

    pthread_setname_np(render_thread, "MyRenderer");
    pthread_setname_np(main_thread, "MyMainMenu");
}
. ziyaret edin.