Trang này trình bày cách ghi lại dấu vết hệ thống bằng API ProfilingManager.
ProfilingManager cũng có thể ghi lại các loại hồ sơ khác. Quy trình này tương tự như quy trình ghi lại dấu vết hệ thống, nhưng mỗi loại sử dụng một trình tạo khác nhau. Các hồ sơ được hỗ trợ và trình tạo tương ứng là:
Theo dõi hệ thống: Được ghi lại bằng
SystemTraceRequestBuilder, hữu ích cho việc phân tích độ trễ và gỡ lỗi hiệu suất chung.Kết xuất vùng nhớ khối xếp: Được ghi lại bằng
JavaHeapDumpRequestBuilder, hữu ích cho việc phát hiện và tối ưu hoá tình trạng rò rỉ bộ nhớ.Hồ sơ vùng nhớ khối xếp: Được ghi lại bằng
HeapProfileRequestBuilder, hữu ích cho việc tối ưu hoá bộ nhớ.Hồ sơ ngăn xếp lệnh gọi: Được ghi lại bằng
StackSamplingRequestBuilder, hữu ích cho việc tìm hiểu quá trình thực thi mã và phân tích độ trễ.
Thêm phần phụ thuộc
Để có trải nghiệm tốt nhất với API ProfilingManager, hãy thêm các thư viện Jetpack sau vào tệp build.gradle.kts.
Kotlin
dependencies { implementation("androidx.tracing:tracing:1.3.0") implementation("androidx.core:core:1.18.0") }
Groovy
dependencies { implementation 'androidx.tracing:tracing:1.3.0' implementation 'androidx.core:core:1.18.0' }
Ghi lại dấu vết hệ thống
Sau khi thêm các phần phụ thuộc bắt buộc, hãy sử dụng mã sau để ghi lại dấu vết hệ thống. Ví dụ này cho thấy một thiết lập cơ bản trong Activity để bắt đầu và quản lý phiên lập hồ sơ.
Kotlin
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) fun sampleRecordSystemTrace() { val mainExecutor: Executor = Dispatchers.IO.asExecutor() // Your choice of executor for the callback to occur on. val resultCallback = Consumer<ProfilingResult> { profilingResult -> if (profilingResult.errorCode == ProfilingResult.ERROR_NONE) { Log.d( "ProfileTest", "Received profiling result file=" + profilingResult.resultFilePath ) } else { Log.e( "ProfileTest", "Profiling failed errorcode=" + profilingResult.errorCode + " errormsg=" + profilingResult.errorMessage ) } } val stopSignal = CancellationSignal() val requestBuilder = SystemTraceRequestBuilder() requestBuilder.setCancellationSignal(stopSignal) requestBuilder.setTag("FOO") // Caller supplied tag for identification requestBuilder.setDurationMs(60000) requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER) requestBuilder.setBufferSizeKb(20971520) requestProfiling(applicationContext, requestBuilder.build(), mainExecutor, resultCallback) // Wait some time for profiling to start. Trace.beginSection("MyApp:HeavyOperation") heavyOperation() Trace.endSection() // Once the interesting code section is profiled, stop profile stopSignal.cancel() } fun heavyOperation() { // Computations you want to profile }
Java
void heavyOperation() { // Computations you want to profile } void sampleRecordSystemTrace() { Executor mainExecutor = Executors.newSingleThreadExecutor(); Consumer<ProfilingResult> resultCallback = new Consumer<ProfilingResult>() { @Override public void accept(ProfilingResult profilingResult) { if (profilingResult.getErrorCode() == ProfilingResult.ERROR_NONE) { Log.d( "ProfileTest", "Received profiling result file=" + profilingResult.getResultFilePath()); setupProfileUploadWorker(profilingResult.getResultFilePath()); } else { Log.e( "ProfileTest", "Profiling failed errorcode=" + profilingResult.getErrorCode() + " errormsg=" + profilingResult.getErrorMessage()); } } }; CancellationSignal stopSignal = new CancellationSignal(); SystemTraceRequestBuilder requestBuilder = new SystemTraceRequestBuilder(); requestBuilder.setCancellationSignal(stopSignal); requestBuilder.setTag("FOO"); requestBuilder.setDurationMs(60000); requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER); requestBuilder.setBufferSizeKb(20971520); Profiling.requestProfiling(getApplicationContext(), requestBuilder.build(), mainExecutor, resultCallback); // Wait some time for profiling to start. Trace.beginSection("MyApp:HeavyOperation"); heavyOperation(); Trace.endSection(); // Once the interesting code section is profiled, stop profile stopSignal.cancel(); }
Mã mẫu thiết lập và quản lý phiên lập hồ sơ bằng cách thực hiện các bước sau:
Thiết lập trình thực thi. Tạo một
Executorđể xác định luồng sẽ nhận kết quả lập hồ sơ. Quá trình lập hồ sơ diễn ra trong nền. Việc sử dụng trình thực thi luồng không phải là giao diện người dùng giúp ngăn lỗi Ứng dụng không phản hồi (ANR) nếu bạn thêm nhiều quy trình xử lý hơn vào lệnh gọi lại sau này.Xử lý kết quả lập hồ sơ. Tạo một đối tượng
Consumer<ProfilingResult>. Hệ thống sử dụng đối tượng này để gửi kết quả lập hồ sơ từProfilingManagertrở lại ứng dụng của bạn.Tạo yêu cầu lập hồ sơ. Tạo một
SystemTraceRequestBuilderđể thiết lập phiên lập hồ sơ. Trình tạo này cho phép bạn tuỳ chỉnh chế độ cài đặt dấu vếtProfilingManager. Bạn có thể tuỳ chỉnh trình tạo (không bắt buộc). Nếu không, hệ thống sẽ sử dụng chế độ cài đặt mặc định.- Xác định thẻ. Sử dụng
setTag()để thêm thẻ vào tên dấu vết. Thẻ này giúp bạn xác định dấu vết. - Không bắt buộc: Đặt thời lượng. Sử dụng
setDurationMs()để chỉ định thời gian lập hồ sơ tính bằng mili giây. Ví dụ:60000thiết lập dấu vết 60 giây. Dấu vết sẽ tự động kết thúc sau thời lượng đã chỉ định nếuCancellationSignalkhông được kích hoạt trước đó. - Chọn chính sách vùng đệm. Sử dụng
setBufferFillPolicy()để xác định cách lưu trữ dữ liệu dấu vết.BufferFillPolicy.RING_BUFFERcó nghĩa là khi vùng đệm đầy, dữ liệu mới sẽ ghi đè dữ liệu cũ nhất, duy trì bản ghi liên tục về hoạt động gần đây. - Đặt dung lượng bộ nhớ đệm. Sử dụng
setBufferSizeKb()để chỉ định dung lượng bộ nhớ đệm cho việc theo dõi mà bạn có thể dùng để kiểm soát kích thước của tệp dấu vết đầu ra.
- Xác định thẻ. Sử dụng
Không bắt buộc: Quản lý vòng đời phiên. Tạo một
CancellationSignal. Đối tượng này cho phép bạn dừng phiên lập hồ sơ bất cứ khi nào bạn muốn, giúp bạn kiểm soát chính xác thời lượng của phiên.Bắt đầu và nhận kết quả. Khi bạn gọi
requestProfiling(),ProfilingManagersẽ bắt đầu phiên lập hồ sơ ở chế độ nền. Sau khi lập hồ sơ xong, hệ thống sẽ gửiProfilingResultđến phương thứcresultCallback#accept. Nếu quá trình lập hồ sơ hoàn tất thành công,ProfilingResultsẽ cung cấp đường dẫn nơi dấu vết được lưu trên thiết bị của bạn thông quaProfilingResult#getResultFilePath. Bạn có thể lấy tệp này theo phương thức lập trình hoặc, đối với việc lập hồ sơ cục bộ, bằng cách chạyadb pull <trace_path>từ máy tính.Thêm điểm dấu vết tuỳ chỉnh. Bạn có thể thêm điểm dấu vết tuỳ chỉnh trong mã của ứng dụng. Trong ví dụ mã trước đó, một lát dấu vết có tên là
MyApp:HeavyOperationđược thêm bằngTrace.beginSection()vàTrace.endSection(). Lát tuỳ chỉnh này xuất hiện trong hồ sơ được tạo, làm nổi bật các thao tác cụ thể trong ứng dụng.