Gunakan pelacakan untuk merekam peristiwa dan penghitung di sistem serta memvisualisasikan setiap peristiwa dan penghitung pada linimasa. Alat pelacakan standar di Android adalah Perfetto. Untuk mempelajari lebih lanjut, lihat Pelacakan 101.
Melengkapi kode Anda
Untuk mendapatkan peristiwa dari aplikasi, aplikasi harus dilengkapi dengan menambahkan titik pelacakan ke dalam kode. Bagian yang tidak dilengkapi tidak akan muncul dalam pelacakan.
Contoh pelacakan SDV adalah demo integrasi pelacakan, beserta petunjuk dan contoh konfigurasi pelacakan. Contoh ini terletak di system/software_defined_vehicle/core_services/samples/tracing/.
Karat
Pendekatan yang direkomendasikan untuk Karat adalah menggunakan crate pelacakan untuk memancarkan peristiwa ATrace. Perfetto mendukung ATrace sebagai sumber data. Kami berencana untuk beralih ke Perfetto SDK saat binding Karat tersedia dan bergantung pada perkembangan kasus penggunaan.
Tambahkan setelan default pelacakan ke Android.bp:
rust_binary {
...
defaults: [
...
"sdv_tracing@rust_defaults",
],
...
}
Lakukan inisialisasi pelanggan. Hal ini hanya dapat dilakukan satu kali per proses:
fn main() {
// Initialize the subscriber, panic if it fails.
// sdv_tracing::try_init_tracing() is the version that returns a Result.
sdv_tracing::init_tracing()
...
}
Anda dapat menghilangkan panggilan inisialisasi. Jika melakukannya, pelacakan akan dibiarkan tidak diinisialisasi dan Perfetto tidak akan mengumpulkan peristiwa instrumentasi dari aplikasi.
Tambahkan titik pelacakan. Anda dapat menemukan contoh lainnya di system/software_defined_vehicle/core_services/samples/tracing/rust_tracing_api_demo/tracing.rs.
use tracing::{instrument, info_span};
// #[tracing::instrument] wraps the method into a tracing span and records arguments.
// Use #[instrument(skip(num))] if you don't want to record the argument.
#[instrument]
fn mul_by_100(num: i32) -> i32 {
// Create and enter a span with INFO verbosity, name, and a debug field annotation.
// The span will exit when dropped.
let _span = info_span!("This is a span", var=123).entered();
let result = num * 100;
// Emit an instant INFO event that records the result value.
// We recommend to fully qualify the crate when using events to avoid confusion with log records.
tracing::info!(result, "Completed");
result
}
C++
Pelacakan C++ menggunakan Perfetto SDK untuk melacak peristiwa. Tambahkan setelan default pelacakan ke Android.bp:
cc_binary {
...
defaults: [
...
"sdv_tracing@cc_defaults",
],
...
}
Tentukan kategori. Jika Anda menggunakan kategori di beberapa modul, pindahkan kategori tersebut ke library umum. Misalnya, system/software_defined_vehicle/core_services/samples/tracing/cpp_service/tracing_categories.h.
Di header:
#include "perfetto/tracing/tracing.h"
#include "perfetto/tracing/track_event.h"
PERFETTO_DEFINE_CATEGORIES(
perfetto::Category("sample")
.SetTags("tag")
.SetDescription("Sample events"));
Tempatkan makro penyimpanan statis dalam file sumber .cpp, bukan dalam metode. Jika Anda membagikan kategori di seluruh komponen, gunakan file sumber yang sesuai dengan header dengan kategori.
PERFETTO_TRACK_EVENT_STATIC_STORAGE();
int main() {
...
}
Untuk menginisialisasi Perfetto, inisialisasi backend sistem dan daftarkan peristiwa pelacakan:
#include <sdv/tracing_init.h>
int main() {
...
android::sdv::InitPerfettoWithTrackEvents<perfetto::TrackEvent>();
...
}
Tambahkan instrumentasi. Lihat contoh lainnya di system/software_defined_vehicle/core_services/samples/tracing/cpp_service/client.cpp.
int32_t mulBy100(int32_t num) {
// Start a slice that will get closed at the end of the scope.
TRACE_EVENT("client", "mulBy100", "num", num);
TRACE_EVENT("client", "This is a slice", "var", 123);
int32_t result = num * 100;
// Instant events have zero duration. They are drawn as markers on the track.
TRACE_EVENT_INSTANT("client", "Completed", "result", result);
return result;
}
Seperti dalam contoh Karat, kode ini menghasilkan dua irisan bertingkat dan penanda untuk peristiwa instan di UI. Nilai argumen debug ditampilkan saat peristiwa dipilih.
Mengumpulkan rekaman aktivitas
Gunakan skrip command line record\_android\_trace untuk merekam rekaman aktivitas dan
Perfetto web UI untuk melihatnya.
Mengonfigurasi pengambilan
Anda harus menyediakan konfigurasi untuk record_android_trace dalam format textproto. Lihat
dokumen Perfetto untuk mempelajari lebih lanjut.
Repositori SDV berisi contoh konfigurasi (system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx). File ini mencakup beberapa sumber data dan dapat disesuaikan atau digunakan apa adanya.
Menggunakan Perfetto UI untuk membuat konfigurasi
Anda dapat mengonfigurasi konfigurasi kustom dan menjelajahi opsi yang tersedia dengan membuka Rekam rekaman aktivitas baru di Perfetto UI, menyesuaikan setelan perekaman dan probe. Kemudian, Anda dapat membuka tampilan "Perintah perekaman" untuk melihat perintah yang dihasilkan dan mendapatkan konten konfigurasi dari sana.
Mengonfigurasi visibilitas instrumentasi dalam aplikasi
Instrumentasi Karat menggunakan
ATrace. Instrumentasi ini
dikonfigurasi di bagian ftrace_config dokumen. Komponen SDV
memiliki tag ATRACE_TAG_APP dan dapat diaktifkan
per aplikasi. Contoh konfigurasi mengaktifkan semua aplikasi.
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
# Setting atrace_apps to "*" enable ATrace events for all apps.
# You can set it to a pattern to match specific processes by name.
# Use multiple atrace_apps entries to enable multiple processes.
atrace_apps: "*"
}
}
}
Kami menggunakan peristiwa pelacakan di C++ Perfetto SDK. Ini adalah
track_event sumber data
(dokumen).
Anda dapat mengaktifkan atau menonaktifkan kategori dan tag di
track_event_config kolom. Setiap tag akhir kategori diaktifkan secara
default, kecuali untuk tag slow dan debug khusus.
Jika hanya ingin mengaktifkan kategori tertentu, Anda harus menonaktifkan semua
kategori lainnya, misalnya dengan disabled_categories: "*" seperti di sini:
data_sources: {
config {
name: "track_event"
track_event_config {
enabled_categories: "the_best_category_in_the_world"
disabled_categories: "*"
}
}
}Merekam rekaman aktivitas
Buka terminal di root repositori Android. Tidak perlu melakukan envsetup. Skrip perekaman ada di external/perfetto/tools/record_android_trace.
Jalankan skrip dengan contoh konfigurasi:
external/perfetto/tools/record_android_trace --config system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx
Untuk menghentikan perekaman lebih awal, pilih Ctrl + C.
Tindakan ini akan memicu adb shell perfetto untuk merekam rekaman aktivitas, lalu menarik
rekaman aktivitas ke host, biasanya di ~/traces. Saat rekaman aktivitas dikumpulkan, alat ini akan membuka jendela browser untuk menampilkan rekaman aktivitas.
Argumen yang berguna:
-s SERIALuntuk menggunakan perangkat dengan serial tertentu. Misalnya-s 0.0.0.0:6520--no-open-browserakan membuat URL untuk menayangkan rekaman aktivitas, tetapi tidak akan membuka browser. Hal ini berguna untuk sesi jarak jauh saat Anda menyiapkan penerusan port (biasanya 9001).-n, --no-opentidak akan membuka browser atau membuat URL untuk menayangkan rekaman aktivitas setelah sesi pelacakan. Anda tetap dapat membuka file di Perfetto UI dengan mengklik "Open trace file" dan memilih file.-o <path>untuk menetapkan jalur output.
Detail penggunaan
Bagian ini memberikan detail yang mungkin berguna saat menggunakan sistem pelacakan.
Melacak instrumentasi di komponen SDV
Di agen dengan instrumentasi pelacakan, pelacakan tersedia secara default pada build yang dapat di-debug (-eng, -userdebug), kecuali jika ditentukan lain. Saat mengumpulkan rekaman aktivitas, Anda akan melihat peristiwa untuk proses tanpa konfigurasi tambahan.
Library biasanya tidak otomatis menginisialisasi pelacakan. Di Rust, program biner yang menggunakan library harus melakukan inisialisasi pelacakan untuk proses menggunakan sdv_tracing::init_tracing(). Lihat Melengkapi kode Anda untuk mempelajari
lebih lanjut.
Middleware
Library Publikasi/Langganan: libsdv_middleware_dt
Acara:
- Penayang: Memublikasikan dan mendaftarkan topik.
- Pelanggan: Berlangganan dan melakukan polling.
Mengaktifkan: Panggil sdv_tracing::init_tracing() atau sdv_tracing::try_init_tracing() di program biner.
Library gRPC: libsdvmiddleware_rpc_grpc_transport
Acara:
- Klien RPC: Memulai, menghubungkan ke server, dan panggilan metode RPC.
- Server RPC: Memulai, mendaftar dengan Penemuan Layanan, menambahkan dan memanggil metode RPC.
Mengaktifkan: Panggil sdv_tracing::init_tracing() atau sdv_tracing::try_init_tracing() di biner.
SOME/IP
- Proses:
sdv_someip_broker_agent. Example Source: This is a test Example Translation: Dies ist ein Test Source: This is a test with another placeholder Translation: Dies ist ein Test mit einem anderen Platzhalter - Peristiwa: Pemrosesan dan terjemahan pesan, langganan peristiwa.
Pengelola siklus proses
- Proses:
sdv_lifecycle_agent. Example Source: This is a test Example Translation: Dies ist ein Test Source: This is a test with another placeholder Translation: Dies ist ein Test mit einem anderen Platzhalter - Peristiwa: Operasi layanan - meluncurkan, menghentikan, mendaftarkan, membatalkan pendaftaran.
Mode daya kendaraan
- Proses:
sdv_vpm_agent. Example Source: This is a test Example Translation: Dies ist ein Test Source: This is a test with another placeholder Translation: Dies ist ein Test mit einem anderen Platzhalter - Peristiwa: Perubahan status daya dan langganan.
Terowongan Data
Kami berencana mendukung integrasi pelacakan di masa mendatang.
Overhead performa pelacakan
Pengukuran overhead dilengkapi dengan peringatan biasa bahwa performa dapat berbeda di berbagai sistem dan terutama antara emulator dan hardware sebenarnya.
Karat
Data tolok ukur mentah tersedia di AOSP. Data dikumpulkan di VM Cuttlefish.
- Rentang tunggal:
tracing::info_span!(),#[tracing::instrument]dan yang serupa:- Pelacakan tidak diinisialisasi: 1 ns.
- Pelacakan diinisialisasi dan dinonaktifkan (tidak ada perekaman rekaman aktivitas): 30 ns.
- Pelacakan diaktifkan: 3 µs. Anotasi kolom debug dapat menambahkan 1-2 µs, bergantung pada kompleksitas stringifikasi.
- Peristiwa tunggal:
tracing::info!()dan yang serupa:- Pelacakan tidak diinisialisasi: 1 ns.
- Pelacakan diinisialisasi dan dinonaktifkan: 30 ns.
- Pelacakan diaktifkan: 1,5 µs. Anotasi kolom debug dapat menambahkan 0,5-1 µs, bergantung pada kompleksitas
stringification.
C++
Angka performa berasal dari bagian Performa dokumen Peristiwa pelacakan di Perfetto. Waktu untuk Pixel 3 dalam tabel konsisten dengan pengamatan kami di VM Cuttlefish.
Irisan tunggal: TRACE_EVENT() dan yang serupa. Pelacakan:
- Dinonaktifkan: 2 ns.
- Diaktifkan: 300 ns. Menggunakan anotasi kolom debug dapat menambahkan 50-100 ns.