From adf52a854cd777481aa587a159a947ae084f44b7 Mon Sep 17 00:00:00 2001 From: caodongping Date: Sat, 24 Jun 2023 16:20:32 +0800 Subject: [PATCH] 2.0 release --- .gitignore | 2 +- GRADLE_CONFIG.MD | 87 + GRADLE_CONFIG.zh-CN.MD | 107 +- INTRODUCTION.MD | 703 +- INTRODUCTION.zh-CN.MD | 476 + LICENSE | 8 + README.MD | 234 +- README.zh-CN.md | 255 +- app/build.gradle | 17 +- app/proguard-rules.pro | 2 - app/src/main/AndroidManifest.xml | 2 +- .../main/java/rhea/sample/android/app/App.kt | 92 + .../rhea/sample/android/app/FirstFragment.kt | 17 +- .../rhea/sample/android/app/MainActivity.kt | 16 + .../sample/android/app/PreciseInstrTest.kt | 31 + .../sample/android/app/RheaApplication.kt | 21 - .../rhea/sample/android/app/SecondFragment.kt | 17 +- .../java/rhea/sample/android/app/Tasks.java | 67 + .../rhea/sample/android/app/ThreadTest.java | 61 + .../rhea/sample/android/ExampleUnitTest.kt | 18 +- assets/arch.png | Bin 0 -> 80362 bytes assets/arch_en.png | Bin 0 -> 275274 bytes assets/binder_no_name.png | Bin 0 -> 18262 bytes assets/binder_with_name.png | Bin 0 -> 42303 bytes assets/btrace-lark.png | Bin 0 -> 73648 bytes assets/btrace-qq.jpeg | Bin 32962 -> 0 bytes assets/lock_locker_blocker.png | Bin 0 -> 126955 bytes assets/lock_locker_owner.png | Bin 0 -> 39907 bytes assets/lock_object_notifyall.png | Bin 0 -> 91556 bytes assets/lock_object_wait.png | Bin 0 -> 98730 bytes assets/mmap_data_structure.png | Bin 0 -> 49583 bytes assets/mmap_data_structure_en.png | Bin 0 -> 145504 bytes assets/pthread_create_child.png | Bin 0 -> 24590 bytes assets/pthread_create_parent.png | Bin 0 -> 22771 bytes assets/render_detail.png | Bin 0 -> 128341 bytes assets/render_principle.png | Bin 0 -> 91054 bytes assets/render_simple.png | Bin 0 -> 68826 bytes assets/simple_pb.png | Bin 0 -> 10665 bytes build.gradle | 18 +- gradle.properties | 12 +- gradle/gradle-maven-upload.gradle | 1 - rhea-android/rhea-atrace/CMakeLists.txt | 13 + rhea-android/rhea-atrace/build.gradle | 5 +- rhea-android/rhea-atrace/consumer-rules.pro | 6 + .../rhea-atrace/libs/dalvik.critical.jar | Bin 0 -> 2754 bytes .../rhea-atrace/src/main/cpp/binary_trace.cpp | 183 + .../rhea-atrace/src/main/cpp/binary_trace.h | 25 + .../main/cpp/features/binder/binder_proxy.cpp | 131 + .../main/cpp/features/binder/binder_proxy.h | 41 + .../src/main/cpp/features/block/block_jni.cpp | 126 + .../src/main/cpp/features/io/io_proxy.h | 2 +- .../cpp/features/klass/class_linker_proxy.cpp | 53 + .../cpp/features/klass/class_linker_proxy.h | 25 + .../cpp/features/render/render_node_proxy.cpp | 432 + .../cpp/features/render/render_node_proxy.h | 32 + .../main/cpp/features/render/render_proxy.cpp | 43 + .../main/cpp/features/render/render_proxy.h | 32 + .../main/cpp/features/thread/thread_proxy.cpp | 81 + .../main/cpp/features/thread/thread_proxy.h | 37 + .../src/main/cpp/hook/hook_bridge.cpp | 69 +- .../src/main/cpp/hook/shadowhook.cpp | 249 + .../src/main/cpp/hook/shadowhook_util.cpp | 61 + .../src/main/cpp/hook/shadowhook_util.h | 36 + .../rhea-atrace/src/main/cpp/include/atrace.h | 16 +- .../rhea-atrace/src/main/cpp/include/trace.h | 30 + .../src/main/cpp/include/trace_provider.h | 17 +- .../src/main/cpp/rhea_atrace_jni.cpp | 201 +- .../cpp/second_party/byte_hook/shadowhook.h | 170 + .../cpp/third_party/profilo/fastlog/debug.h | 2 +- .../deps/fmt/fmt-6.1.2/include/fmt/chrono.h | 1 - .../rhea-atrace/src/main/cpp/trace/atrace.cpp | 13 +- .../main/cpp/trace/native_trace_callbacks.cpp | 7 +- .../src/main/cpp/trace/recoder.cpp | 2 +- .../main/cpp/trace/thread_name_collector.cpp | 104 + .../main/cpp/trace/thread_name_collector.h | 35 + .../src/main/cpp/trace/trace_dev.cpp | 1 - .../src/main/cpp/trace/trace_provider.cpp | 47 +- .../src/main/cpp/utils/CMakeLists.txt | 1 + .../src/main/cpp/utils/include/utils/debug.h | 3 + .../src/main/cpp/utils/include/utils/timers.h | 1 + .../rhea-atrace/src/main/cpp/utils/logger.h | 15 + .../rhea-atrace/src/main/cpp/utils/npth_dl.c | 15 + .../rhea-atrace/src/main/cpp/utils/npth_dl.h | 15 + .../rhea-atrace/src/main/cpp/utils/timers.cpp | 5 + .../rheatrace/atrace/BinaryTrace.java | 92 + .../rheatrace/atrace/BlockTrace.java | 66 + .../rheatrace/atrace/RheaATrace.java | 165 +- .../render/AttachRenderLayoutInflater.java | 78 + .../atrace/render/LayoutInflaterFetcher.java | 75 + .../rheatrace/atrace/render/RenderTracer.java | 100 + .../rheatrace/atrace/render/RenderUtils.java | 339 + rhea-android/rhea-core/build.gradle | 1 + .../rhea-core/src/main/AndroidManifest.xml | 2 +- .../bytedance/rheatrace/core/HttpServer.java | 114 + .../rheatrace/core/LocalConfigManager.java | 155 - .../bytedance/rheatrace/core/ProcessUtil.java | 33 +- .../bytedance/rheatrace/core/RheaTrace.java | 37 +- .../rheatrace/core/TraceConfiguration.java | 130 - .../rheatrace/core/TraceRuntimeConfig.java | 115 - .../bytedance/rheatrace/core/TraceStub.java | 20 +- .../bytedance/rheatrace/core/TraceSwitch.java | 37 +- rhea-build/rhea-build-common/.gitignore | 1 + rhea-build/rhea-build-common/build.gradle | 23 + .../rhea-build-common/gradle.properties | 3 + .../rheatrace/common}/retrace/DescInfo.kt | 2 +- .../common}/retrace/MappingCollector.kt | 102 +- .../common}/retrace/MappingProcessor.kt | 2 +- .../common}/retrace/MappingReader.kt | 4 +- .../rheatrace/common}/retrace/MethodInfo.kt | 17 +- .../rheatrace/common/utils}/AGPCompat.kt | 2 +- .../common/utils/ClassToJavaFormat.kt | 156 + .../rheatrace/common/utils/Extensions.kt | 103 + .../rheatrace/common/utils}/FileUtil.kt | 25 +- .../common/utils/JavaToClassFormat.kt | 122 + .../rheatrace/common/utils}/ManifestUtil.kt | 12 +- .../rheatrace/common/utils}/RheaLog.kt | 14 +- .../rheatrace/common/utils/TypeUtil.java | 216 + rhea-build/rhea-gradle-plugin/build.gradle | 21 +- .../bytedance/rheatrace/plugin/RheaContext.kt | 103 + .../rheatrace/plugin/RheaTracePlugin.kt | 96 +- .../plugin/compiling/MethodCollector.kt | 212 +- .../plugin/compiling/MethodTracer.kt | 722 - .../{ParseMappingTask.kt => ParseMapping.kt} | 29 +- .../plugin/compiling/RheaTraceClassVisitor.kt | 388 + .../rheatrace/plugin/compiling/TraceMethod.kt | 42 +- .../rheatrace/plugin/compiling/TraceWeaver.kt | 309 - .../filter/DefaultTraceMethodFilter.kt | 10 +- .../compiling/filter/RheaTraceMethodFilter.kt | 290 +- .../compiling/filter/TraceMethodFilter.kt | 14 +- .../plugin/extension/RheaBuildExtension.kt | 15 +- .../plugin/extension/TraceCompilation.kt | 39 +- .../plugin/extension/TraceRuntime.kt | 1 + .../plugin/internal/CopyMappingTask.kt | 84 + .../internal/{common => }/RheaConstants.kt | 13 +- .../plugin/internal/RheaFileUtils.kt | 60 + .../plugin/internal/compat/RheaTraceCompat.kt | 124 - .../plugin/internal/compat/VersionsCompat.kt | 55 - .../rheatrace/plugin/task/RheaTraceTask.kt | 247 - .../plugin/task/RheaTraceTasksManager.kt | 84 - .../plugin/transform/RheaBaseTransform.kt | 154 - .../transform/RheaTraceLegacyTransform.kt | 187 - .../plugin/transform/RheaTraceTransform.kt | 226 - .../rhea-precise-instrumentation/.gitignore | 1 + .../rhea-precise-instrumentation/build.gradle | 17 + .../gradle.properties | 3 + .../precise/PreciseInstrumentationContext.kt | 119 + .../PreciseInstrumentationExtension.kt | 33 + .../precise/method/EvilMethodDetector.kt | 153 + .../precise/method/EvilMethodInfo.kt | 18 + .../precise/method/EvilMethodReason.kt | 45 + .../precise/method/EvilRootMethodDetector.kt | 91 + .../rheatrace/precise/method/MethodFilter.kt | 193 + .../rheatrace/precise/method/MethodHelper.kt | 107 + .../rheatrace/precise/method/MethodMatcher.kt | 264 + .../main/resources/framework_evil_method.txt | 835 + .../main/resources/third_part_evil_method.txt | 703 + .../bytedance/rheatrace/common/ReflectUtil.kt | 6 +- rhea-tool/rhea-trace-processor/.gitignore | 1 + rhea-tool/rhea-trace-processor/build.gradle | 34 + .../rhea-trace-processor/gradle.properties | 3 + .../bytedance/rheatrace/processor/Adb.java | 202 + .../bytedance/rheatrace/processor/Log.java | 65 + .../bytedance/rheatrace/processor/Main.java | 242 + .../core/AbstractTraceGenerator.java | 43 + .../rheatrace/processor/core/AdbProp.java | 48 + .../processor/core/AppTraceProcessor.java | 247 + .../rheatrace/processor/core/Arguments.java | 283 + .../rheatrace/processor/core/Debug.java | 30 + .../rheatrace/processor/core/Mapping.java | 100 + .../processor/core/SystemLevelCapture.java | 37 + .../rheatrace/processor/core/TraceError.java | 34 + .../rheatrace/processor/core/Version.java | 34 + .../rheatrace/processor/core/Workspace.java | 94 + .../rheatrace/processor/lite/LiteCapture.java | 123 + .../rheatrace/processor/lite/Trace.java | 161 + .../rheatrace/processor/os/MacOS.java | 93 + .../bytedance/rheatrace/processor/os/OS.java | 48 + .../rheatrace/processor/os/Windows.java | 86 + .../processor/perfetto/PerfettoCapture.java | 97 + .../processor/perfetto/TraceProcessor.java | 69 + .../processor/statistics/Statistics.java | 168 + .../rheatrace/processor/trace/ATrace.java | 57 + .../rheatrace/processor/trace/Frame.java | 191 + .../processor/trace/TraceAssembler.java | 48 + .../rheatrace/processor/trace/TraceEvent.java | 20 + .../main/java/protos/AllChromeMetrics.java | 320 + ...oidEnergyConsumerDescriptorOuterClass.java | 2017 + ...idEnergyEstimationBreakdownOuterClass.java | 2269 + .../AndroidFrameTimelineMetricOuterClass.java | 2675 + .../src/main/java/protos/AndroidFs.java | 5832 + ...dGameInterventionListConfigOuterClass.java | 760 + ...AndroidGameInterventionListOuterClass.java | 3115 + .../src/main/java/protos/AndroidLog.java | 5106 + .../protos/AndroidLogConfigOuterClass.java | 1103 + .../main/java/protos/AndroidLogConstants.java | 364 + .../AndroidPolledStateConfigOuterClass.java | 616 + .../protos/AndroidPowerConfigOuterClass.java | 1203 + ...AndroidSystemPropertyConfigOuterClass.java | 891 + .../AndroidSystemPropertyOuterClass.java | 1611 + .../AndroidTrustyWorkqueuesOuterClass.java | 456 + .../src/main/java/protos/ArgsClassNames.java | 1755 + .../src/main/java/protos/AtomIds.java | 5429 + .../src/main/java/protos/BattMetric.java | 4515 + .../protos/BatteryCountersOuterClass.java | 1239 + .../src/main/java/protos/Binder.java | 5214 + .../src/main/java/protos/BinderMetric.java | 1820 + .../java/protos/BlinkGcMetricOuterClass.java | 7680 ++ .../src/main/java/protos/Block.java | 19949 +++ .../java/protos/BuiltinClockOuterClass.java | 193 + .../src/main/java/protos/CameraEvent.java | 8403 ++ .../src/main/java/protos/CameraMetric.java | 1598 + .../main/java/protos/CameraUnaggMetric.java | 1850 + .../src/main/java/protos/Cgroup.java | 9431 ++ .../ChromeActiveProcessesOuterClass.java | 644 + .../ChromeApplicationStateInfoOuterClass.java | 710 + .../ChromeBenchmarkMetadataOuterClass.java | 2180 + ...omeCompositorSchedulerStateOuterClass.java | 18114 +++ .../java/protos/ChromeConfigOuterClass.java | 1404 + ...omeContentSettingsEventInfoOuterClass.java | 614 + .../protos/ChromeFrameReporterOuterClass.java | 2986 + .../ChromeHistogramSampleOuterClass.java | 1716 + .../protos/ChromeKeyedServiceOuterClass.java | 703 + .../protos/ChromeLatencyInfoOuterClass.java | 2618 + .../protos/ChromeLegacyIpcOuterClass.java | 1198 + .../protos/ChromeMessagePumpOuterClass.java | 740 + .../src/main/java/protos/ChromeMetadata.java | 4938 + .../protos/ChromeMojoEventInfoOuterClass.java | 1676 + .../ChromeProcessDescriptorOuterClass.java | 1743 + ...hromeRendererSchedulerStateOuterClass.java | 908 + .../ChromeThreadDescriptorOuterClass.java | 1215 + .../protos/ChromeTraceEventOuterClass.java | 12069 ++ .../protos/ChromeTracePacketOuterClass.java | 2771 + .../protos/ChromeUserEventOuterClass.java | 850 + ...ChromeWindowHandleEventInfoOuterClass.java | 766 + .../src/main/java/protos/Clk.java | 1933 + .../java/protos/ClockSnapshotOuterClass.java | 2257 + .../src/main/java/protos/Cma.java | 2332 + .../protos/CommitDataRequestOuterClass.java | 4313 + .../src/main/java/protos/Compaction.java | 11928 ++ .../java/protos/ConsoleConfigOuterClass.java | 774 + .../java/protos/ConsumerPortOuterClass.java | 17565 +++ .../protos/CounterDescriptorOuterClass.java | 1920 + .../main/java/protos/CpuInfoOuterClass.java | 1880 + .../src/main/java/protos/CpuMetric.java | 7160 + .../src/main/java/protos/Cpuhp.java | 4134 + .../src/main/java/protos/CrosEc.java | 1059 + .../src/main/java/protos/CustomOptions.java | 68 + .../protos/DataSourceConfigOuterClass.java | 8024 ++ .../DataSourceDescriptorOuterClass.java | 1980 + .../protos/DebugAnnotationOuterClass.java | 7108 + .../src/main/java/protos/Deobfuscation.java | 3680 + .../src/main/java/protos/Descriptor.java | 13198 ++ .../src/main/java/protos/DisplayMetrics.java | 3190 + .../src/main/java/protos/DmaFence.java | 4913 + .../src/main/java/protos/DmaHeapMetric.java | 912 + .../src/main/java/protos/DmabufHeap.java | 759 + .../src/main/java/protos/Dpu.java | 1210 + .../src/main/java/protos/Drm.java | 1577 + .../src/main/java/protos/DroppedFrames.java | 1634 + .../src/main/java/protos/DvfsMetric.java | 2904 + .../src/main/java/protos/Ext4.java | 89975 +++++++++++++ .../protos/ExtensionDescriptorOuterClass.java | 688 + .../src/main/java/protos/F2Fs.java | 35794 +++++ .../src/main/java/protos/Fastrpc.java | 758 + .../src/main/java/protos/FastrpcMetric.java | 1888 + .../src/main/java/protos/Fence.java | 3937 + .../src/main/java/protos/Filemap.java | 1884 + .../protos/FrameTimelineEventOuterClass.java | 8053 ++ .../java/protos/FrameTimesOuterClass.java | 1025 + .../src/main/java/protos/Ftrace.java | 2279 + .../java/protos/FtraceConfigOuterClass.java | 6316 + .../protos/FtraceDescriptorOuterClass.java | 1751 + .../protos/FtraceEventBundleOuterClass.java | 4873 + .../java/protos/FtraceEventOuterClass.java | 103746 +++++++++++++++ .../java/protos/FtraceStatsOuterClass.java | 4149 + .../src/main/java/protos/G2D.java | 933 + .../src/main/java/protos/G2DMetric.java | 3524 + .../src/main/java/protos/Generic.java | 2098 + .../protos/GpuCounterConfigOuterClass.java | 1102 + .../GpuCounterDescriptorOuterClass.java | 5548 + .../protos/GpuCounterEventOuterClass.java | 2075 + .../main/java/protos/GpuLogOuterClass.java | 1065 + .../src/main/java/protos/GpuMem.java | 757 + .../src/main/java/protos/GpuMemEvent.java | 765 + .../src/main/java/protos/GpuMetric.java | 4967 + .../protos/GpuRenderStageEventOuterClass.java | 8917 ++ .../src/main/java/protos/GpuScheduler.java | 2757 + .../protos/GraphicsFrameEventOuterClass.java | 1968 + .../main/java/protos/HeapGraphOuterClass.java | 7967 ++ .../protos/HeapprofdConfigOuterClass.java | 6274 + .../src/main/java/protos/HistogramHashes.java | 648 + .../src/main/java/protos/Hwcomposer.java | 3786 + .../src/main/java/protos/HwuiMetric.java | 6314 + .../src/main/java/protos/I2C.java | 7782 ++ .../protos/InitialDisplayStateOuterClass.java | 691 + .../protos/InodeFileConfigOuterClass.java | 2605 + .../java/protos/InodeFileMapOuterClass.java | 2376 + .../protos/InterceptorConfigOuterClass.java | 903 + .../InterceptorDescriptorOuterClass.java | 691 + .../java/protos/InternedDataOuterClass.java | 9805 ++ .../src/main/java/protos/Ion.java | 758 + .../src/main/java/protos/IonMetric.java | 1887 + .../src/main/java/protos/Ipi.java | 1932 + .../src/main/java/protos/Irq.java | 3017 + .../protos/IrqRuntimeMetricOuterClass.java | 4200 + .../src/main/java/protos/JankCujMetric.java | 7153 + .../protos/JavaHeapHistogramOuterClass.java | 4237 + .../java/protos/JavaHeapStatsOuterClass.java | 4724 + .../protos/JavaHprofConfigOuterClass.java | 3346 + .../src/main/java/protos/Kfree.java | 36 + .../src/main/java/protos/Kmalloc.java | 36 + .../src/main/java/protos/Kmem.java | 34276 +++++ .../src/main/java/protos/Kvm.java | 24612 ++++ .../src/main/java/protos/LmkMetric.java | 1737 + .../src/main/java/protos/LmkReasonMetric.java | 3562 + .../java/protos/LogMessageOuterClass.java | 1422 + .../java/protos/LongLatencyOuterClass.java | 1982 + .../src/main/java/protos/Lowmemorykiller.java | 1036 + .../src/main/java/protos/Lwis.java | 1112 + .../src/main/java/protos/Mali.java | 6460 + .../src/main/java/protos/Mdss.java | 19496 +++ .../java/protos/MediaMetricOuterClass.java | 1958 + .../src/main/java/protos/MemMetric.java | 5295 + .../src/main/java/protos/MemUnaggMetric.java | 4408 + .../src/main/java/protos/MemoryGraph.java | 6055 + .../protos/MetatraceCategoriesOuterClass.java | 206 + .../src/main/java/protos/Metrics.java | 14476 ++ .../src/main/java/protos/MetricsImpl.java | 3874 + .../src/main/java/protos/MmEvent.java | 855 + .../src/main/java/protos/MultiuserMetric.java | 2961 + .../src/main/java/protos/Net.java | 4644 + .../src/main/java/protos/NetworkMetric.java | 15348 +++ .../src/main/java/protos/NetworkTrace.java | 1860 + .../main/java/protos/NetworkTraceConfig.java | 632 + .../protos/ObservableEventsOuterClass.java | 2069 + .../src/main/java/protos/Oom.java | 1355 + .../src/main/java/protos/OtherTraces.java | 750 + .../src/main/java/protos/PackageList.java | 1634 + .../protos/PackagesListConfigOuterClass.java | 760 + .../java/protos/PackagesListOuterClass.java | 2103 + .../src/main/java/protos/Panel.java | 1996 + .../protos/PerfEventConfigOuterClass.java | 6881 + .../java/protos/PerfEventsOuterClass.java | 4706 + .../protos/PerfettoMetatraceOuterClass.java | 4553 + .../java/protos/PerformanceMarkHashes.java | 826 + .../src/main/java/protos/Power.java | 7214 + .../java/protos/PowerRailsOuterClass.java | 3275 + .../src/main/java/protos/PowrailsMetric.java | 3067 + .../src/main/java/protos/Print.java | 36 + .../src/main/java/protos/Printk.java | 635 + .../protos/ProcessDescriptorOuterClass.java | 1922 + .../src/main/java/protos/ProcessMetadata.java | 2483 + .../protos/ProcessStatsConfigOuterClass.java | 1540 + .../java/protos/ProcessStatsOuterClass.java | 4916 + .../java/protos/ProcessTreeOuterClass.java | 4748 + .../java/protos/ProducerPortOuterClass.java | 19145 +++ .../src/main/java/protos/ProfileCommon.java | 8335 ++ .../java/protos/ProfilePacketOuterClass.java | 18217 +++ .../java/protos/ProfilerSmapsOuterClass.java | 2741 + .../src/main/java/protos/RangeOfInterest.java | 571 + .../src/main/java/protos/RawSyscalls.java | 1362 + .../src/main/java/protos/Regulator.java | 4529 + .../java/protos/ReportedByPageOuterClass.java | 1162 + .../src/main/java/protos/RtRuntimeMetric.java | 2134 + .../src/main/java/protos/Sched.java | 13526 ++ .../src/main/java/protos/Scm.java | 1169 + .../java/protos/ScrollJankOuterClass.java | 1220 + .../src/main/java/protos/Sde.java | 6517 + .../src/main/java/protos/Signal.java | 1853 + .../src/main/java/protos/Simpleperf.java | 4668 + .../src/main/java/protos/Skb.java | 758 + .../src/main/java/protos/SliceNames.java | 854 + .../src/main/java/protos/Smaps.java | 3254 + .../src/main/java/protos/Sock.java | 1353 + .../java/protos/SourceLocationOuterClass.java | 1750 + .../src/main/java/protos/StartupMetric.java | 21934 +++ .../java/protos/StatsdAtomOuterClass.java | 1259 + .../protos/StatsdTracingConfigOuterClass.java | 2354 + .../protos/StressTestConfigOuterClass.java | 3257 + .../src/main/java/protos/Surfaceflinger.java | 1726 + .../src/main/java/protos/Sync.java | 2386 + .../src/main/java/protos/Synthetic.java | 856 + .../java/protos/SysStatsConfigOuterClass.java | 2321 + .../main/java/protos/SysStatsCounters.java | 1782 + .../main/java/protos/SysStatsOuterClass.java | 11279 ++ .../src/main/java/protos/SystemInfo.java | 466 + .../java/protos/SystemInfoOuterClass.java | 2637 + .../src/main/java/protos/Systrace.java | 934 + .../src/main/java/protos/Task.java | 1910 + .../java/protos/TaskExecutionOuterClass.java | 606 + .../src/main/java/protos/TaskNames.java | 2265 + .../src/main/java/protos/Tcp.java | 1155 + .../protos/TestBundleWrapperOuterClass.java | 1203 + .../protos/TestChromeMetricOuterClass.java | 567 + .../java/protos/TestConfigOuterClass.java | 3288 + .../main/java/protos/TestEventOuterClass.java | 3263 + .../src/main/java/protos/TestExtensions.java | 1509 + .../src/main/java/protos/Thermal.java | 1633 + .../protos/ThreadDescriptorOuterClass.java | 1733 + .../java/protos/ThreadTimeInStateMetric.java | 4368 + .../main/java/protos/TouchJankOuterClass.java | 1228 + .../java/protos/TraceConfigOuterClass.java | 20585 +++ .../src/main/java/protos/TraceOuterClass.java | 847 + .../protos/TracePacketDefaultsOuterClass.java | 1107 + .../java/protos/TracePacketOuterClass.java | 17146 +++ .../src/main/java/protos/TraceProcessor.java | 17692 +++ .../src/main/java/protos/TraceQuality.java | 1495 + .../java/protos/TraceStatsOuterClass.java | 7088 + .../main/java/protos/TraceUuidOuterClass.java | 678 + .../TracingServiceCapabilitiesOuterClass.java | 1039 + .../protos/TracingServiceEventOuterClass.java | 1491 + .../protos/TracingServiceStateOuterClass.java | 6626 + .../protos/TrackDescriptorOuterClass.java | 2459 + .../protos/TrackEventConfigOuterClass.java | 2399 + .../TrackEventDescriptorOuterClass.java | 1820 + .../java/protos/TrackEventOuterClass.java | 15171 +++ .../protos/TranslationTableOuterClass.java | 4761 + .../main/java/protos/TriggerOuterClass.java | 1054 + .../src/main/java/protos/Trusty.java | 13460 ++ .../src/main/java/protos/Ufs.java | 2307 + .../main/java/protos/UiStateOuterClass.java | 1885 + .../main/java/protos/UnsymbolizedArgs.java | 1997 + .../protos/UnsymbolizedFramesOuterClass.java | 1985 + .../src/main/java/protos/UserEventHashes.java | 648 + .../src/main/java/protos/V4L2.java | 12130 ++ .../src/main/java/protos/VirtioGpu.java | 2827 + .../src/main/java/protos/VirtioVideo.java | 3715 + .../src/main/java/protos/Vmscan.java | 5167 + .../java/protos/VulkanApiEventOuterClass.java | 3197 + .../protos/VulkanMemoryConfigOuterClass.java | 724 + .../protos/VulkanMemoryEventOuterClass.java | 3747 + .../src/main/java/protos/WireProtocol.java | 6735 + .../src/main/java/protos/Workqueue.java | 2726 + .../src/main/resources/record_android_trace | 696 + .../main/resources/record_android_trace_win | 720 + rhea-trace/commonTraceFilter.txt | 7 + rhea-trace/preciseTraceFilter.txt | 41 + rhea-trace/traceFilter.txt | 15 - scripts/python/rheatrace/__init__.py | 0 scripts/python/rheatrace/common/__init__.py | 0 .../python/rheatrace/common/cmd_executer.py | 70 - scripts/python/rheatrace/common/context.py | 66 - .../python/rheatrace/common/env_checker.py | 80 - .../config/native_binder_code_mapping.json | 116 - .../rheatrace/enhanced_systrace/__init__.py | 18 - .../enhanced_systrace/io_extender.py | 129 - .../enhanced_systrace/systrace_capturer.py | 117 - .../enhanced_systrace/systrace_env.py | 26 - .../python/rheatrace/rhea_atrace/__init__.py | 18 - .../rheatrace/rhea_atrace/atrace_capturer.py | 139 - .../rhea_atrace/rhea_log/__init__.py | 0 .../rhea_atrace/rhea_log/rhea_logger.py | 49 - .../rheatrace/rhea_atrace/trace_runner.py | 41 - .../rheatrace/rhea_atrace/utils/__init__.py | 0 .../rheatrace/rhea_atrace/utils/file_utils.py | 84 - .../rhea_atrace/utils/trace_doctor.py | 237 - scripts/python/rheatrace/rhea_config.py | 39 - scripts/python/rheatrace/rheatrace.py | 310 - scripts/python/rheatrace/trace_enhance.py | 325 - scripts/python/rheatrace/trace_processor.py | 336 - settings.gradle | 8 +- 461 files changed, 1220047 insertions(+), 6051 deletions(-) create mode 100644 GRADLE_CONFIG.MD create mode 100644 INTRODUCTION.zh-CN.MD create mode 100644 app/src/main/java/rhea/sample/android/app/App.kt create mode 100644 app/src/main/java/rhea/sample/android/app/PreciseInstrTest.kt delete mode 100644 app/src/main/java/rhea/sample/android/app/RheaApplication.kt create mode 100644 app/src/main/java/rhea/sample/android/app/Tasks.java create mode 100644 app/src/main/java/rhea/sample/android/app/ThreadTest.java create mode 100644 assets/arch.png create mode 100644 assets/arch_en.png create mode 100644 assets/binder_no_name.png create mode 100644 assets/binder_with_name.png create mode 100644 assets/btrace-lark.png delete mode 100644 assets/btrace-qq.jpeg create mode 100644 assets/lock_locker_blocker.png create mode 100644 assets/lock_locker_owner.png create mode 100644 assets/lock_object_notifyall.png create mode 100644 assets/lock_object_wait.png create mode 100644 assets/mmap_data_structure.png create mode 100644 assets/mmap_data_structure_en.png create mode 100644 assets/pthread_create_child.png create mode 100644 assets/pthread_create_parent.png create mode 100644 assets/render_detail.png create mode 100644 assets/render_principle.png create mode 100644 assets/render_simple.png create mode 100644 assets/simple_pb.png create mode 100644 rhea-android/rhea-atrace/libs/dalvik.critical.jar create mode 100644 rhea-android/rhea-atrace/src/main/cpp/binary_trace.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/binary_trace.h create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/binder/binder_proxy.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/binder/binder_proxy.h create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/block/block_jni.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/klass/class_linker_proxy.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/klass/class_linker_proxy.h create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/render/render_node_proxy.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/render/render_node_proxy.h create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/render/render_proxy.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/render/render_proxy.h create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/thread/thread_proxy.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/features/thread/thread_proxy.h create mode 100644 rhea-android/rhea-atrace/src/main/cpp/hook/shadowhook.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/hook/shadowhook_util.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/hook/shadowhook_util.h create mode 100644 rhea-android/rhea-atrace/src/main/cpp/second_party/byte_hook/shadowhook.h create mode 100644 rhea-android/rhea-atrace/src/main/cpp/trace/thread_name_collector.cpp create mode 100644 rhea-android/rhea-atrace/src/main/cpp/trace/thread_name_collector.h create mode 100644 rhea-android/rhea-atrace/src/main/java/com/bytedance/rheatrace/atrace/BinaryTrace.java create mode 100644 rhea-android/rhea-atrace/src/main/java/com/bytedance/rheatrace/atrace/BlockTrace.java create mode 100644 rhea-android/rhea-atrace/src/main/java/com/bytedance/rheatrace/atrace/render/AttachRenderLayoutInflater.java create mode 100644 rhea-android/rhea-atrace/src/main/java/com/bytedance/rheatrace/atrace/render/LayoutInflaterFetcher.java create mode 100644 rhea-android/rhea-atrace/src/main/java/com/bytedance/rheatrace/atrace/render/RenderTracer.java create mode 100644 rhea-android/rhea-atrace/src/main/java/com/bytedance/rheatrace/atrace/render/RenderUtils.java create mode 100644 rhea-android/rhea-core/src/main/java/com/bytedance/rheatrace/core/HttpServer.java delete mode 100644 rhea-android/rhea-core/src/main/java/com/bytedance/rheatrace/core/LocalConfigManager.java delete mode 100644 rhea-android/rhea-core/src/main/java/com/bytedance/rheatrace/core/TraceConfiguration.java delete mode 100644 rhea-android/rhea-core/src/main/java/com/bytedance/rheatrace/core/TraceRuntimeConfig.java create mode 100644 rhea-build/rhea-build-common/.gitignore create mode 100644 rhea-build/rhea-build-common/build.gradle create mode 100644 rhea-build/rhea-build-common/gradle.properties rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin => rhea-build-common/src/main/java/com/bytedance/rheatrace/common}/retrace/DescInfo.kt (94%) rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin => rhea-build-common/src/main/java/com/bytedance/rheatrace/common}/retrace/MappingCollector.kt (74%) rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin => rhea-build-common/src/main/java/com/bytedance/rheatrace/common}/retrace/MappingProcessor.kt (97%) rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin => rhea-build-common/src/main/java/com/bytedance/rheatrace/common}/retrace/MappingReader.kt (98%) rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin => rhea-build-common/src/main/java/com/bytedance/rheatrace/common}/retrace/MethodInfo.kt (75%) rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/compat => rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils}/AGPCompat.kt (98%) create mode 100644 rhea-build/rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils/ClassToJavaFormat.kt create mode 100644 rhea-build/rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils/Extensions.kt rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/common => rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils}/FileUtil.kt (81%) create mode 100644 rhea-build/rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils/JavaToClassFormat.kt rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/common => rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils}/ManifestUtil.kt (81%) rename rhea-build/{rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/common => rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils}/RheaLog.kt (95%) create mode 100644 rhea-build/rhea-build-common/src/main/java/com/bytedance/rheatrace/common/utils/TypeUtil.java create mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/RheaContext.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/compiling/MethodTracer.kt rename rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/compiling/{ParseMappingTask.kt => ParseMapping.kt} (84%) create mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/compiling/RheaTraceClassVisitor.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/compiling/TraceWeaver.kt create mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/CopyMappingTask.kt rename rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/{common => }/RheaConstants.kt (81%) create mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/RheaFileUtils.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/compat/RheaTraceCompat.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/internal/compat/VersionsCompat.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/task/RheaTraceTask.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/task/RheaTraceTasksManager.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/transform/RheaBaseTransform.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/transform/RheaTraceLegacyTransform.kt delete mode 100644 rhea-build/rhea-gradle-plugin/src/main/java/com/bytedance/rheatrace/plugin/transform/RheaTraceTransform.kt create mode 100644 rhea-build/rhea-precise-instrumentation/.gitignore create mode 100644 rhea-build/rhea-precise-instrumentation/build.gradle create mode 100644 rhea-build/rhea-precise-instrumentation/gradle.properties create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/PreciseInstrumentationContext.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/extension/PreciseInstrumentationExtension.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/method/EvilMethodDetector.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/method/EvilMethodInfo.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/method/EvilMethodReason.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/method/EvilRootMethodDetector.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/method/MethodFilter.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/method/MethodHelper.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/java/com/bytedance/rheatrace/precise/method/MethodMatcher.kt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/resources/framework_evil_method.txt create mode 100644 rhea-build/rhea-precise-instrumentation/src/main/resources/third_part_evil_method.txt create mode 100644 rhea-tool/rhea-trace-processor/.gitignore create mode 100644 rhea-tool/rhea-trace-processor/build.gradle create mode 100644 rhea-tool/rhea-trace-processor/gradle.properties create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/Adb.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/Log.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/Main.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/AbstractTraceGenerator.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/AdbProp.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/AppTraceProcessor.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/Arguments.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/Debug.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/Mapping.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/SystemLevelCapture.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/TraceError.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/Version.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/core/Workspace.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/lite/LiteCapture.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/lite/Trace.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/os/MacOS.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/os/OS.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/os/Windows.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/perfetto/PerfettoCapture.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/perfetto/TraceProcessor.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/statistics/Statistics.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/trace/ATrace.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/trace/Frame.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/trace/TraceAssembler.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/com/bytedance/rheatrace/processor/trace/TraceEvent.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AllChromeMetrics.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidEnergyConsumerDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidEnergyEstimationBreakdownOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidFrameTimelineMetricOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidFs.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidGameInterventionListConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidGameInterventionListOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidLog.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidLogConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidLogConstants.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidPolledStateConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidPowerConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidSystemPropertyConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidSystemPropertyOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AndroidTrustyWorkqueuesOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ArgsClassNames.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/AtomIds.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/BattMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/BatteryCountersOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Binder.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/BinderMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/BlinkGcMetricOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Block.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/BuiltinClockOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CameraEvent.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CameraMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CameraUnaggMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Cgroup.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeActiveProcessesOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeApplicationStateInfoOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeBenchmarkMetadataOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeCompositorSchedulerStateOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeContentSettingsEventInfoOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeFrameReporterOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeHistogramSampleOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeKeyedServiceOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeLatencyInfoOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeLegacyIpcOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeMessagePumpOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeMetadata.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeMojoEventInfoOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeProcessDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeRendererSchedulerStateOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeThreadDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeTraceEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeTracePacketOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeUserEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ChromeWindowHandleEventInfoOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Clk.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ClockSnapshotOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Cma.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CommitDataRequestOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Compaction.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ConsoleConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ConsumerPortOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CounterDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CpuInfoOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CpuMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Cpuhp.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CrosEc.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/CustomOptions.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DataSourceConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DataSourceDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DebugAnnotationOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Deobfuscation.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Descriptor.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DisplayMetrics.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DmaFence.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DmaHeapMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DmabufHeap.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Dpu.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Drm.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DroppedFrames.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/DvfsMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Ext4.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ExtensionDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/F2Fs.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Fastrpc.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/FastrpcMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Fence.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Filemap.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/FrameTimelineEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/FrameTimesOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Ftrace.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/FtraceConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/FtraceDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/FtraceEventBundleOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/FtraceEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/FtraceStatsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/G2D.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/G2DMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Generic.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuCounterConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuCounterDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuCounterEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuLogOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuMem.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuMemEvent.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuRenderStageEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GpuScheduler.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/GraphicsFrameEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/HeapGraphOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/HeapprofdConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/HistogramHashes.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Hwcomposer.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/HwuiMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/I2C.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/InitialDisplayStateOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/InodeFileConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/InodeFileMapOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/InterceptorConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/InterceptorDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/InternedDataOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Ion.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/IonMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Ipi.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Irq.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/IrqRuntimeMetricOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/JankCujMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/JavaHeapHistogramOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/JavaHeapStatsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/JavaHprofConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Kfree.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Kmalloc.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Kmem.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Kvm.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/LmkMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/LmkReasonMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/LogMessageOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/LongLatencyOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Lowmemorykiller.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Lwis.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Mali.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Mdss.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/MediaMetricOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/MemMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/MemUnaggMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/MemoryGraph.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/MetatraceCategoriesOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Metrics.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/MetricsImpl.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/MmEvent.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/MultiuserMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Net.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/NetworkMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/NetworkTrace.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/NetworkTraceConfig.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ObservableEventsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Oom.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/OtherTraces.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PackageList.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PackagesListConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PackagesListOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Panel.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PerfEventConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PerfEventsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PerfettoMetatraceOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PerformanceMarkHashes.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Power.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PowerRailsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/PowrailsMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Print.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Printk.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProcessDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProcessMetadata.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProcessStatsConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProcessStatsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProcessTreeOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProducerPortOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProfileCommon.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProfilePacketOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ProfilerSmapsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/RangeOfInterest.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/RawSyscalls.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Regulator.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ReportedByPageOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/RtRuntimeMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Sched.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Scm.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ScrollJankOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Sde.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Signal.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Simpleperf.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Skb.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/SliceNames.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Smaps.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Sock.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/SourceLocationOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/StartupMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/StatsdAtomOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/StatsdTracingConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/StressTestConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Surfaceflinger.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Sync.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Synthetic.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/SysStatsConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/SysStatsCounters.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/SysStatsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/SystemInfo.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/SystemInfoOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Systrace.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Task.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TaskExecutionOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TaskNames.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Tcp.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TestBundleWrapperOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TestChromeMetricOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TestConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TestEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TestExtensions.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Thermal.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ThreadDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/ThreadTimeInStateMetric.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TouchJankOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TraceConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TraceOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TracePacketDefaultsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TracePacketOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TraceProcessor.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TraceQuality.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TraceStatsOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TraceUuidOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TracingServiceCapabilitiesOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TracingServiceEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TracingServiceStateOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TrackDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TrackEventConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TrackEventDescriptorOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TrackEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TranslationTableOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/TriggerOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Trusty.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Ufs.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/UiStateOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/UnsymbolizedArgs.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/UnsymbolizedFramesOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/UserEventHashes.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/V4L2.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/VirtioGpu.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/VirtioVideo.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Vmscan.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/VulkanApiEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/VulkanMemoryConfigOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/VulkanMemoryEventOuterClass.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/WireProtocol.java create mode 100644 rhea-tool/rhea-trace-processor/src/main/java/protos/Workqueue.java create mode 100755 rhea-tool/rhea-trace-processor/src/main/resources/record_android_trace create mode 100644 rhea-tool/rhea-trace-processor/src/main/resources/record_android_trace_win create mode 100644 rhea-trace/commonTraceFilter.txt create mode 100644 rhea-trace/preciseTraceFilter.txt delete mode 100644 rhea-trace/traceFilter.txt delete mode 100644 scripts/python/rheatrace/__init__.py delete mode 100644 scripts/python/rheatrace/common/__init__.py delete mode 100644 scripts/python/rheatrace/common/cmd_executer.py delete mode 100644 scripts/python/rheatrace/common/context.py delete mode 100644 scripts/python/rheatrace/common/env_checker.py delete mode 100644 scripts/python/rheatrace/config/native_binder_code_mapping.json delete mode 100644 scripts/python/rheatrace/enhanced_systrace/__init__.py delete mode 100644 scripts/python/rheatrace/enhanced_systrace/io_extender.py delete mode 100644 scripts/python/rheatrace/enhanced_systrace/systrace_capturer.py delete mode 100644 scripts/python/rheatrace/enhanced_systrace/systrace_env.py delete mode 100644 scripts/python/rheatrace/rhea_atrace/__init__.py delete mode 100644 scripts/python/rheatrace/rhea_atrace/atrace_capturer.py delete mode 100644 scripts/python/rheatrace/rhea_atrace/rhea_log/__init__.py delete mode 100644 scripts/python/rheatrace/rhea_atrace/rhea_log/rhea_logger.py delete mode 100644 scripts/python/rheatrace/rhea_atrace/trace_runner.py delete mode 100644 scripts/python/rheatrace/rhea_atrace/utils/__init__.py delete mode 100644 scripts/python/rheatrace/rhea_atrace/utils/file_utils.py delete mode 100644 scripts/python/rheatrace/rhea_atrace/utils/trace_doctor.py delete mode 100644 scripts/python/rheatrace/rhea_config.py delete mode 100644 scripts/python/rheatrace/rheatrace.py delete mode 100644 scripts/python/rheatrace/trace_enhance.py delete mode 100644 scripts/python/rheatrace/trace_processor.py diff --git a/.gitignore b/.gitignore index 80a721c..1bad86c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ local.properties **/output */.DS_Store .DS_Store: -scripts/python/rheatrace/.build +scripts/python/rheatrace/.build \ No newline at end of file diff --git a/GRADLE_CONFIG.MD b/GRADLE_CONFIG.MD new file mode 100644 index 0000000..bee1291 --- /dev/null +++ b/GRADLE_CONFIG.MD @@ -0,0 +1,87 @@ +## Gradle Build Parameter Description + +| Parameter | Default Value | Description | +| -------------------------- | ----------------- | ----------------| +| traceFilterFilePath | null | This file configuration determines which methods you don't want to trace. See detailed usage below.| +| applyMethodMappingFilePath | null | Set custom event names using a specific method ID, i.e., you can specify the ID value of the method.| +| needPackageWithMethodMap | true | whether the methodMapping will be packaged into the APK during compilation. | + +### traceFilterFilePath Configuration Rules + +Currently, RheaTrace supports the following: + +``` +# Specify which package name clases' methods to instrument. +-allowpackage rhea/sample/android + +# Specify which package name clases' methods to instrument. +-allowpackage rhea/sample/android + +# Instrument methods related to locks. +-tracesynchronize + +# Instrument call points of Native methods. +-tracenative + +# Instrument Aidl methods. +-traceaidl + +# Instrument methods containing loops. +-traceloop + +# Disable instrumentation of time-consuming method calls by default. +-disabledefaultpreciseinstrumentation + +# Enable large method instrumentation, methods with a utility count exceeding 40. +-tracelargemethod 40 + +# The caller of this method needs to be instrumented. +-traceclassmethods rhea.sample.android.app.PreciseInstrumentationTest { + test +} + +# Methods annotated with this annotation need to be instrumented. +-tracemethodannotation org.greenrobot.eventbus.Subscribe + +# All methods of this Class will be instrumented. +-traceclass io.reactivex.internal.observers.LambdaObserver + +# The parameter information of this method will be retained in Trace. +-allowclassmethodswithparametervalues rhea.sample.android.app.RheaApplication { + printApplicationName(*java.lang.String); +} +``` + +When `-allowpackage` is configured, `-blockpackage` cannot be set arbitrarily. The package name configured in `-blockpackage` must start with the package name set in `-allowpackage` and must be its subpackage. + +For example, in the above case, since `-allowpackage` is set to 'rhea/sample/android', `-blockpackage` can only be set to the subpackage 'rhea/sample/android/test' under 'rhea/sample/android'. + +If you need to know the values of certain method parameters during the App's operation, `-allowclassmethodswithparametervalues` can help. As shown in the example above, configure the class name, method name, and method signature, and add an asterisk `*` before the parameter type description you are concerned with. If you are concerned with multiple parameter values, add an asterisk `*` to each. The effect is as follows: the data in the square brackets [rhea.sample.android.app.RheaApplication] represents the value of the parameter. + +``` + .sample.android-23670 [001] ...1 1388264.149291: tracing_mark_write: B|23670|RheaApplication:printApplicationName[rhea.sample.android.app.RheaApplication] + .sample.android-23670 [001] ...1 1388264.149391: tracing_mark_write: E|23670|RheaApplication:printApplicationName[rhea.sample.android.app.RheaApplication] +``` + +### applyMethodMappingFilePath Configuration Rules + +When the `traceWithMethodID` value is set to `true`, a `methodMapping` file will be generated in the `app/build/outputs` directory. The format is as follows: + +``` +1,17,rhea.sample.android.app.FirstFragment$onViewCreated$1 onClick (Landroid/view/View;)V +2,17,rhea.sample.android.app.SecondFragment$onViewCreated$1 onClick (Landroid/view/View;)V +3,4,rhea.sample.android.app.RheaApplication attachBaseContext (Landroid/content/Context;)V +4,1,rhea.sample.android.app.FirstFragment onCreateView (Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; +5,1,rhea.sample.android.app.MainActivity onCreateOptionsMenu (Landroid/view/Menu;)Z +6,1,rhea.sample.android.app.RheaApplication onCreate ()V +7,1,rhea.sample.android.app.FirstFragment onViewCreated (Landroid/view/View;Landroid/os/Bundle;)V +8,1,rhea.sample.android.app.MainActivity onOptionsItemSelected (Landroid/view/MenuItem;)Z +9,1,rhea.sample.android.app.MainActivity onWindowFocusChanged (Z)V +10,17,rhea.sample.android.app.MainActivity$onCreate$1 onClick (Landroid/view/View;)V +11,8,rhea.sample.android.app.MainActivity$onCreate$1 ()V +12,1,rhea.sample.android.app.SecondFragment onCreateView (Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; +13,1,rhea.sample.android.app.SecondFragment onViewCreated (Landroid/view/View;Landroid/os/Bundle;)V +1048574,1,android.os.Handler dispatchMessage (Landroid.os.Message;)V +``` + +The format is: `Method ID`, `Method accessFlag`, `Class Name`, `Method Name`, `Method Signature`, `Method Return Value`. You can configure the methods with a fixed ID according to the above format. \ No newline at end of file diff --git a/GRADLE_CONFIG.zh-CN.MD b/GRADLE_CONFIG.zh-CN.MD index 9fa1d11..234c016 100644 --- a/GRADLE_CONFIG.zh-CN.MD +++ b/GRADLE_CONFIG.zh-CN.MD @@ -1,48 +1,104 @@ ## Gradle 构建参数说明 -| 参数 | 默认值 | 说明 | -| ---- | ---- | ---- | -| **compilation** | NA | 与编译相关的配置。 | -|  traceWithMethodID | fasle | 为 App 中需要跟踪的方法设置 id 以此来跟踪此自定义事件,好处包括减少 APK 包体积增量以及性能提升。 | -|  traceFilterFilePath | null | 该文件配置决定哪些方法您不希望跟踪,详细用法见下文。| -|  applyMethodMappingFilePath | null | 用特指定方法 ID 来设置自定义事件名称,即您可以指定方法的 ID 值。| -| **runtime** | NA | 与 App 运行相关的配置。 | -|  mainThreadOnly | fasle | 仅在主线程抓取跟踪事件,如果您仅关心主线程 trace 数据,请将其置为 true。| -|  startWhenAppLaunch | true | 在 App 启动之初开始抓取跟踪事件,如果您做启动优化,建议将值保持为 true。 | -|  atraceBufferSize | "100000" | 指定内存存储 atrace 数据 ring buffer 的大小,如果其值过小会导致 trace 数据写入不完整,若您抓取多线程 trace 数据,建议将值设为百万左右量级;最小值为 1 万,最大值为 5 百万。| +| **参数** | **默认值** | **说明** | +| -------------------------- | --------- | ---------------------------------------------------------------------------------------------------------- | +| traceFilterFilePath | null | 该文件配置决定哪些方法您不希望跟踪,详细用法见下文。 | +| applyMethodMappingFilePath | null | 用特指定方法 ID 来设置自定义事件名称,即您可以指定方法的 ID 值。 | +| needPackageWithMethodMap | true | 默认编译时,将产物methodMap一起打进apk | ### traceFilterFilePath 配置规则 目前 RheaTrace 支持如下。 ``` +# 指定哪些包名下类的方法插桩。 + -allowpackage rhea/sample/android + +# 指定哪些包名下类的方法不插桩。 + -blockpackage rhea/sample/android/test + + +# 对锁相关的方法插桩 + +-tracesynchronize + + + +# 对Native方法的调用点插桩 + +-tracenative + + + +# 对Aidl方法插桩 + +-traceaidl + + + +# 对包含循环的方法插桩 + +-traceloop + + + +# 关闭默认耗时方法的调用插桩 + +-disabledefaultpreciseinstrumentation + + + +# 开启大方法插桩,方法效用数超过40 + +-tracelargemethod 40 + + + +# 该方法的调用方需要进行插桩 + +-traceclassmethods rhea.sample.android.app.PreciseInstrumentationTest { + + test + +} + + + +# 被该注解修饰的方法需要被插桩 + +-tracemethodannotation org.greenrobot.eventbus.Subscribe + + + +# 该Class的所有方法均会被插桩 + +-traceclass io.reactivex.internal.observers.LambdaObserver + + + +# 该方法的参数信息会在Trace中保留 + -allowclassmethodswithparametervalues rhea.sample.android.app.RheaApplication { + printApplicationName(*java.lang.String); -} --blockclassmethods rhea.sample.android.app.MainActivity { - onCreate(android.os.Bundle); } ``` -`-allowpackage`指定哪些包名下类的方法插桩。 - -`-blockpackage`指定哪些包名下类的方法**不**插桩。 当`-allowpackage`配置后,`-blockpackage`不能随意设置,`-blockpackage`包名设置必须以`-allowpackage`设置的包名开头,且必须是其子包。 如上述例子,`-allowpackage`设置了‘rhea/sample/android’,那么`-blockpackage`只能设置 ‘rhea/sample/android’ 下的子包 'rhea/sample/android/test'。 - 若您需要知道 App 运行过程中某些方法参数的值,那么`-allowclassmethodswithparametervalues`将助您一臂之力。如上示例,配置类名、方法名、方法签名,在您关注方法参数类型描述前加上`*`,若关注多个参数值,分别加上`*`即可。效果如下,中括号`[rhea.sample.android.app.RheaApplication]`中数据即表示参数的值。 ``` .sample.android-23670 [001] ...1 1388264.149291: tracing_mark_write: B|23670|RheaApplication:printApplicationName[rhea.sample.android.app.RheaApplication] + .sample.android-23670 [001] ...1 1388264.149391: tracing_mark_write: E|23670|RheaApplication:printApplicationName[rhea.sample.android.app.RheaApplication] ``` -RheaTrace 提供方法粒度的过滤规则`-blockclassmethods`,您可以配置指定方法不做插桩处理,比如一些高频函数或一定不耗时方法等。 ### applyMethodMappingFilePath 配置规则 @@ -50,19 +106,32 @@ RheaTrace 提供方法粒度的过滤规则`-blockclassmethods`,您可以配 ``` 1,17,rhea.sample.android.app.FirstFragment$onViewCreated$1 onClick (Landroid/view/View;)V + 2,17,rhea.sample.android.app.SecondFragment$onViewCreated$1 onClick (Landroid/view/View;)V + 3,4,rhea.sample.android.app.RheaApplication attachBaseContext (Landroid/content/Context;)V + 4,1,rhea.sample.android.app.FirstFragment onCreateView (Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; + 5,1,rhea.sample.android.app.MainActivity onCreateOptionsMenu (Landroid/view/Menu;)Z + 6,1,rhea.sample.android.app.RheaApplication onCreate ()V + 7,1,rhea.sample.android.app.FirstFragment onViewCreated (Landroid/view/View;Landroid/os/Bundle;)V + 8,1,rhea.sample.android.app.MainActivity onOptionsItemSelected (Landroid/view/MenuItem;)Z + 9,1,rhea.sample.android.app.MainActivity onWindowFocusChanged (Z)V + 10,17,rhea.sample.android.app.MainActivity$onCreate$1 onClick (Landroid/view/View;)V + 11,8,rhea.sample.android.app.MainActivity$onCreate$1 ()V + 12,1,rhea.sample.android.app.SecondFragment onCreateView (Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; + 13,1,rhea.sample.android.app.SecondFragment onViewCreated (Landroid/view/View;Landroid/os/Bundle;)V + 1048574,1,android.os.Handler dispatchMessage (Landroid.os.Message;)V ``` -其格式为:**方法 ID, 方法 accessFlag, 类名, 方法名, 方法签名, 方法返回值**,您按照如上格式配置需要固定 ID 的方法即可。 +其格式为:**方法 ID, 方法 accessFlag, 类名, 方法名, 方法签名, 方法返回值**,您按照如上格式配置需要固定 ID 的方法即可。 \ No newline at end of file diff --git a/INTRODUCTION.MD b/INTRODUCTION.MD index 8dabde9..0e00735 100644 --- a/INTRODUCTION.MD +++ b/INTRODUCTION.MD @@ -1,540 +1,461 @@ -## 介绍 +[重磅升级,btrace 2.0 技术原理大揭秘](INTRODUCTION.zh-CN.MD) -btrace(又名 RheaTrace)是抖音基础技术团队自研的一款高性能 Trace 工具,它基于 Systrace 实现,并针对 Systrace 不足之处加以改进,核心改进点如下。 +# Backgrounds -1. 效率提升:编译期间为 App 方法自动注入[自定义事件](https://developer.android.com/topic/performance/tracing/custom-events?hl=zh-cn),并提供高效、灵活配置规则。 -2. 性能提升:改进 Systrace 文件实时写 [atrace](https://perfetto.dev/docs/data-sources/atrace) 数据方式,性能提升最大 400 % 以上。 -3. 实用性提升:额外提供更详细 IO 数据,大幅提升方法耗时归因效率;使用独创方案彻底来解决方法因执行异常引起 trace 数据不闭合问题。 +Over a year ago, we formally open-sourced btrace (AKA RheaTrace), a high-performance trace tool based on Systrace. And now ByteDance has up to 20 apps using btrace for daily performance optimization work. During this year, we received a lot of feedback from the community and within the company. It's all about user experience, performance experience, and monitoring data. -目前字节跳动已有多款 App 接入,包括抖音、TikTok、今日头条、幸福里等均已接入 RheaTrace,并为其体验优化提供强有力支持。借助 RheaTrace 将为您的 App 带来极致流畅体验,RheaTrace 使用效果如下(因保密原则,每个方法用 ID 表示)。 +- **User experience:** PC script depends on Systrace and Python 2.7 environment, which makes the environment setup very complicated. The SDK also relies on external storage read/write permissions, which makes it difficult to use. The trace file is large in size and takes a long time to open. +- **Performance experience:** When the number of methods in application reaches millions, our performance loss is close to 100%, which poses a significant challenge for performance optimization work. +- **Monitoring data:** The trace is lacking sufficient information, making it difficult to analyze the causes of some time-consuming methods. For example, it currently only includes synchronized lock information and lacks information on other locks such as ReentrantLock. In addition, the rendering monitoring only includes default system information and lacks business logic information. -![](./assets/rheatrace_sample.png) +As the Android system evolves, Google gradually abandoned the Systrace tool and began promoting the Perfetto tool. At the same time, Android began to restrict sdcard read/write permissions, which caused compatibility issues for btrace on higher versions of the Android system. -## Systrace 概述 +Therefore, we have decided to revamp btrace to solve the most frequently and intensively reported issues by users, adapt to new features released by Google, and fix existing compatibility issues. The key improvements of btrace 2.0 are as follows: -### 简介 +- **User Experience:** Migrating the PC script from Python to Java, removing the SDK's requirement for sdcard read/write permission, and changing the Trace file format to the PB protocol, reducing the trace file size by 70%, and improving opening speed by 7 times! +- **Performance Experience:** Revamping the method Trace collection logic, switching data from strings to integers, reducing memory usage by 80%. Data storage is changed to mmap mode, optimizing lock-free queue logic, providing accurate instrumentation strategies, and further reducing performance loss to 15% under full instrumentation! +- **Monitoring Data:** Adding 4 new data monitoring capabilities, including detailed data on Rendering, Binder, thread creation, and Wait/Notify/Park/Unpark! -如果我们使用过 Systrace 分析应用性能,我们都知道 Systrace 提供 Category 配置让用户决定采集哪些系统 atrace 数据,如下命令,从 sched 开始后续是不同类别的 atrace 数据。 +Next, we will introduce their implementation principles to help you gain a deeper understanding of the important upgrades of btrace 2.0. -``` -python systrace.py -o mynewtrace.html sched freq idle am wm gfx view \ - binder_driver hal dalvik camera input res -``` - -atrace 的数据类型见下图。 +# Principles -![](./assets/atrace-category.png) +## About Perfetto -其中,用户空间 atrace 类型包括应用层自定义 Trace 事件、系统层 gfx 渲染相关 Trace、系统层锁相关 Trace 信息等,其最终都是通过调用Android SDK 提供 `Trace.beginSection` 或者 `ATRACE_BEGIN` 记录到同一个文件 `/sys/kernel/debug/tracing/trace_marker` 中。此节点允许用户层写入数据,`ftrace` 会记录该写入操作时间戳。当用户层发生函数调用时,`ftrace` 可以记录被跟踪函数的运行时间。atrace 若需记录用户层某一 trace 类型,只需激活对应 TAG 类型即可。如选择 `gfx`,则会激活 `ATRACE\_TAG\_GRAPHICS`,并将渲染事件记录到 `trace_marker` 文件中。 +Perfetto and Systrace are tools used for performance analysis and debugging in Android, but they differ in some ways: -内核空间的数据主要是一些补充分析数据,如 freq、sched、binder 等,常用 CPU 调度相关信息包括。 +- **Systrace:** is a tool in the Android SDK that can be used to capture and analyze timing events of different system processes. It provides a graphical interface for analyzing system performance bottlenecks. The events that Systrace can capture include CPU, memory, network, disk I/O, rendering, etc. The working principle of Systrace is to capture and parse timing events in the kernel and user space, and record them in HTML files. Developers can use the Chrome browser to analyze these events. Systrace can help developers identify system bottlenecks, but its performance is not ideal, especially when dealing with large amounts of data. +- **Perfetto:** is a new low-overhead trace collection tool designed to optimize the performance of Systrace. The goal of Perfetto is to provide faster and more granular trace collection than Systrace, and support integration with other cross-platform tools. Perfetto records trace data in binary format and uses a protobuf-based data exchange format for data export, which can be integrated with other analysis and visualization tools such as Grafana, SQLite, and BigQuery. Perfetto collects a wide range of data, including CPU usage, network byte streams, touch input, rendering, etc. Compared with Systrace, Perfetto is more excellent in performance and customization. -1. CPU 频率变化情况。 -2. 任务执行情况。 -3. 大小核调度情况。 -4. CPU Boost 调度情况。 +Therefore, it can be seen that Perfetto is a more advanced and excellent replacement tool for Systrace. It provides more powerful data collection and analysis capabilities, better performance, and better customization, providing developers with more comprehensive and in-depth performance analysis and debugging tools. -![](./assets/cpu-scheduler.png) +## Overall -关于图中一些标签释义。 +![](assets/arch_en.png) -1. CPU 使用率:右边柱状图越高,表明使用率越高。 -2. CPU 序号:标识 CPU 核心序号,表示该设备有 8 个核心,编号 0 -7。 -3. CPU 频率:右边对应的粉色柱状图表示其频率变化趋势。 -4. 调度任务:标识在该 CPU 核心上正在运行的任务,点击任务可查看其 ID、优先级等信息。 +The entire process is as follows: -这些信息 App 可以直接读取 `/sys/devices/system/cpu` 节点下相关信息获得,而另外一部分标识线程状态信息则只能通过系统或者 adb 才能获取,且这些信息不是统一节点控制,需要激活各自对应的事件节点,让 ftrace 记录下不同事件的 tracepoint。内核在运行时,根据节点的使能状态,会往 ftrace 缓冲中记录事件。 - -例如,激活线程调度状态信息记录,需要激活类似如下相关节点。 - -``` -events/sched/sched_switch/enable -events/sched/sched_wakeup/enable -``` +- **App Compilation:** During application compilation, our instrumentation supports two data types: Int and String. Int type is used to record method names, while String type can record parameter values. In addition, we have added an accurate instrument engine that can intelligently identify time-consuming code and perform instrumentation. +- **App Runtime:** During application runtime, efficient collection of function apptrace information is required. For Int type information, we collect it using mmap lock-free queue. For string type information, we directly write it into atrace using system functions. We also have a proxy atrace writing logic that replaces it with LFRB implementation for high-performance writing. +- **PC Script:** The PC script is used to control the application's operation and turn on/off the Trace function. The PC script also needs to encode the collected apptrace and atrace data, and merge them with the system's ftrace. -激活后,则可以获取到线程调度状态相关的信息,比如。 +## Detail -1. Running: 线程在正常执行代码逻辑。 -2. Runnable: 可执行状态,等待调度,如果长时间调度不到,说明 CPU 繁忙。 -3. Sleeping: 休眠,一般是在等待事件驱动。 -4. Uninterruptible Sleep: 不可中断的休眠,需要看 Args 描述来确定当时状态。 -5. Uninterruptible Sleep - Block I/O: IO 阻塞。 +### User Experience -![](./assets/thread-scheduler.png) +The user experience is the most frequently reported issue by users, mainly regarding storage permission, Systrace environment, Python environment, file size, and opening speed. We have completed optimizations to address these user experience issues. -最终,上述两大类事件记录都汇集到内核态同一缓冲中, Systrace 工具是通过指定抓取 trace 类别等参数,然后触发手机端 `/system/bin/atrace` 开启对应文件节点信息,接着 atrace 会读取 ftrace缓存,生成只包含 ftrace 信息的 atrace_raw 信息,最终通过脚本转换成可视化HTML文件,大致流程如下。 +#### 1. Removing Permissions Dependency -![](./assets/systrace_flow.png) +The PC script data processing requires access to App data, so storing the data on external SDCard for the script to retrieve via adb pull is the most convenient way. However, Android Q began limiting full external SDCard access. Although requestLegacyExternalStorage can temporarily avoid this problem, it is not a long-term solution. -### 源码分析 +To solve this problem, we created an HTTP server in the App to expose the data externally. However, script access still needed to determine an IP address. Therefore, we used the adb forward function, so we could use localhost to access the data. -Systrace 提供 `Trace#beginSection(String)` 和 `Trace.endSection()` 采集 atrace 数据,首先,我们大致了解下 atrace 工作原理,以 `android.os.Trace#beginSection` 作为分析入口。 +With the above solution, we solved the problem of reading App data. We also faced the problem of App reading script parameters, such as maxAppTraceBufferSize and mainThreadOnly. Through research, we discovered that we could set parameters for the mobile phone through adb setprop within the script. The app reads the parameters through __system_property_get. As long as the parameter property name starts with 'debug.', it will not face any permission issues. ``` -public static void beginSection(@NonNull String sectionName) { - if (isTagEnabled(TRACE_TAG_APP)) { - if (sectionName.length() > MAX_SECTION_NAME_LEN) { - throw new IllegalArgumentException("sectionName is too long"); - } - nativeTraceBegin(TRACE_TAG_APP, sectionName); - } -} -``` -`android.os.Trace#beginSection` 会调用 `nativeTraceBegin` 方法,该方法实现参考 [frameworks/base/core/jni/android\_os\_Trace.cpp](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/jni/android_os_Trace.cpp;l=60;bpv=1;bpt=1?q=nativeTraceBegin&ss=android%2Fplatform%2Fsuperproject) 。 +// set properties in PC scripts +Adb.call("shell", "setprop", "debug.rhea.startWhenAppLaunch", "1"); -``` -static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass, - jlong tag, jstring nameStr) { - withString(env, nameStr, [tag](char* str) { - atrace_begin(tag, str); - }); +// read properties in App +static jboolean JNI_startWhenAppLaunch(JNIEnv *env, jobject thiz) { + char value[PROP_VALUE_MAX]; + __system_property_get("debug.rhea.startWhenAppLaunch", value); + return value[0] == '1'; } ``` -`atrace_begin` 方法实现参考 [system/core/libcutils/include/cutils/trace.h](https://cs.android.com/android/platform/superproject/+/master:system/core/libcutils/include/cutils/trace.h;drc=master;bpv=1;bpt=1;l=158)。 -``` -#define ATRACE_BEGIN(name) atrace_begin(ATRACE_TAG, name) -static inline void atrace_begin(uint64_t tag, const char* name) -{ - if (CC_UNLIKELY(atrace_is_tag_enabled(tag))) { - void atrace_begin_body(const char*); - atrace_begin_body(name); - } +#### 2. Migrating Script Environment + +btrace 1.0 was developed based on Systrace, which had a dependency on Python 2.7. However, Python 2.7 has been officially deprecated, and most Android engineers are not familiar with Python, which can lead to wasting a lot of time solving environment problems. Therefore, we plan to switch from Systrace to Perfetto, which will no longer depend on Python 2.7. We have also rewritten the script in Java, which is a language that Android engineers are more familiar with. Now, users only need to have Java and adb environments available to easily use btrace 2.0. + +#### 3. Reducing Output File Size + +btrace 1.0 output files were HTML texts based on Systrace, which resulted in large file sizes and slow loading speeds. Perfetto supports the pb protocol, which, due to its structured data storage, can achieve smaller file sizes and faster parsing speeds. Therefore, btrace 2.0 also changed the data format from HTML to pb, significantly reducing the output file size while also greatly improving Trace loading speeds. + +We will briefly introduce the Perfetto pb data protocol and then explain how to encode the collected apptrace and atrace into the pb format and merge them with the system's ftrace. + +Perfetto pb consists of a series of TracePackets, of which FtraceEventBundle is one type used by btrace. FtraceEventBundle is a mechanism used by Android to collect system Trace data, consisting of a large number of FtraceEvents that can be used to record various system behaviors. btrace mainly uses its PrintFtraceEvent to record method information, as shown in the example below: + +``` +int threadId = 10011; +FtraceEventBundle.Builder bundle = FtraceEventBundle.newBuilder() + .addEvent( + FtraceEvent.newBuilder() + .setPid(threadId) // set kernal pid of thread, it's tid + .setTimestamp(System.nanoTime()) + .setPrint( + Ftrace.PrintFtraceEvent.newBuilder() + // buf format as B|$pid|$msg\n + // 10010 is pid. '\n' is required + .setBuf("B|10010|someEvent\n"))) + .addEvent( + FtraceEvent.newBuilder() + .setPid(threadId) + .setTimestamp(System.nanoTime() + TimeUnit.SECONDS.toNanos(2)) + .setPrint( + Ftrace.PrintFtraceEvent.newBuilder() + .setBuf("E|10010|\n"))) + .setCpu(0); +Trace trace = Trace.newBuilder() + .addPacket( + TracePacketOuterClass.TracePacket.newBuilder() + .setFtraceEvents(bundle)).build(); +try (FileOutputStream out = new FileOutputStream("demo.pb")) { + trace.writeTo(out); } ``` -`atrace_begin_body` 方法实现参考 [system/core/libcutils/trace-dev.cpp](https://cs.android.com/android/platform/superproject/+/master:system/core/libcutils/trace-dev.cpp?q=atrace_begin_body&ss=android%2Fplatform%2Fsuperproject)。 -``` -void atrace_begin_body(const char* name) -{ - WRITE_MSG("B|%d|", "%s", name, ""); +The example above will result in the following Trace: + +![](simple_pb.png) + +Next, we will introduce how the PC script converts collected apptrace information into pb format. First, the script retrieves the mmap file on the phone via adb http, and then reads its contents as follows: + +``` +// read the mapping, we have included it in the assets directory of the apk. +Map mapping = Mapping.get(); +// decode and save into result +List result = new ArrayList<>(); +byte[] bytes = FileUtils.readFileToByteArray(traceFile); +ByteBuffer buffer = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN); +while (buffer.hasRemaining()) { + long a = buffer.getLong(); + long b = buffer.getLong(); + // decode startTime / duration / tid / methodId + long startTime = a >>> 19; + long dur0 = a & 0x7FFFF; + long dur1 = (b >>> 38) & 0x3FFFFFF; + long dur = (dur0 << 26) + dur1; + int tid = (int) ((b >>> 23) & 0x7FFF); + int mid = (int) (b & 0x7FFFFF); + // record begin Frame and end Frame + result.add(new Frame(Frame.B, startTime, dur, pid, tid, mid, mapping)); + result.add(new Frame(Frame.E, startTime, dur, pid, tid, mid, mapping)); } +// sort by time +result.sort(Comparator.comparingLong(frame -> frame.time)); ``` -`atrace_begin_body` 最终实现在宏 [WRITE_MSG](https://cs.android.com/android/platform/superproject/+/master:system/core/libcutils/trace-dev.inc;l=25;drc=master;bpv=0;bpt=1) 实现,代码如下。 + +After that, we use the FtraceEventBundle to encode List. We will not go into the details of this here. The processing for atrace is also the same. + +Finally, we will introduce how to merge the collected apptrace, atrace, and system ftrace. As previously mentioned, Perfetto pb consists of a series of TracePackets. Therefore, all we need to do is to package the app's Trace into TracePackets separately and then add them to the system's TracePacket collection to complete the Trace merging. ``` -#define WRITE_MSG(format_begin, format_end, name, value) { \ - ... - write(atrace_marker_fd, buf, len); \ +Trace.Builder systemTrace = Trace.parseFrom(systraceStream).toBuilder(); +FtraceEventBundle.Builder bundle = ...; +for (int i = 0; i < events.size(); i++) { + bundle.addEvent(events.get(i).toEvent()); } +systemTrace.addPacket(TracePacket.newBuilder().setFtraceEvents(bundle).build()); ``` -通过 WRITE_MSG 实现,可知,atrace 数据是实时写入 fd 为 `atrace_marker_fd ` 的文件中,如果多线程同时写入,则会出现锁问题,导致性能损耗加大。 - -## RheaTrace 揭秘 -本文将从 RheaTrace 重点优势一一介绍。 - -### 效率提升 -RheaTrace 会在 App 编译期间自动插入 Trace 跟踪函数,大大提高效率。针对不同 Android Gradle Plugin 版本,我们支持 Proguard 之后插桩,这样可以减少 App 方法插桩量,同时也过滤 Empty、Set/Get 等简单方法。 - -> 思路基于[matrix-gradle-plugin](https://github.com/Tencent/matrix/tree/master/matrix/matrix-android/matrix-gradle-plugin) 大量改造实现。 +However, there is an assumption here that the apptrace/atrace timestamp is consistent with the system ftrace timestamp. In reality, according to test results, the ftrace timestamp on different devices may have different types, such as BOOTTIME or MONOTONIC TIME. This means that the app can only be compatible with some devices, regardless of which timestamp it uses. To solve this problem, we first record an initial BOOTTIME and MONOTONIC TIME when we start recording trace information. Then, when we record timestamps, we use MONOTONIC time consistently. Finally, when the PC script parses the ftrace timestamp, it determines whether to use MONOTONIC or BOOTTIME. If it is closer to MONOTONIC, we use MONOTONIC. Otherwise, we use BOOTTIME. We did not record BOOTTIME for each function, but we can convert it from MONOTONIC to the two types of timestamps' initial time difference. ``` -rheaTrace { - - compilation { - //为每个方法生成唯一 ID,若为 true,Trace#beginSection(String) 传入的是方法 ID。 - traceWithMethodID = true - //决定哪些包名下的类您不需要做性能跟踪。 - traceFilterFilePath = "${project.rootDir}/rhea-trace/traceFilter.txt" - //一些特定方法保持 ID 值固定不变。 - applyMethodMappingFilePath = "${project.rootDir}/rhea-trace/keep-method-id.txt" - } - runtime { - ...... - } +if (Math.abs(systemFtraceTime - monotonicTime) < Math.abs(systemFtraceTime - bootTime)) { + Log.d("System is monotonic time."); +} else { + long diff = bootTime - monotonicTime; + Log.d("System is BootTime. time diff is " + diff); + for (Event e: events) { + e.time += diff; + } } ``` -1. 为减少包体积、性能影响,我们也借鉴 matrix 慢函数思路,支持为每个函数生成唯一 ID,`traceWithMethodID` 为 true,`Trace#beginSection(String)` 传入的是方法 ID,不再是方法名。有时候我们想某些方法 ID 固定不变,同样借鉴 matrix 慢函数思路,我们提供`applyMethodMappingFilePath` 配置规则文件路径。 +### Performance Optimizaion -2. 为进一步减少 App 方法插桩量,我们提供 `traceFilterFilePath` 文件配置让您决定哪些包、类、方法不做自定义事件跟踪,关于其用法请参考 [RheaTrace Gradle Config](./GRADLE_CONFIG.zh-CN.MD)。 +#### 1. Trace Data Structure Optimization +btrace 1.0's instrumentation was dependent on the Systrace mode, which inserted Trace.beginSection and endSection at method entry and exit. However, the beginSection/endSection parameters were strings. This caused a memory occupancy of millions of strings for millions of methods, which put enormous pressure on memory. In addition, string data can only be recorded using locks or LFRB, which makes it difficult to achieve efficient and concurrent data writing. We can only store the data in a buffer, which can lead to data loss if the buffer is too small. If it is too large, it will waste memory. -### 性能提升 -在 Systrace 概述中,我们了解到 atrace 数据是实时写入文件,且存在多线程同时写入带来的锁问题。因此,我们采取策略是拿到 atrace 文件 fd,在 atrace 数据写入前,先将其写至 `LockFreeRingBuffer` 内存中,然后再将循环读取内存中 atrace 数据,写入我们定义的文件中。 +btrace 2.0's instrumentation supports int types, which means that method execution can be recorded in a mmap file. We use atomic operations to calculate the storage location each time, achieving a lock-free concurrent write, while int types occupy less memory, resulting in smaller intermediate file sizes. -首先我们通过 dlopen 获取 `libcutils.so` 对应句柄,通过对应 symbol 从中找到 `atrace_enabled_tags` 和 `atrace_marker_fd` 对应指针,设置 `atrace_enabled_tags` 用以打开 atrace,代码实现片段如下。 +Furthermore, we found that the thread ID and method ID were redundantly recorded at both method entry and exit. This also causes memory waste. Therefore, we optimized the recording to only store one record of start time, method consumption time, thread ID, and method ID at method exit, occupying only 2 longs, which can fully utilize memory. -``` -int32_t ATrace::InstallAtraceProbe() { - ...... - { - std::string lib_name("libcutils.so"); - std::string enabled_tags_sym("atrace_enabled_tags"); - std::string marker_fd_sym("atrace_marker_fd"); +Instrumentation logic can refer to the pseudocode: - ... - ... - atrace_marker_fd_ = reinterpret_cast( - dlsym(handle, marker_fd_sym.c_str())); - - if (atrace_marker_fd_ == nullptr) { - ALOGE("'atrace_marker_fd' is not defined"); - dlclose(handle); - return INSTALL_ATRACE_FAILED; - } - if (*atrace_marker_fd_ == -1) { - *atrace_marker_fd_ = kTracerMagicFd; - } - dlclose(handle); - return OK; - } ``` +// in application +public void appLogic() { + long begin = nativeTraceBegin(); + // buz logic + nativeTraceEnd(begin, 10010); +} -> 思路参考[profilo#installSystraceSnooper](https://github.com/facebookincubator/profilo/blob/master/cpp/atrace/Atrace.cpp),本文不做过多介绍。 - -接着,通过PLT Hook `libcutils.so` 中 write、write\_chk 方法,判定该方法传入 fd 是否与 atrace\_marker\_fd 一致,若一致则将 atrace 数据写入我们定义的文件中。 +// sdk tracing logic +long nativeTraceBegin() { + return nanoTime(); +} +void nativeTraceEnd(long begin, int mid) { + long dur = nanoTime() - begin; + int tid = gettid(); + write(begin, dur, tid, mid); +} ``` -ssize_t proxy_write(int fd, const void* buf, size_t count) { - BYTEHOOK_STACK_SCOPE(); - if (ATrace::Get().IsATrace(fd, count)) { - ATrace::Get().LogTrace(buf, count); - return count; - } - ... +Example of data recording format: - ATRACE_END(); - return ret; -} -``` +![](assets/mmap_data_structure_en.png) + +Java method instrumentation can only insert Java code, but mmap data collection requires C/C++ implementation. This requires the use of JNI calls, each of which requires a thread state switch and may involve GC lock operations. High-frequency JNI calls can have significant performance overhead. +The system also contains a large number of high-frequency JNI calls, but to solve this performance problem, it has been optimized to avoid thread state switching through the use of the @CriticalNative and @FastNative annotations. The @FastNative can improve the performance of native methods up to 2 times, while the @CriticalNative can improve it up to 4 times. -有时候,我们可能仅需要关注主线程 atrace 数据,如果能将子线程 atrace 数据过滤掉,那么整体性能将进一步提升。一种很简单的思路,就是将 `Trace#beginSection(String)` 包装一层,如下代码片段。 +We hope to use the system's optimization and add the @CriticalNative annotation to methods to speed up method calls. However, the @CriticalNative annotation is a hidden API that we cannot use directly. Therefore, we created a jar package that contains the CriticalNative annotation and depended on it in the project using the compileOnly method to achieve the purpose of using the @CriticalNative annotation. The annotation definition is copied from the system source code: ``` -static void t(String methodId) { - if (!isMainProcess) { - return; - } - if (mainThreadOnly) { - if (Thread.currentThread() == sMainThread) { - Trace.beginSection(methodId); - } - } else { - Trace.beginSection(methodId); - } -} +// ref: https://cs.android.com/android/platform/superproject/+/master:libcore/dalvik/src/main/java/dalvik/annotation/optimization/CriticalNative.java;l=26?q=criticalnative&sq= +@Retention(RetentionPolicy.CLASS) // Save memory, don't instantiate as an object at runtime. +@Target(ElementType.METHOD) +public @interface CriticalNative {} ``` -该方法仅能过滤我们为 App 方法插桩的 atrace 数据,系统层 atrace 数据无法过滤。 为更彻底实现仅采集主线程数据,我们通过 PLT Hook 代理 `atrace_begin_body` 和 `atrace_end_body`实现,在该方法进入前,判断当前线程 id 是否为主线程,如果不是,则不记录该条数据,代码实现片段如下。 + +Following is a usage example: ``` -void proxy_atrace_begin_body(const char *name) { - BYTEHOOK_STACK_SCOPE(); - if (gettid() == TraceProvider::Get().GetMainThreadId()) { - BYTEHOOK_CALL_PREV(proxy_atrace_begin_body, name); - } -} +// Java JNI methods,must be static,no synchronized,parameters must be primatives +@CriticalNative +public static long nativeTraceBegin(); -void proxy_atrace_end_body() { - BYTEHOOK_STACK_SCOPE(); - if (gettid() == TraceProvider::Get().GetMainThreadId()) { - BYTEHOOK_CALL_PREV(proxy_atrace_end_body); - } +// Critical JNI method,no JNIEnv* and jclass +static jlong Binary_nativeTraceBegin() { + ... } + +// register native dynamically +JNINativeMethod t = {"nativeTraceBegin", "(I)J", (void *) JNI_CriticalTraceBegin}; +env->RegisterNatives(clazz, &t, 1); ``` -针对降低性能损耗,RheaTrace 提供编译配置供用户选择,针对不同使用场景配置合理参数。 +@CriticalNative/@FastNative is a feature supported only on Android 8.0 and later. For devices before 8.0, we can use the '!' sign in the method signature to enable FastNative: ``` -rheaTrace { - ...... - - runtime { - mainThreadOnly false - startWhenAppLaunch true - atraceBufferSize "500000" - } +// Fast JNI, JNIEnv * and jclass is required +static jlong Binary_nativeTraceBegin(JNIEnv *, jclass) { + ... } + +// register jni methods +JNINativeMethod t = {"nativeTraceBegin", "!(I)J", (void *) Binary_nativeTraceBegin}; +env->RegisterNatives(clazz, &t, 1); ``` -上述配置释义如下。 -1. `mainThreadOnly `:为 true 表示仅采集主线程 trace 数据。 -2. `startWhenAppLaunch `:是否 App 启动开始就采集 trace 数据。 -3. `atraceBufferSize `:指定内存存储 atrace 数据个数 ring buffer 的大小,如果其值过小会导致 trace 数据写入不完整,若您抓取多线程 trace 数据,建议将值设为百万左右量级;最小值为 1 万,最大值为 5 百万。 +The optimization solution for int type data collection has been fully introduced. The data decoding process has already been explained in the previous text, so we will not elaborate on it here. + +#### 2. Accurate Instrumentation Engine -### 实用性提升 +Another important performance optimization is the instrumentation strategy optimization. As the number of methods in an application increases, the number of instrumented methods also increases, and over time, this will result in greater performance loss for the application. -针对已有的 atrace 数据,额外拓展 IO 等信息;另外为通过 Python 脚本彻底解决方法因执行异常导致 trace 数据不闭合问题,保证每个方法 trace 数据的准确性。 +In version 2.0, we hope to establish an intelligent rule set that can accurately identify time-consuming methods and only instrument time-consuming code. Therefore, we carried out an analysis. -#### IO 数据拓展 +Although the ART supports over 200 bytecode instructions, the instructions that may cause performance bottlenecks are often fewer, such as IO reading, synchronized bytecode, reflection, Gson parsing, and other function calls. During the compilation process, we treat methods that call these related instructions as suspected time-consuming methods, and we do not instrument the remaining non-time-consuming functions because they do not cause performance problems, thereby greatly reducing the instrumentation scope. -**背景介绍** +The following are some examples of time-consuming instructions: -在抖音启动性能优化时,我们曾统计冷启动的耗时,其中占比最长的是进程处于 D 状态(不可中断睡眠态,Uninterruptible Sleep ,通常我们用 PS 查看进程状态显示 D,因此俗称 D 状态)时间。此部分耗时占总启动耗时约 40%,进程为什么会被置于 D 状态呢?处于uninterruptible sleep 状态的进程通常是在等待 IO,比如磁盘 IO,其他外设 IO,正是因为得不到 IO 响应,进程才进入 uninterruptible sleep 状态,所以要想使进程从 uninterruptible sleep 状态恢复,就得使进程等待 IO 恢复,类似如下。 +| TYPES | INSTRUCTIONS | NOTES | +|---------------------------|-----------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Lock | monitorenter & monitorexit ;ACC_SYNCHRONIZED | Java lock keywords (e.g. synchronized, ReentrantLock, etc.) | +| Native methods | ACC_NATIVE | Due to the lack of byte code analysis for Native methods, we consider that they all may have potential performance issues. | +| Loops | goto | would be added to the "potential performance issues" list based on the specific situation. | +| Special Method Invocation | InvokeVirtual; InvokeSpecial; InvokeStatic; InvokeInterface; InvokeDynamic; | Here, we classify special method calls, most of which are from Android SDK: 1. IO related, file operations, so loading, dex loading, font loading, etc. 2. UI related, View layout, drawing, animation, etc. 3. IPC related, IPC interface. | +| Large Methods | InvokeVirtual; InvokeSpecial; InvokeStatic; InvokeInterface; InvokeDynamic; | If the number of byte code instructions called directly or indirectly in a method exceeds the threshold, it can be considered a CPU-intensive method that may have potential performance issues. | -![](./assets/uninterruptible-sleep.png) +Based on the above time-consuming instructions, we designed an accurate instrumentation engine that allows users to choose the instrumentation methods they need based on their specific situations. The supported configuration options are shown below: +``` +# Instrument lock-related methods +-tracesynchronize -但在使用 Systrace 进行优化时仅能得到如上内核态的调用状态,却无法得知具体的 IO 操作是什么。 +# Instrument Native method call +-tracenative -**方案介绍** +# Instrument Aidl methods +-traceaidl -因此,我们专门设计一套获取 IO 耗时信息方案,其包括用户空间和内核空间两部分。 +# Instrument methods that contain loops +-traceloop -一是在用户空间,为采集所需 IO 耗时信息,我们通过 PLT Hook IO 操作标准函数簇,包括 open,write,read,fsync,fdatasync 等,插入对应atrace 埋点用于统计对应的 IO 耗时,以 fsync 为例。 +# Disable instrumentation for time-consuming methods +-disabledefaultpreciseinstrumentation -![](./assets/io-fsync.png) +# Enable instrumentation for large methods with over 40 invocations +-tracelargemethod 40 -其对应 hook 代码逻辑如下。 +# Instrument the caller of configured method +-traceclassmethods rhea.sample.android.app.PreciseInstrumentationTest { + test +} -``` -int proxy_fsync(int fd) { - BYTEHOOK_STACK_SCOPE(); - ATRACE_BEGIN_VALUE("fsync:", FileInfo(fd).c_str()); +# Instrument methods annotated with this +-tracemethodannotation org.greenrobot.eventbus.Subscribe - int ret = BYTEHOOK_CALL_PREV(proxy_fsync, fd); +# Instrument all methods in this class +-traceclass io.reactivex.internal.observers.LambdaObserver - ATRACE_END(); - return ret; +# Preserve the parameter values of this method in Trace +-allowclassmethodswithparametervalues rhea.sample.android.app.RheaApplication { + printApplicationName(*java.lang.String); } ``` -二是在内核空间,除 systrace 或 atrace 可直接支持启用功能外,ftrace 还提供其他功能,并包含对调试性能问题至关重要的一些高级功能(需要 root 访问权限,通常也可能需要新内核)。我们基于此添加显示定制 IO 信息等功能,开启`/sys/kernel/debug/tracing/events/android_fs`节点下 ftrace 信息,用于收集 IO 相关的信息。内核空间 IO 信息是通过 python 脚本开启,详见 io_extender.py。 -#### 解决方法闭合错误问题 +After accurate instrumentation, the number of app instrumentations reduced by 94%, resulting in significant performance improvements while preserving relatively complete trace data. -**背景介绍** +In summary, by weighing the advantages and disadvantages of instrumenting time-consuming functions, we can obtain enough information on time-consuming functions while avoiding unnecessary performance losses caused by excessive instrumentation. -RheaTrace 会自动在每个方法入口、出口处分别插入 `Trace#beginSection(String)` 和 `Trace#endSection()` ,一个方法有且只有一个入口,但会有多个出口,方法出口对应的结束字节码指令有 return 和 throw 等。 +### New monitoring data -``` -public static void testCrash() { - try { - testA(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void testA() { - testB(); - testC(); - } +Monitoring data is at the core of Trace and determines whether Trace can bring practical value to users. In addition to method execution tracing, version 2.0 also brings four new capabilities: rendering monitoring, Binder monitoring, blocking monitoring, and thread creation monitoring. The following will introduce the relevant background and implementation principles. - public static void testB() { - int ret = 2 / 0; // <----- crash event - testD(ret); - } +#### 1. Rendering Monitoring - public static void testC() { - Log.d("btrace", "do some things."); - } +The Android system provides tracing points for RenderThread's crucial execution logic, but the information provided is not comprehensive enough to intuitively analyze the business code that specifically impacts rendering issues. The following picture is an example of a RenderThread trace captured by Atrace: - public static void testD(int num) { - Log.d("btrace", "box size: " + num); - } -``` +![](assets/render_simple.png) -上面的代码很简单,即 testCrash -> testA -> testB,其中 testB 出现异常,最终是在 testCrash 中捕获。通过本示例可知,testA、testB 方法出口均未正常执行完成,这也就导致 trace 数据不闭合,生成的 trace 数据如下,从中可以看出,`B` 和 `E` 数量上并不匹配,且仅从 trace 上看,我们也无法知道 `E` 属于哪个方法。 +To address this limitation, we have further expanded and refined this information by adding support for tracking critical View nodes related to rendering. The following picture shows the results of our optimizations: -``` -5108949.231989: B|28045| TestCrash:a -5108949.232055: B|28045| TestCrash:b -5108949.232554: B|28045| TestCrash:c -5108949.232580: E|28045 -``` +![](assets/render_detail.png) -**方案介绍** +The implementation principle as below: -为解决该问题,RheaTrace 做了取巧处理,方法的出口由插入 `Trace#endSection()` 改为 `Trace#beginSection(String)` 。那我们如何知道哪条 trace 是开始,哪条是结束?我们看如下示例。 +![](assets/render_principle.png) -``` -5108949.231989: B|28045|B:TestCrash:a -5108949.232055: B|28045|B:TestCrash:b -5108949.232554: B|28045|B:TestCrash:c -5108949.232580: B|28045|E:TestCrash:a -``` -如上 trace 数据,每个方法描述前都会加上 `B:` 或 `E`、`T`, `B:` 表示方法开始,`E` 表示方法 **retrun** 结束,`T` 表示方法 **throw** 结束。然后通过 Python 脚本处理并还原正常 trace 数据。如此做以后,我们就可以明确知道方法开始和结束,同时针对异常结束方法,我们会做补全处理,处理后的 trace 数据如下。 +1. So basically what this does is that it helps you get the layout information of a View when you inflate it using a special LayoutInflater. Then, it binds it to the native RenderNode by linking it to the View's RenderNode so that you can trace the layout information in the RenderNode's name field. +2. To make things simple, what you do is you hook up the important parts of the rendering process - RenderNode::prepareTreeImpl in SyncFrameState and RenderNodeDrawable::forceDraw in RenderPipeline. This lets you record the layout information of the View in the Trace, so you can keep track of it easily. -``` -5108949.231989: B|28045|TestCrash:a -5108949.232055: B|28045|TestCrash:b -5108949.232554: B|28045|TestCrash:c -5108949.232554: E|28045|TestCrash:c -5108949.232554: E|28045|TestCrash:b -5108949.232580: E|28045|TestCrash:a -``` -关于 Python 脚本的处理过程,本文不做过多介绍,大家可以阅读相关源码即可。 +#### 2. Binder Monitoring -## RheaTrace 工作流程 +The Binder information in the original atrace only includes information on binder transactions, lacking specific binder interface and names, which limits the effectiveness of problem diagnosis. For example, in the following image, we can not determine the specific Binder call: -RheaTrace 作为线下性能分析利器,我们首先看下其整体工作流程。 +![](assets/binder_no_name.png) -![](./assets/rheatrace-flow.jpeg) +The goal of btrace's Binder enhancement is to parse and display the interface and names of Binder calls, achieving the following result: -如上文介绍,我们将 Systrace 中 atrace 数据做拦截,将其转存至我们自定义的文件中。首先我们 Systrace 生成的 trace.html 中 atrace 数据格式。 +![](assets/binder_with_name.png) -``` - -0 (-----) [003] d.s3 1308823.803980: sched_waking: comm=kworker/3:0 pid=11120 prio=120 target_cpu=003 - -0 (-----) [003] d.s4 1308823.803986: sched_blocked_reason: pid=11120 iowait=0 caller=worker_thread+0x4fc/0x804 - TimerDispatch-704 ( 643) [001] .... 1308823.803988: tracing_mark_write: B|643|TimerIteration #9392 - -0 (-----) [003] dns4 1308823.803988: sched_wakeup: comm=kworker/3:0 pid=11120 prio=120 target_cpu=003 - TimerDispatch-704 ( 643) [001] .... 1308823.803992: tracing_mark_write: E|643 - -0 (-----) [003] d..2 1308823.803997: sched_switch: prev_comm=swapper/3 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/3:0 next_pid=11120 next_prio=120 - TimerDispatch-704 ( 643) [001] .... 1308823.804011: tracing_mark_write: C|643|VSP-mode|0 - TimerDispatch-704 ( 643) [001] .... 1308823.804014: tracing_mark_write: C|643|VSP-timePoint|405332069786762 - TimerDispatch-704 ( 643) [001] .... 1308823.804016: tracing_mark_write: C|643|VSP-prediction|405332075389317 - TimerDispatch-704 ( 643) [001] .... 1308823.804022: tracing_mark_write: B|643|app-alarm in:5602555 for vs:15880333 - TimerDispatch-704 ( 643) [001] .... 1308823.804024: tracing_mark_write: E|643 -``` -文本形式打开 trace.html,在其底部是填充的 trace 数据 ,如上所示数据片段,带有 `tracing_mark_write` 标签的即包含 atrace 数据。在 trace.html 文件中有关于 trace 格式介绍,如下数据片段。 +The core principle is to use plt hook to record the code of the binder call and the interfaceName in the Parcel& data parameter by IPCThreadState::transact. ``` -# tracer: nop -# -# entries-in-buffer/entries-written: 178063/178063 #P:8 -# -# _-----=> irqs-off -# / _----=> need-resched -# | / _---=> hardirq/softirq -# || / _--=> preempt-depth -# ||| / delay -# TASK-PID TGID CPU# |||| TIMESTAMP FUNCTION -# | | | | |||| | | - -0 (-----) [003] d.s2 1308814.493991: sched_waking: comm=rcu_preempt pid=9 prio=120 target_cpu=003 - -0 (-----) [000] d.s2 1308814.493997: sched_waking: comm=rcu_sched pid=10 prio=120 target_cpu=000 +status_t IPCThreadState::transact(int32_t handle, uint32_t code, const Parcel& data, + Parcel* reply, uint32_t flags); ``` -在 trace.html 中,一条完整的 atrace 数据为。 +However, the Parcel structure is not public, making it difficult to parse the interfaceName information from data. Therefore, we use hooking to record the interfaceName and Parcel association information through Parcel::writeInterfaceToken, and then obtain the interfaceName through querying in IPCThreadState::transact. ``` -.sample.android-19452 (19452) [005] .... 1308823.801863: tracing_mark_write: B|19452|activityStart -...... -.sample.android-19452 (19452) [005] .... 1308824.801753: tracing_mark_write: E|19452 -``` -在上文介绍 Systrace 时候,我们提到,`Trace#beginSection(String)` 和 `Trace.endSection()` 最终是调用如下宏。 +status_t Parcel::writeInterfaceToken(const char* interface) { + // pairing this Parcel and interface +} -``` -#define WRITE_MSG(format_begin, format_end, name, value) { \ - ... - write(atrace_marker_fd, buf, len); \ +status_t IPCThreadState::transact(int32_t handle, uint32_t code, const Parcel& data, + Parcel* reply, uint32_t flags) { + // query interface by Parcel& data + // trace into file + RHEA_ATRACE("binder transact[%s:%d]", name.c_str(), code); } ``` -其中,`write` 函数传入的 trace 数据为。 + +This records the following information, including the interfaceName and code: ``` -B|19452|activityStart -...... -E|19452 +binder transact[android.content.pm.IPackageManager:5] ``` -`B` 表示 Section 进入,`E` 表示 Section 退出,从以上数据片段可以看出,相较于 trace.html 中 atrace 数据少了很多信息,缺少的信息是内核补全。 -Systrace 工具中 `--from-file` 是可以将原始 atrace 数据转化为可视化的 html 文件。因此,针对 atrace 数据我们需要补全缺少的信息。结合前面介绍的 trace 格式说明及多次验证,可被 Systrace 工具识别的 atrace 文件格式满足如下。 +In addition, it is necessary to parse the code to the corresponding Binder call method. In AIDL, the interfaceName$Stub class's static field records each code and the corresponding Binder call name. At the end of capturing the trace, the mapping between code and name can be obtained through reflection and saved to outputs. ``` -- [001] ...1 : trace_mark_write:|| +#android.os.IHintManager +TRANSACTION_createHintSession:1 +TRANSACTION_getHintSessionPreferredRate:2 +#miui.security.ISecurityManager +TRANSACTION_activityResume:27 +TRANSACTION_addAccessControlPass:6 ``` -格式说明: -1. ``:线程名,若为主线程,可指定为包名。 -2. ``:线程ID。 -3. `