Trang này trình bày cách ghi lại dấu vết hệ thống bằng API ProfilingManager
.
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.16.0") }
Groovy
dependencies { implementation 'androidx.tracing:tracing:1.3.0' implementation 'androidx.core:core:1.16.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 dùng mã sau để ghi lại dấu vết hệ thống. Ví dụ này cho thấy một chế độ thiết lập cơ bản trong Activity
để bắt đầu và quản lý một 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()); } 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 ở chế độ nền. Việc sử dụng một trình thực thi luồng không phải giao diện người dùng sẽ giúp ngăn lỗi Ứng dụng không phản hồi (ANR) nếu sau này bạn thêm nhiều quy trình xử lý hơn vào lệnh gọi lại.Xử lý kết quả phân tích tài nguyên. Tạo đối tượng
Consumer<ProfilingResult>
. Hệ thống dùng đối tượng này để gửi kết quả lập hồ sơ từProfilingManager
trở 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 các chế độ cài đặt dấu vếtProfilingManager
. Bạn không bắt buộc phải tuỳ chỉnh trình tạo; nếu không, hệ thống sẽ sử dụng các chế độ cài đặt mặc định.- Xác định thẻ. 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ụ:60000
đặt một dấu vết 60 giây. Hoạt động theo dõi sẽ tự động kết thúc sau khoảng thời gian đã chỉ định nếuCancellationSignal
không được kích hoạt trước đó. - Chọn chính sách về khoảng đệm. Sử dụng
setBufferFillPolicy()
để xác định cách lưu trữ dữ liệu dấu vết.BufferFillPolicy.RING_BUFFER
có nghĩa là khi bộ nhớ đệ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 vùng đệm cho hoạt động theo dõi. Bạn có thể dùng dung lượng này để kiểm soát kích thước của tệp theo dõi đầu ra.
- Xác định thẻ. Dùng
Không bắt buộc: Quản lý vòng đời của phiên. Tạo
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 độ dài của phiên.Bắt đầu và nhận kết quả. Khi bạn gọi
requestProfiling()
,ProfilingManager
sẽ bắt đầu một phiên lập hồ sơ ở chế độ nền. Sau khi lập hồ sơ xong, nó sẽ gửiProfilingResult
đến phương thứcresultCallback#accept
của bạn. Nếu quá trình lập hồ sơ hoàn tất thành công,ProfilingResult
sẽ 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 cách lập trình hoặc bằng cách chạyadb pull <trace_path>
từ máy tính để lập hồ sơ cục bộ.Thêm các điểm theo dõi tuỳ chỉnh. Bạn có thể thêm các điểm theo dõi tuỳ chỉnh vào mã của ứng dụng. Trong ví dụ về mã trước đó, một lát cắt dấu vết có tên là
MyApp:HeavyOperation
được thêm bằng cách sử dụngTrace.beginSection()
vàTrace.endSection()
. Lát cắt tuỳ chỉnh này xuất hiện trong hồ sơ đã tạo, làm nổi bật các thao tác cụ thể trong ứng dụng của bạn.