এই নির্দেশিকা SDV প্ল্যাটফর্মে রান করা পরিষেবা ও অ্যাপ্লিকেশন ডিবাগ করার জন্য প্রয়োজনীয় টুল ও টেকনিকের ওভারভিউ প্রদান করে।
ডিভাইসের সাথে কানেক্ট করুন
ডিভাইসের সাথে কানেক্ট করা এবং ইন্টার্যাক্ট করার জন্য প্রাথমিক টুল হল
Android ডিবাগ ব্রিজ (adb)। adb আপনার সিস্টেমের পাথে আছে কিনা তা যাচাই করুন।
নেটওয়ার্ক ব্যবহার করে কানেক্ট করুন
ডিভাইসটি একই নেটওয়ার্কে থাকলে এবং আপনি সেটির IP অ্যাড্রেস জানলে, আপনি ইথারনেটের মাধ্যমে কানেক্ট করতে পারবেন। আমাদের সিস্টেম adb-এর জন্য শুধুমাত্র নেটওয়ার্ক কানেকশন ব্যবহার করে:
# Connect to the device using its IP address and default port
adb connect <device_ip_address>:5555
একাধিক ডিভাইসের সাথে কানেক্ট করুন
একটি ওয়ার্কস্টেশন থেকে একাধিক ডিভাইস ম্যানেজ করতে, আপনি বিভিন্ন IP অ্যাড্রেসের মাধ্যমে সেগুলির সাথে কানেক্ট করতে পারবেন। আপনি একটি হোস্টে একাধিক VM চালালে, আপনাকে প্রতিটি ডিভাইসে আলাদা পোর্ট অ্যাসাইন করতে হবে। এর জন্য প্রতিটি SDV ডিভাইসে adb ডেমন কনফিগার করতে হবে যাতে অনন্য পোর্টে শোনা যায়, যেমন, প্রথম ডিভাইসের জন্য ৫৫৫৫ এবং দ্বিতীয়টির জন্য ৫৫৫৬। এছাড়াও, আপনি হোস্টকে কনফিগার করতে পারেন যাতে সেগুলি বিভিন্ন অতিথির কাছে পোর্ট ফরওয়ার্ড করে:
# 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 কমান্ড রান করার সময়, সম্পূর্ণ অ্যাড্রেস (ip:port) সহ -s ফ্ল্যাগ ব্যবহার করে
নির্দিষ্ট ডিভাইস টার্গেট করতে পারবেন:
# 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 for Platform থেকে
ডিবাগার অ্যাটাচ করতে, ডিবাগ ও পরীক্ষা করুন এবং
প্ল্যাটফর্ম কোড ডিবাগ করুন দেখুন):
রুট অনুমতি সহ
adbরিস্টার্ট করুন (পোর্ট ফরওয়ার্ড করার জন্য প্রয়োজন):adb rootবাইনারিতে ডিবাগিং সিম্বল থাকলে,
out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE]থেকে আনস্ট্রিপড ভার্সন পুশ করুন। যেমন,system_extএবংsdv_core_cfথেকেrpcagentআপলোড করতে, এটি রান করুন:adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmplldbclient.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রান করুন।
ক্র্যাশ ডাম্প (টুম্বস্টোন) বিশ্লেষণ করা
কোনও পরিষেবা ক্র্যাশ করলে, /data/tombstones/-এ একটি টুম্বস্টোন ফাইল তৈরি হয়।
ফাইলে স্ট্যাক ট্রেস, মেমরি ম্যাপ এবং অন্যান্য গুরুত্বপূর্ণ তথ্য থাকে।
টুম্বস্টোন ফাইলটি পুল করুন, তারপর বাইনারির আনস্ট্রিপড ভার্সনের সাথে এটি বিশ্লেষণ করতে একটি সিম্বল-অ্যাওয়ার টুল (যেমন lldb বা একটি
ডেডিকেটেড স্ক্রিপ্ট) ব্যবহার করুন।
পারফর্ম্যান্স বিশ্লেষণ করুন
SDV-তে পারফর্ম্যান্স পরিমাপ করার জন্য একাধিক টুল আছে।
সিপিইউ ও মেমরির ব্যবহার চেক করা
top: CPU ব্যবহারের ভিত্তিতে সাজানো, চলমান প্রসেসের রিয়েল-টাইম ভিউ প্রদান করে।adb shell top -m 10 # Show top 10 processesprocrank: নির্দিষ্ট প্রসেস বা সম্পূর্ণ সিস্টেমের জন্য মেমরির ব্যবহারের বিস্তারিত ব্রেকডাউন প্রদান করে।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 ব্যবহার করুন
Android-এ সিস্টেম-ব্যাপী ট্রেসিংয়ের জন্য Perfetto হল স্ট্যান্ডার্ড টুল। Perfetto আপনাকে সিস্টেম ইভেন্ট, অ্যাপ-লেভেল ট্রেস পয়েন্ট এবং পারফর্ম্যান্স কাউন্টার রেকর্ড করতে এবং টাইমলাইনে সেগুলি দেখতে দেয়।
গুরুত্বপূর্ণ ধাপ:
- আপনার C++ বা Rust কোডে ট্রেস পয়েন্ট যোগ করুন:
- C++:
TRACE_EVENTম্যাক্রো সহ Perfetto SDK ব্যবহার করুন। - Rust:
tracingক্রেট ব্যবহার করুন, যা Perfetto-র সাথে মানানসই ATrace ইভেন্ট এমিট করে।
- C++:
- ডেটা সোর্স (যেমন,
ftrace,track_event), বিভাগ এবং ট্যাগ নির্দিষ্ট করতে একটি textproto কনফিগারেশন ফাইল তৈরি করুন। - ডিভাইস থেকে ট্রেস ক্যাপচার করতে আপনার কনফিগারেশন ফাইলের সাথে
record_android_traceস্ক্রিপ্ট (external/perfetto/tools/record_android_trace) ব্যবহার করুন। - সিস্টেমের আচরণ বিশ্লেষণ করতে, বাধা শনাক্ত করতে এবং পরিষেবার ইন্টার্যাকশন বুঝতে Perfetto Web UI-তে জেনারেট করা ট্রেস ফাইল খুলুন।
ইনস্ট্রুমেন্টেশন, কনফিগারেশন ও সংগ্রহের ব্যাপারে বিস্তারিত নির্দেশাবলীর জন্য, সিস্টেম পারফর্ম্যান্স সম্পর্কে ইনসাইট পেতে ট্রেসিং ব্যবহার করুন দেখুন।
প্রোফাইলিংয়ের জন্য Simpleperf ব্যবহার করুন
Simpleperf হল Android-এ পারফর্ম্যান্স প্রোফাইলিংয়ের জন্য একটি বহুমুখী কমান্ড-লাইন টুল, যা Linux perf-এর মতো।
সাধারণ ব্যবহারিক ক্ষেত্র:
- সিপিইউ প্রোফাইলিং: সবচেয়ে বেশি সিপিইউ টাইম ব্যবহার করা ফাংশন শনাক্ত করা।
- অফ-সিপিইউ বিশ্লেষণ: থ্রেড কেন স্লিপিং বা ব্লক করা আছে তা বিশ্লেষণ করুন।
- হার্ডওয়্যার কাউন্টার: হার্ডওয়্যার পারফর্ম্যান্স কাউন্টার অ্যাক্সেস করুন।
কমান্ডের উদাহরণ:
# 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 ডিনায়াল
লক্ষণ: আপনার পরিষেবা চালু করতে, ফাইল অ্যাক্সেস করতে বা কোনও ক্ষমতা ব্যবহার করতে ব্যর্থ হয়,
এবং আপনি dmesg বা logcat-এ একটি avc: denied মেসেজ দেখতে পান।
[ 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
সমাধান: প্রত্যাখ্যানের মেসেজে Android সোর্স ট্রি থেকে audit2allow টুল। এটি আপনার ডিভাইসের SELinux কনফিগারেশনে যোগ করার জন্য সঠিক .te নীতি সংক্রান্ত নিয়ম তৈরি করে।