Xác định sự kiện tuỳ chỉnh

Tính năng theo dõi hệ thống chỉ hiển thị cho bạn thông tin về các quy trình ở cấp hệ thống, vì vậy, đôi khi khó biết được phương thức nào trong ứng dụng hoặc trò chơi của bạn đang thực thi tại một thời điểm nhất định so với các sự kiện hệ thống.

Jetpack cung cấp API theo dõi mà bạn có thể dùng để gắn nhãn một phần mã cụ thể. Sau đó, thông tin này được báo cáo trong các dấu vết được ghi lại trên thiết bị. Macrobenchmark tự động thu thập dữ liệu dấu vết bằng các điểm theo dõi tùy chỉnh.

Khi sử dụng công cụ dòng lệnh systrace để ghi lại dấu vết, bạn phải chọn tùy chọn -a; nếu không có tùy chọn này, các phương thức của ứng dụng sẽ không xuất hiện trong báo cáo theo dõi hệ thống.

Kotlin

Để tạo các sự kiện theo dõi tùy chỉnh trong mã, hãy sử dụng thư viện tracing-ktx. Cụ thể, hàm theo dõi cấp cao nhất sẽ tự động xử lý logic bắt đầu và kết thúc. Bạn có thể xem thông tin này trong đoạn mã sau.
class MyAdapter : RecyclerView.Adapter<MyViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup,
            viewType: Int): MyViewHolder {
        trace("MyAdapter.onCreateViewHolder") {
            MyViewHolder.newInstance(parent)
        }
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        trace("MyAdapter.onBindViewHolder") {
            trace("MyAdapter.queryDatabase")
                val rowItem = queryDatabase(position)
                dataset.add(rowItem)
            }
            holder.bind(dataset[position])
        }
    }
}

Java

Để tạo các sự kiện theo dõi tùy chỉnh trong mã của bạn, hãy dùng lớp Trace trong thư viện theo dõi Jetpack, như hiển thị trong đoạn mã sau.

Lưu ý: Khi bạn gọi beginSection() nhiều lần, việc gọi endSection() chỉ kết thúc bằng phương thức beginSection() được gọi gần đây nhất. Vì vậy, đối với các lệnh gọi lồng nhau, chẳng hạn như các lệnh trong đoạn mã sau, hãy đảm bảo bạn so khớp đúng cách từng lệnh gọi với beginSection() bằng lệnh gọi tới endSection().

Ngoài ra, bạn không thể gọi beginSection() trên một luồng và kết thúc luồng này từ một luồng khác; bạn phải gọi cả hai phương thức trên cùng một luồng.

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Trace.beginSection("MyAdapter.onCreateViewHolder");
        MyViewHolder myViewHolder;
        try {
            myViewHolder = MyViewHolder.newInstance(parent);
        } finally {
            // In try and catch statements, always call "endSection()" in a
            // "finally" block. That way, the method is invoked even when an
            // exception occurs.
            Trace.endSection();
        }
        return myViewHolder;
    }

   @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Trace.beginSection("MyAdapter.onBindViewHolder");
        try {
            try {
                Trace.beginSection("MyAdapter.queryDatabase");
                RowItem rowItem = queryDatabase(position);
                dataset.add(rowItem);
            } finally {
                Trace.endSection();
            }
            holder.bind(dataset.get(position));
        } finally {
            Trace.endSection();
        }
    }
}

Ngoài ra còn có API NDK dành cho các sự kiện theo dõi tùy chỉnh. Bạn có thể tìm hiểu thêm về cách sử dụng API đó cho mã gốc trong tài liệu về Sự kiện theo dõi tùy chỉnh trong mã gốc.