این راهنما نمای کلیای از ابزارها و تکنیکهای ضروری برای اشکالزدایی سرویسها و برنامههایی که در پلاتفرم «خودرو نرمافزارمحور» اجرا میشوند ارائه میدهد.
متصل شدن به دستگاه
ابزار اصلی برای اتصال به دستگاه و تعامل با آن
پل اشکالزدایی Android (adb) است. مطمئن شوید adb در مسیر سیستم شما قرار دارد.
اتصال بااستفاده از شبکه
اگر دستگاه در همان شبکه باشد و نشانی IP آن را بدانید، میتوانید ازطریق اترنت متصل شوید. سیستم ما منحصراً از اتصالات شبکه برای adb استفاده میکند:
# Connect to the device using its IP address and default port
adb connect <device_ip_address>:5555
اتصال به چند دستگاه
برای مدیریت چندین دستگاه از یک ایستگاه کاری، میتوانید ازطریق نشانیهای IP مختلف به آنها متصل شوید. اگر چند ماشین مجازی را روی یک میزبان اجرا میکنید، باید درگاههای مختلفی را به هر دستگاه اختصاص دهید. این کار مستلزم پیکربندی کردن دیمون adb در هر دستگاه SDV است تا به درگاه یکتایی گوش دهد، برای مثال، ۵۵۵۵ برای دستگاه اول و ۵۵۵۶ برای دستگاه دوم. همچنین میتوانید میزبان را برای بازارسال آن درگاهها به مهمانان مختلف پیکربندی کنید:
# Connect to the first device
adb connect <device_1_ip_address>:5555
# Connect to a second device
adb connect <device_2_ip_address>:5555
# Connect to a second VM on first device on different port
adb connect <device_1_ip_address>:5556
# List all connected devices to verify
adb devices
وقتی فرمانهای adb بعدی را اجرا میکنید، میتوانید دستگاه خاصی را بااستفاده از پرچم -s با نشانی کامل آن (ip:port) هدف قرار دهید:
# Run a shell command on the second VM on first device in the above example
adb -s <device_1_ip_address>:5556 shell
مشاهده گزارشها
وقتی سرویسی ازکار میافتد یا رفتار غیرمنتظرهای دارد، ابتدا گزارشها را بررسی کنید.
استفاده از logcat (گزارشهای Android)
logcat گزارشهای مربوط به سرویسهای سیستم، عاملها، و بستههای سرویس را نمایش میدهد:
# View all logs in real-time
adb logcat
# Filter logs by a specific tag (e.g., the name of your service)
adb logcat -s MyServiceTag
# Filter logs by priority (V: Verbose, D: Debug, I: Info, W: Warn, E: Error, F: Fatal)
# This shows only Error and Fatal messages for a specific tag
adb logcat MyServiceTag:E *:S
# Clear old logs before viewing new ones
adb logcat -c && adb logcat
# Show all logs and return
adb logcat -d
# Color logs by level
adb logcat -v color
# Show timestamps as time since boot
adb logcat -v monotonic
استفاده از dmesg (گزارشهای هسته)
dmesg گزارشهای هسته Linux را نمایش میدهد. این برای اشکالزدایی موارد زیر بسیار مهم است:
- مشکلات سختافزار و درایور
- کرنل پنیک
- رد کردنهای SELinux (
avc: denied) - در logcat نیز نمایش داده میشود
# View all kernel messages
adb shell dmesg
# Follow kernel messages in real-time
adb shell dmesg -w
گزارشهای دسترسی در Cuttlefish
وقتی روی دستگاه مجازی Cuttlefish اجرا میکنید، میتوانید مستقیماً به فایلهای گزارش
از سیستم فایل دستگاه میزبان دسترسی داشته باشید. این ویژگی بهویژه زمانی مفید است که adb دردسترس نباشد. وقتی Cuttlefish را راهاندازی میکنید، همه مسیرهای اشکالزدایی را برونداد میکند و
همچنین میتوانید آنها را بااستفاده از cvd fleet برای همه نمونههای درحال اجرا جستجو کنید.
- Logcat (گزارشهای Android):
cuttlefish/instances/cvd-1/logs/logcat - گزارشهای هسته:
cuttlefish/instances/cvd-1/logs/kernel.log - گزارشهای راهانداز Cuttlefish:
cuttlefish/instances/cvd-1/logs/launcher.log(مفید برای اشکالزدایی خود محیط Cuttlefish)
میتوانید از ابزارهای خط فرمان استاندارد مانند cat، less، یا tail -f برای
مشاهده این فایلها در زمان واقعی استفاده کنید.
تعامل با پوسته و سیستم فایل
دسترسی به پوسته برای اجرای مستقیم فرمانها در دستگاه، بررسی وضعیت پردازش، و پیمایش سیستم فایل:
# Open an interactive shell on the device
adb shell
# From within the shell, you can check running processes
ps -A
# Or check the status of a specific service managed by init
getprop init.svc.<service_name>
اجرای عملیات سیستم فایل
از adb push و adb pull برای انتقال فایلها بین دستگاه میزبان و دستگاه استفاده کنید. از این مورد برای استقرار دستورگان آزمایشی، بهروزرسانی پیکربندی، یا بازیابی رونوشت خرابی استفاده کنید:
# Push a file from your computer to the device
adb push my_local_file.txt /data/local/tmp/
# Pull a file from the device to your computer
adb pull /data/tombstones/tombstone_00 .
اشکالزدایی برنامهها (C++/Rust)
میتوانید برنامهها را بهصورت آنلاین یا آفلاین اشکالزدایی کنید.
استفاده از lldb برای اشکالزدایی زنده
این مراحل را برای اشکالزدایی همزمان سرویس بااستفاده از lldb دنبال کنید (برای پیوست کردن
اشکالزدا از Android Studio برای پلاتفرم، به اشکالزدایی و آزمایش و
اشکالزدایی کد پلاتفرم مراجعه کنید):
بازراهاندازی
adbبا اجازههای ریشه (برای بازارسال درگاه لازم است):adb rootاگر باینری نمادهای اشکالزدایی دارد، نسخه حذفنشده را از
out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE]ارسال کنید. برای مثال، برای بارگذاریrpcagentازsystem_extوsdv_core_cf، این دستور را اجرا کنید:adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmpبااستفاده از اسکریپت راحتی
lldbclient.pyبه کارخواه LLDB متصل شوید:# Run and connect a binary on device, run on host: lldbclient.py -r /data/local/tmp/rpcagent # Connect to an existing process with PID 2759 lldbclient.py -p 2759این دستورگان
lldbرا از راه دور متصل میکند. برای همه پرچمهای دردسترس،lldbclient.py --helpرا اجرا کنید.
تجزیهوتحلیل رونوشتهای خرابی (سنگقبرها)
وقتی سرویسی ازکار میافتد، فایل tombstone در /data/tombstones/ ایجاد میشود.
این فایل حاوی ردیابی پشتهای، نقشه حافظه، و اطلاعات مهم دیگر است.
فایل tombstone را بکشید، سپس از ابزار آگاه از نماد (مانند lldb یا اسکریپت اختصاصی) برای تجزیهوتحلیل آن با نسخه حذفنشده باینری استفاده کنید.
تحلیل عملکرد
SDV از چندین ابزار برای اندازهگیری عملکرد پشتیبانی میکند.
بررسی استفاده از CPU و حافظه
top: نمای همزمان از فرایندهای درحال اجرا را که براساس میزان استفاده از واحد پردازش مرکزی مرتب شدهاند ارائه میدهد.adb shell top -m 10 # Show top 10 processes
procrank: تفکیک دقیقی از استفاده از حافظه برای یک فرایند خاص یا کل سیستم ارائه میدهد.adb shell procrank
استفاده از dumpsys برای وضعیت سرویس
dumpsys ابزاری قدرتمند برای پُرسمان وضعیت داخلی هر سرویس سیستم Android است.
# List all available services
adb shell dumpsys -l
# Dump the state of a specific service or agent
adb shell dumpsys <service_name>
استفاده از torq برای تحلیل عملکرد
torq ابزاری با رابط خط فرمان است که کارهای نمایهسازی و ردیابی را در Android ساده میکند. این گزینه امکان اجرای Simpleperf، Perfetto، و دیگر تکالیف معمول را درطول تجزیهوتحلیل عملکرد سیستم فراهم میکند.
استفاده از Perfetto برای ردیابی
Perfetto ابزار استاندارد برای ردیابی سراسری سیستم در Android است. Perfetto به شما امکان میدهد رویدادهای سیستم، نقاط ردیابی سطح برنامه، و شمارندههای عملکرد را ضبط کنید و آنها را در خط زمان تجسم کنید.
مراحل کلیدی:
- نقاط ردیابی را در کد C++ یا Rust خود اضافه کنید:
- C++: از کیت توسعه نرمافزار Perfetto با ماکروهای
TRACE_EVENTاستفاده کنید. - Rust: از جعبه
tracingاستفاده کنید که رویدادهای ATrace سازگار با Perfetto را منتشر میکند.
- C++: از کیت توسعه نرمافزار Perfetto با ماکروهای
- یک فایل پیکربندی textproto برای مشخص کردن منابع داده (برای مثال،
ftrace،track_event)، دستهها، و برچسبها ایجاد کنید. - از دستورات
record_android_trace(external/perfetto/tools/record_android_trace) با فایل پیکربندیتان استفاده کنید تا ردیابی را از دستگاه ضبط کنید. - فایل ردیابی تولیدشده را در رابط کاربری وب Perfetto باز کنید تا رفتار سیستم را تحلیل کنید، گلوگاهها را شناسایی کنید، و تعاملات سرویس را درک کنید.
برای دستورالعملهای دقیق درباره ابزار دقیق، پیکربندی، و جمعآوری، به استفاده از ردیابی برای کسب اطلاعات آماری درباره عملکرد سیستم مراجعه کنید.
استفاده از Simpleperf برای نمایهسازی
Simpleperf یک ابزار خط فرمان همهکاره برای نمایهسازی عملکرد در Android است، مشابه Linux perf.
موارد استفاده رایج:
- نمایهسازی واحد پردازش مرکزی: توابعی را که بیشترین زمان واحد پردازش مرکزی را مصرف میکنند شناسایی کنید.
- تجزیهوتحلیل غیرCPU: تجزیهوتحلیل کنید که چرا رشتهها در حالت خواب یا مسدود هستند.
- شمارندههای سختافزاری: به شمارندههای عملکرد سختافزار دسترسی پیدا کنید.
نمونه فرمانها:
# Go to simpleperf scripts
cd system/extras/simpleperf/scripts
# Profile system for 20 seconds and record call graph
./app_profiler.py --system_wide -r "--call-graph fp --duration 20"
# Record a profile for a specific process (PID 1)
./app_profiler.py --pid 1 -r "--call-graph fp --duration 5"
# Pull the profile data
adb pull /data/local/tmp/perf.data .
# Generate a report with symbol resolution
./report_html.py --add_source_code --source_dirs $ANDROID_BUILD_TOP --add_disassembly -o report.html
Simpleperf رویدادها و گزینههای بسیار بیشتری ارائه میدهد. برای اسناد جامع، به راهنمای Simpleperf مراجعه کنید.
رد کردنهای SELinux
نشانه: سرویس شما شروع نمیشود، به فایلی دسترسی ندارد، یا از قابلیتی استفاده نمیکند،
و پیام avc: denied را در dmesg یا logcat میبینید.
[ 123.456] avc: denied { read } for pid=789 comm="my_service" name="some_file" dev="sda1" ino=123 scontext=u:r:my_service_t:s0 tcontext=u:object_r:some_file_t:s0 tclass=file permissive=0
اشکالزدایی سریع (فقط برای توسعه)
میتوانید اجرای SELinux را موقتاً غیرفعال کنید تا ببینید مشکل برطرف میشود یا نه. این موضوع تأیید میکند که مشکل بهدلیل نبود قانون خطمشی SELinux است.
# Disabling SELinux requires root permission
adb root
# Set SELinux to permissive mode
adb shell setenforce 0
# Check the current mode (should return "Permissive")
adb shell getenforce
رفع مشکل: ابزار audit2allow از درخت منبع Android در پیام رد. با این کار، قانون خطمشی .te صحیح برای افزودن به پیکربندی SELinux دستگاهتان تولید میشود.