টুল ও পারফর্ম্যান্স

Trace me if you can: Automated instrumentation and field profiling

স্পিকার

  • রাহুল রবিকুমার

    স্টাফ সফ্টওয়্যার ইঞ্জিনিয়ার

সম্পর্কে

টক সম্পর্কে

Android অ্যাপ অপ্টিমাইজ করার জন্য কনকারেন্ট ওয়ার্কফ্লো ও কোরুটিন সাসপেনশন সম্পর্কে গভীর জ্ঞান থাকা প্রয়োজন।

লোকাল প্রোফাইলিং একটি উপযোগী স্ন্যাপশট অফার করলেও, ওভারহেড ছাড়াই প্রোডাকশনে এইসব ইনসাইট স্কেল করা একটি চ্যালেঞ্জ।

এই সেশনটি ক্রমাগত পারফর্ম্যান্স ফিডব্যাক লুপের জন্য একটি আর্কিটেকচারাল ব্লুপ্রিন্ট প্রদান করে।

androidx.tracing 2.0: ব্যাকএন্ড ডাইনামিকভাবে সোয়াপ করুন এবং থ্রেড জুড়ে কোরুটিন কনটেক্সট (Perfetto ফ্লো) প্রোপাগেট করুন।

স্মার্ট ইন্সট্রুমেন্টেশন: হটস্পট খুঁজে পেতে লোকাল ART ট্রেসিং ব্যবহার করুন, তারপর কম-ওভারহেড ট্রেস পয়েন্টের ইনজেকশন অটোমেট করুন।

ম্যাক্রোবেঞ্চমার্কিং: CI-তে ফিজিক্যাল ডিভাইসে রিগ্রেশন ট্র্যাক করুন এবং পারফর্ম্যান্সের উন্নতি যাচাই করুন।

ফিল্ড ট্রেসিং: ProfilingManager-এর মাধ্যমে লোকাল ও CI ট্রেসিংয়ের বাইরে যান।

সারাংশ

  • Tracing 2.0 পুরনো Android tracing API-কে সরিয়ে দেয় যাতে লেবেলের দৈর্ঘ্যের সীমা সরানো যায় এবং সাত গুণ দ্রুত কাজ করা যায়। এছাড়াও, এটি আপনাকে OpenTelemetry-এর মতো ব্যাকএন্ডের জন্য কাস্টম সিঙ্ক তৈরি করতে দেয়।
  • কন্টেক্সট প্রোপাগেশন থ্রেড, কোরুটিন এবং প্রসেস জুড়ে কার্যকারণ সম্পর্ক ম্যাপ করে। আপনি traceCoroutine-এর মাধ্যমে অ্যাসিঙ্ক্রোনাস এক্সিকিউশন ট্র্যাক করতে পারেন অথবা কলব্যাক-ভিত্তিক কোডে প্রোপাগেশন টোকেন পাস করতে পারেন।
  • Jetpack Compose 1.13-এ Recomposition Tracing যোগ করা হয়েছে, যা কাস্টম মেটাডেটা ব্যবহার করে দেখায় যে কেন recomposition হয়। ট্রেস পরিবর্তিত স্টেট ভ্যালু এবং সঠিক কল স্ট্যাক রেকর্ড করে যা তাদের ট্রিগার করেছে।
  • Android বিল্ড টুল, বাধা শনাক্ত করতে এবং বিল্ডের গতি বাড়াতে Tracing 2.0 ব্যবহার করে। ট্রেসিং গাইডেড অপ্টিমাইজেশন যা R8 কোড সঙ্কুচিত করা ২৫% দ্রুত করেছে এবং মেটালাভা পোস্ট-সাবমিট করার সময় ১৫% কমিয়েছে।

Gemini Notebook

বিষয়

  • ট্রেসিং
  • android-performance
  • perfetto
  • context-propagation
  • jetpack-compose
  • coroutines
  • প্রোফাইলিং

ট্রান্সস্ক্রিপ্ট করা

Android ট্রেসিংয়ের ভূমিকা ও বিবর্তন

  • রাহুল রবিকুমার

    শুভ অপরাহ্ন, সবাইকে।

  • আমার নাম রাহুল।

  • আমি Android Developer Experience টিমের একজন ইঞ্জিনিয়ার।

  • আমি অ্যাপ ও লাইব্রেরির পারফর্ম্যান্সের উপর ফোকাস করি এবং এই আলোচনা ট্রেসিং সম্পর্কে।

  • ট্রেসিং সম্পর্কে বিস্তারিত জানার আগে, আমি কিছু শেয়ার করা শব্দভাণ্ডার তৈরি করতে চাই যাতে আপনি বুঝতে পারেন।

  • তাই, এই আলোচনায় আমি যখনই ট্রেসিংয়ের কথা বলব, তখন আমি এক্সপ্লিসিট ট্রেসিংয়ের কথা বলছি, ম্যানুয়ালি কোড ইনস্ট্রুমেন্ট করা যাতে আপনি জানতে পারেন অ্যাপটি কী করছে।

  • আমি অটোমেটিক প্রোফাইলারের কথা বলছি না, আমি অন্য কিছু বলতে চাইছি।

  • তাই ম্যানুয়াল ট্রেসিং হল আপনার কোড বেসে ব্রেডক্রাম্ব রেখে যাওয়ার আর্ট, যাতে পারফর্ম্যান্স সংক্রান্ত সমস্যা বা অন্য কোনও সমস্যা হলে আপনি পরে এর কারণ বুঝতে পারেন।

  • এটি সাধারণত লগের চেয়ে অনেক ভালো।

  • তাই, আমি জানি না যে আপনি কোনও বড় অ্যাপের Logcat আউটপুট দেখেছেন কিনা।

  • এটি সাধারণত টেক্সটের একটি বিশাল প্রাচীর যা আপনি খুব সহজে বুঝতে পারবেন না।

  • অন্যদিকে, ট্রেসিং অনেক বেশি ভালো।

  • এটি ভিজ্যুয়ালাইজ করা আরও সহজ।

  • আপনার কাছে সময়সীমা আছে।

  • আপনার কাছে কিছু স্ট্রাকচার আছে।

  • আপনার কাছে কিছু টুলিং আছে, তাই আপনি এমনকি স্লাইস এবং ডাইস করতে পারেন এবং ঠিক কখন কী ঘটেছে তা দেখতে পারেন।

  • তাই এটি অনেক বেশি সুন্দর।

  • এবং আপনি, আপনার এজেন্টদের একটি ট্রেসে নির্দেশ করতে পারেন এবং বলতে পারেন, প্রশ্ন জিজ্ঞাসা করুন।

  • আপনি ট্রেস প্রসেসর, বেঞ্চমার্কের মতো টুল ব্যবহার করতে পারেন এবং এমনকি আপনার ট্রেসকে মেট্রিক্সে রূপান্তর করতে পারেন।

  • সুতরাং, এগুলি হল এমন সব জিনিস যা আপনি ট্রেসের মাধ্যমে করতে পারেন, যা Logcat-এর মাধ্যমে করা কঠিন।

  • অন্যদিকে, প্রোফাইলিং—এবং আমি স্বয়ংক্রিয় প্রোফাইলিংয়ের কথা বলছি—সাধারণত এমন কোনো সমস্যার প্রতিক্রিয়া হিসেবে করা হয়, যা সম্পর্কে আপনি অবগত।

  • যেমন, আপনি হয়ত লক্ষ্য করেছেন যে আপনার অ্যাপ স্লো শুরু হচ্ছে বা কিছু একটা সমস্যা হচ্ছে এবং আপনি সমস্যাটি আরও ভালভাবে বুঝতে চান এবং কী হচ্ছে তা খুঁজে বের করতে চান।

  • এই পর্যায়ে, আপনাকে সাহায্য করার জন্য আগে থেকে ম্যানুয়াল ট্রেস না থাকলে, অটোমেটিক প্রোফাইলিংয়ের প্রয়োজন হয়।

  • আপনি ART মেথড ট্রেসিংয়ের মতো কিছু ব্যবহার করতে পারেন যেখানে আপনি প্রতিটি মেথড এন্ট্রি ও এক্সিট ইন্সট্রুমেন্ট করছেন।

  • অথবা, আপনি Simpleperf-এর মতো টুল ব্যবহার করে স্ট্যাক স্যাম্পলিং দেখতে পারেন।

  • তাই, প্রতিটি মেথড এন্ট্রি ও এক্সিট ব্যবহার করে ওভারহেড বাড়ানোর পরিবর্তে, আপনি কল স্ট্যাক স্যাম্পেল দেখেন এবং আপনার অ্যাপের হট পাথে কী আছে তা দেখেন।

  • এটি ২০২৬ সাল, RAM-এর সমস্যা সর্বত্র, তাই আপনি মেমরি, মেমরি লিক এবং হিপ প্রোফাইল দেখছেন।

  • সুতরাং, এটি আরও একটি প্রোফাইলার যার সুবিধা আপনি নিতে পারেন।

  • আপনি হিপ রিটেনশন পাথ দেখতে পারেন।

  • কোন কোড মেমরি বরাদ্দ করছে তা আপনি দেখতে পারবেন এবং এগুলি হল সব ধরনের বিশ্লেষণ যা আপনি এর মাধ্যমে করতে পারবেন।

  • ডানে।

  • এখন, আমাদের কাছে সেই শব্দভাণ্ডার আছে।

  • তাহলে, এখন আমরা কেন নতুন লাইব্রেরি তৈরি করেছি সেই বিষয়ে আলোচনা করা যাক।

  • ট্রেসিং API, 1.0 API মূলত Android Jelly Bean-এ চালু করা হয়েছিল।

  • সেটা ২০১২ সালের ঘটনা।

  • সেটি ১৪ বছরেরও বেশি আগে।

  • সেই থেকে, API-গুলি আপনি যতটা ভাবছেন ততটা উন্নত হয়নি।

  • আমরা কিছু এক্সটেনশন যোগ করেছি।

  • Android 10-এ অ্যাসিঙ্ক ইভেন্ট ও কাউন্টার যোগ করা হয়েছে।

  • সেটা ২০১৯ সালে হয়েছিল।

  • আর এটাই ছিল।

  • তারপর থেকে API-তে কোনও পরিবর্তন করা হয়নি।

  • তবে, ইকোসিস্টেমটি অনেক উন্নত হয়েছে।

  • তাই, প্ল্যাটফর্ম ট্রেসিং অনেক উন্নত হয়েছে, কিন্তু এর কোনওটিই আপনার জন্য API যোগ করার ক্ষেত্রে কার্যকর হয়নি।

  • আমরা এটি পরিবর্তন করতে চাই।

  • অন্য বড় সমস্যা হল, ট্রেসিংয়ের ক্ষেত্রে 1.0-এ একটি নির্দিষ্ট ট্রেসিং ব্যাক এন্ড থাকে, যার অর্থ হল, আপনি যখনই আপনার কোডে একটি ট্রেস বিভাগ যোগ করেন, এটি সর্বদা সিস্টেম ট্রেস বাফারে শেষ হয়।

  • Atrace হল Android ট্রেসিং সাবসিস্টেম যা সেই ডেটার মালিক।

  • তাই, আপনি যদি ট্রেস নিয়ে ফিল্ড টেলিমেট্রিতে কনভার্ট করতে চান, তাহলে সেটি করা খুবই কঠিন, কারণ এখন আপনাকে বুঝতে হবে যে atrace কীভাবে সেই ডেটা স্টোর করে।

  • এটি একটি ভালভাবে ডকুমেন্ট করা ফর্ম্যাট, তবে এটি ব্যবহার করা কঠিন হতে পারে।

  • তাই, আমরা এই সমস্যার সমাধান করতে চাই।

  • তাই, আমরা আপনাকে এমন টুল দিতে চাই যার সাহায্যে আপনি যেখানে খুশি ট্রেসিং ডেটা নিয়ে যেতে পারবেন।

  • এছাড়াও, ট্রেসিং ১.০-এ বিধিনিষেধ ছিল যেখানে লেবেল ১২৮ অক্ষরের মধ্যে সীমাবদ্ধ ছিল।

  • ২০১২ সালে এই বিধিনিষেধ হয়তো যুক্তিযুক্ত ছিল, কিন্তু ২০২৬ সালে এটি অদ্ভুত বলে মনে হয়।

  • সবচেয়ে খারাপ বিষয় হল, আপনি ট্রেসে কোনও অতিরিক্ত মেটাডেটা যোগ করতে পারবেন না, যা আরও বেশি সমস্যাজনক।

  • আর তারপর, ওভারহেড খরচ তো আছেই।

  • তাই, আপনি যখনই আপনার অ্যাপ ট্রেস করছেন, আপনাকে ওভারহেড সম্পর্কে অত্যন্ত সচেতন হতে হবে, কারণ সিস্টেম পর্যবেক্ষণ করার কাজটি সিস্টেমের ব্যাকগ্রাউন্ডে কী করছে তা পরিবর্তন করা উচিত নয়।

  • তাই, আপনি যদি কোনও রেস কন্ডিশন রিপ্রোডিউস করতে চান, তাহলে ট্রেসিংয়ের ফলে রেস কন্ডিশন চলে যাওয়া উচিত নয়।

  • তাই, আপনি নিশ্চিত করতে চান যে আপনি অন্যথায় যা করছেন তার সমস্ত শব্দার্থবিদ্যা সংরক্ষণ করছেন।

  • Tracing 1.0-এর ওভারহেড তুলনামূলকভাবে বেশি ছিল এবং আমরা সেটি উন্নত করতে চেয়েছিলাম।

  • ঠিক আছে।

  • আমি সমস্যাগুলি নিয়ে অনেক কথা বলেছি।

  • এখন, আসুন কিছু সমস্যা ভিজ্যুয়ালি দেখি এবং বাস্তবে সেগুলি কীভাবে জটিল হয়ে ওঠে তা বুঝি।

  • তাহলে, এখানে আমাদের কাছে একটি Perfetto ট্রেস আছে।

  • এটি com.example.app অ্যাপের জন্য।

  • আমাদের একটি প্রধান থ্রেড আছে এবং initializeComponent নামে একটি সিঙ্গেল স্লাইস আছে।

  • এখন, আদর্শগতভাবে, আমরা আরও কিছু বিবরণ চাই।

  • তাই, আসুন একটি বিবরণ যোগ করি।

  • তাহলে এখন আমরা জানি যে initializeComponent, performInitialize-কে কল করে।

  • কোন কম্পোনেন্ট শুরু করা হচ্ছে তা আমরা এখনও জানি না।

  • এখন, Tracing 1-এর সাথে আমাদের টুল বেল্টের একমাত্র টুল হল নাম, তাই আমরা এটিকে স্লাইসের নামে যোগ করি।

  • মনে রাখবেন, ট্রেসিং স্লাইসের নাম ১২৮ অক্ষরের মধ্যে হতে হবে, তাই আপনার ট্রেসে এটি ছোট করে দেখানো হয়।

  • Now, to add insult to injury, the overhead of truncating is also now overhead that you incur when you're tracing.

  • তাই এখন, আপনি খুব দ্রুত এই সমস্যার সম্মুখীন হন।

  • তাই, এই সমস্যাটি আমরা সত্যিই সমাধান করতে চেয়েছিলাম।

  • আপনি Perfetto ট্রেস দেখেছেন এবং এটি দেখতে কেমন তা আপনি দেখেছেন।

  • এখন, সেই ট্রেস বিভাগগুলি নির্গত করার জন্য কোড লেখার দৃষ্টিকোণ থেকে দেখা যাক।

  • আবার, আমাদের কাছে initializeComponent API আছে।

  • এটি একটি প্রসঙ্গ এবং একটি নাম নেয়, performInitialize কল করে।

  • এখনও পর্যন্ত, সব ঠিক আছে।

  • এখন, আমরা Tracing 1.0 API-এর সাহায্যে একটি ট্রেস যোগ করতে চাই, তাই আপনি androidx.tracing.trace ইমপোর্ট করে এবং একটি ট্রেস ব্লক ব্যবহার করে তা করতে পারেন।

  • আপনি এটির একটি নাম দিন।

  • এখানে, এটি হল performInitialize।

  • কিন্তু আমরা আগে যেমন করতে চেয়েছিলাম, আমরা কম্পোনেন্টের নাম জানতে চেয়েছিলাম, তাই আমরা Kotlin-এর স্ট্রিং ইন্টারপোলেশন ব্যবহার করব এবং নাম যোগ করব।

  • এবং এখানে প্রথম সমস্যাটি রয়েছে।

  • তাই, এখানে আমাদের ১২৮-অক্ষরের সীমা আছে।

ট্রেসিং ২.০ ও পারফর্ম্যান্সের ওভারভিউ

  • রাহুল রবিকুমার

    আমরা Tracing 2-এর মাধ্যমে এটি ঠিক করতে পারি।

  • androidx.tracing.trace-এর পরিবর্তে আপনি Tracer ব্যবহার করেন।

  • API-টি দেখতে উল্লেখযোগ্যভাবে একই রকম।

  • আপনার কাছে trace-এর পরিবর্তে Tracer.global.trace আছে।

  • আপনার একটি বিভাগ আছে।

  • আমরা পরে বিভাগ সম্পর্কে আরও বিস্তারিত আলোচনা করব, তবে মূলত, আপনার একটি নাম আছে।

  • এবং তারপরেও, আপনি যে কোডের ব্লক ট্রেস করার চেষ্টা করছেন সেটি এখনও আপনার কাছে আছে।

  • এখন, আপনার কাছে ১২৮-অক্ষরের সীমা আর নেই।

  • আমি ট্রেসিং ওভারহেড সম্পর্কে কথা বলেছি।

  • আমি আরও একটু বিস্তারিতভাবে জানতে চাই এবং দেখতে চাই যে আমরা কীভাবে এটিকে উন্নত করেছি।

  • Android 16-এ চলা Pixel 6a-তে, একটি শুরু ও শেষ বিভাগ যোগ করতে প্রায় ১,২০০ ন্যানোসেকেন্ড সময় লেগেছে।

  • এখন, এটি খুব বেশি বলে মনে নাও হতে পারে, তবে আপনার কাছে যদি সত্যিই হট কোড থাকে যা অনেক ট্রেস বিভাগ যোগ করছে, তাহলে এটি এমন সময় যা আপনার অ্যাপ অন্যথায় ফ্রেম রেন্ডার করার জন্য ব্যয় করতে পারে।

  • তাই, আমরা আপনার সেই সময় নষ্ট করতে চাই না।

  • আমরা AndroidX Perfetto SDK-এর মাধ্যমে অনেক কিছু উন্নত করেছি।

  • এটি একটি পরীক্ষামূলক SDK যা আমরা কম্পোজিশন ট্রেসিংয়ের জন্য চালু করেছি এবং এটি আসলে পরিস্থিতির অনেক উন্নতি করেছে।

  • এখন, আমরা সত্যিই কখনই চাইনি যে আপনি এটি শিপ করুন কারণ এটি JNI বাইন্ডিং সহ Perfetto C SDK এবং C SDK আপনার APK-এর মধ্যে প্রায় ৪ এমবি।

  • আমরা কখনই চাইনি যে আপনি এই ধরনের প্রোডাক্ট শিপ করুন।

  • তাই, এখন Tracing 2-এর সাথে, আমাদের কাছে একটি উদ্দেশ্য-নির্মিত লাইব্রেরি রয়েছে।

  • আমরা ওভারহেড আরও অনেক উন্নত করেছি এবং এখন আপনি জেনে খুশি হবেন যে Tracing 2 হল ৭ গুণ দ্রুত, যার অর্থ হল আপনি যা করতে চেয়েছিলেন তা করার জন্য আপনার কাছে আরও বেশি সময় আছে এবং আপনি জানেন, ইনফ্রা কম সময় নেয়।

  • এরকম কিছু কী সম্ভব করে তোলে যা আগে সম্ভব ছিল না?

  • তাই, Metro-র রানটাইম ট্রেসিং ফিচার হল এর একটি উদাহরণ।

  • সুতরাং, Metro, যারা জানেন না তাদের জন্য, একটি ডিপেন্ডেন্সি ইনজেকশন লাইব্রেরি।

  • এটি Kotlin Multiplatform-এ কাজ করে।

  • এটি Kotlin কম্পাইলার প্লাগ-ইন ব্যবহার করে।

  • এটি ডিপেন্ডেন্সি ইনজেকশনের জন্য সব কোড জেনারেট করে এবং Tracing 2.0-এর সাথে ইন্টিগ্রেট করে যাতে আপনার কোডে প্রতিটি @Inject-এর খরচ ভিজ্যুয়ালাইজ করা আরও সহজ হয়।

  • তাই, এখানে একটি উদাহরণ দেওয়া হল।

  • ধরা যাক, আমাদের কাছে একটি অ্যাপ গ্রাফ আছে।

  • Metro-তে, সবকিছু একটি গ্রাফে স্কোপ করা হয় এবং তাই আমাদের একটি ফিল্ড আছে, AnalyticsTracker।

  • এছাড়াও আমাদের কাছে একটি প্রদানকারী বাইন্ডিং আছে।

  • আমাদের কাছে impl হিসেবে OkHttpClient সহ একটি নেটওয়ার্ক ক্লায়েন্ট আছে এবং তারপরে AnalyticsTracker-এর ইমপ্লিমেন্টেশন AnalyticsTrackerImpl থেকে আসে এবং আমাদের নেটওয়ার্ক ক্লায়েন্টের একটি ইনস্ট্যান্স প্রয়োজন, যা গ্রাফ জানে কীভাবে প্রদান করতে হয়।

  • তাই, ব্যাকগ্রাউন্ডে, কম্পাইলার প্লাগ-ইন এমন কোড জেনারেট করে যা দেখতে এইরকম হয়।

  • তাই, আপনার কাছে AnalyticsTracker থাকলে, গেটার নেটওয়ার্ক ক্লায়েন্টের একটি ইনস্ট্যান্স তৈরি করে এবং AnalyticsTrackerImpl-এর কনস্ট্রাক্টরে এটি পাস করে, যা ভাল।

  • কিন্তু এখন ট্রেসিং চালু থাকার কারণে, আপনি শুধু ট্র্যাকার ইমপ্লিমেন্টেশন নয়, এর জন্য প্রয়োজনীয় প্রতিটি ডিপেন্ডেন্সি তৈরি করার খরচ দেখতে পাবেন।

  • তাই এখন, আমরা আপনার জন্য শুধু টাইপ ইনস্ট্যান্টিয়েশনের খরচই নয়, ট্রেসে এর সমস্ত ডিপেন্ডেন্সিও দেখার সুবিধা প্রদান করি এবং এটি সত্যিই শক্তিশালী।

  • তাই, এই তথ্য ব্যবহার করে, Wise, যা একটি ফাইন্যান্স অ্যাপ, তাদের অ্যাপ স্টার্টআপ ৪৫% উন্নত করেছে।

  • অ্যাপ স্টার্টআপের সময় যেসব জিনিস শুরু করার প্রয়োজন ছিল না, সেগুলি তারা স্থগিত করতে পেরেছিলেন এবং তারা কিছু ভুলভাবে স্কোপ করা আইটেমও শনাক্ত করেছিলেন, যেখানে যেসব জিনিস সিঙ্গলটন হওয়া উচিত ছিল, সেগুলি আসলে দুর্ঘটনাবশত সিঙ্গলটন ছিল না এবং এগুলি এমন জিনিস যা আপনি দেখতে এবং আপনার কোডে সহজেই ঠিক করতে পারবেন।

  • তাদের স্টার্টআপ মেট্রিক্স দেখলে বোঝা যায় যে তারা সত্যিই খুব ভালো কাজ করছে।

  • তারা শুধু প্রাথমিক ফ্রেমের সময় উন্নত করেনি, সম্পূর্ণ ডিসপ্লের সময়ও উন্নত করেছে।

  • অন্য পার্টনার, BandLab, CI-তে একই তথ্য ব্যবহার করে।

  • তাই, আপনি শুধু প্রতিটি @Inject বাইন্ডিংয়ের খরচই জানতে পারবেন না, কোন থ্রেডের জন্য সেই খরচ হয়েছে তাও জানতে পারবেন।

  • সুতরাং, আপনি একবার এটি জানতে পারলে, আপনি প্রধান থ্রেডে সমস্ত ব্যয়বহুল @Inject বাইন্ডিং খুঁজে পেতে পারেন এবং আপনার CI-তে, আপনি একটি কোয়েরি চালাতে পারেন, আরে, আমাকে সমস্ত ব্যয়বহুল বাইন্ডিংয়ের একটি তালিকা দিন এবং তারপরে এটি যে পরিবর্তনটি তাদের প্রবর্তন করেছে তার জন্য দায়ী করুন এবং তারপরে আপনি এখন প্রকৃত পরিবর্তনকে দায়ী করতে পারেন এবং এটি ঠিক করার চেষ্টা করতে পারেন।

কনটেক্সট প্রোপাগেশন, কোরুটিন ও Jetpack Compose

  • রাহুল রবিকুমার

    ঠিক আছে।

  • এখনও পর্যন্ত, আমি Tracing 1-এর তুলনায় আমরা যেসব জিনিস উন্নত করেছি সেই সম্পর্কে কথা বলেছি, তবে এখন আমি Tracing 2-এর নতুন ফিচার সম্পর্কে কথা বলতে চলেছি যা আগে কখনও সম্ভব ছিল না।

  • তাই, মূল ফিচারগুলির মধ্যে একটিকে বলা হয় কনটেক্সট প্রোপাগেশন এবং যেহেতু আধুনিক অ্যাপগুলি আরও জটিল হয়ে উঠছে, তাই ওয়ার্কলোড একাধিক থ্রেড, একাধিক কোরুটিন এবং একাধিক প্রসেস জুড়ে চলে।

  • আপনি প্রতিটি থ্রেড বনাম প্রসেসের মধ্যে কীভাবে অনুরোধ প্রোপাগেট করে তা ভিজ্যুয়ালাইজ করতে চান।

  • আর এটাই কনটেক্সট প্রোপাগেশন সম্ভব করে তোলে।

  • তাই, আমি যদি আপনাকে শুধু স্লাইসের একটি তালিকা দিই এবং কী কারণে কী ঘটেছে সে সম্পর্কে কিছু না বলি, তাহলে সেগুলি উপযোগী হলেও, সেগুলি সম্পর্কে যুক্তি দেওয়া খুব সহজ নয়।

  • কিন্তু এর পরিবর্তে আমি যদি আপনাকে বলি যে এটি ছিল ঘটিত ইভেন্টের কার্যকারণ শৃঙ্খল, তাহলে আপনার পক্ষে কী ঘটছে তা বোঝা এবং তারপরে প্রতিটি স্লাইসের খরচ অ্যাসোসিয়েট করা অনেক সহজ হবে।

  • Context Propagation-এর মাধ্যমে এটি উপলভ্য হয়।

  • আপনি জেনে খুশি হবেন যে কনটেক্সট প্রোপাগেশন সম্পূর্ণভাবে কাজ করে এবং তাই এখানে একটি বাস্তব উদাহরণ দেওয়া হল।

  • com.example.app Perfetto ট্রেস আবার দেখলে, ধরা যাক performInitialize অনেক বেশি সময় নিচ্ছে এবং আপনি খরচ পিছিয়ে দিতে বা অন্য থ্রেডে সরাতে চান।

  • এমন কিছু যা আপনি সম্পূর্ণভাবে করতে পারবেন।

  • তাহলে, ধরা যাক আমি performInitialize অন্য থ্রেডে সরিয়ে নিয়েছি।

  • এখন, আপনি স্লাইসের সেই হায়ারার্কিক্যাল প্রকৃতি হারিয়েছেন।

  • তাই, এখন আপনি আর বলতে পারবেন না যে initializeComponent-এর কারণে performInitialize হয়েছে, যদি না আপনি কোডটি দেখেন।

  • আদর্শ পরিস্থিতিতে, আপনি চাইবেন যে একটি তীরচিহ্ন আপনাকে বলুক যে A-এর কারণে B হয়েছে এবং তারপর আপনি ঘটনার কার্যকারণ সম্পর্ক নিয়ে যুক্তি সাজাতে পারবেন।

  • এমনকি আপনি হয়ত সিস্টেম ট্রেস দেখেছেন যেখানে আমরা প্ল্যাটফর্মে বাইন্ডার ট্রানজ্যাকশনের জন্য এটি করি।

  • সুতরাং, এখানে আপনি দেখতে পাচ্ছেন যে Compose বেঞ্চমার্ক একটি ফ্রেম প্রস্তুত করার জন্য system_server-এ একটি বাইন্ডার ট্রানজ্যাকশন করে।

  • সুতরাং, প্ল্যাটফর্ম ট্রেসিংয়ের দৃষ্টিকোণ থেকে এটি সবসময়ই সম্ভব, তবে আমরা অ্যাপ ডেভেলপারদের জন্য এই টুল কখনও উপলভ্য করিনি।

  • তাই এখন, Tracing 2.0-এ Kotlin coroutine Context Propagation সম্পূর্ণভাবে কাজ করে।

  • আপনাকে কিছু করতে হবে না।

  • আপনি এটি বক্স থেকে বের করে নিন।

  • সুতরাং, এখানে আমাদের কাছে fetchProfile নামে একটি সাসপেন্ড মেথড আছে।

  • এটি client.get কল করে, যা আরেকটি সাসপেন্ডিং পদ্ধতি এবং তারপরে, এটি উত্তর ডিসিরিয়ালাইজ করার জন্য Dispatchers.Default-এ সুইচ করে।

  • খুবই সাধারণ কো-রুটিন কোড, এমন কিছু যা আপনি সম্ভবত প্রতিদিন ব্যবহার করেন।

  • এখন, ধরা যাক আমরা এটি ট্রেস করতে চাই।

  • আমরা একটি ট্রেস বিভাগ যোগ করি।

  • তাই এখানে, ট্রেসের পরিবর্তে, আমরা traceCoroutine API ব্যবহার করব কারণ এটি কোডের একটি সাসপেন্ডিং ব্লক এবং তারপরে, Dispatchers.Default-এ কনটেক্সট সুইচ করার আগে ইনার কলের জন্য, আমরা একই traceCoroutine API ব্যবহার করে আরেকটি ইনার ট্রেস বিভাগ যোগ করব।

  • এখন, ট্রেসে, আপনি এই ধরনের কিছু দেখতে পাবেন।

  • আপনি দেখতে পাবেন যে আমাদের কাজ worker-1-এ শুরু হয়েছে এবং তারপরে, এটি আসলে কনটেক্সট-সুইচ করে worker-3-এ চলে গেছে এবং আপনি ট্রেসে সহায়ক তীর দেখতে পাবেন যা এটি নির্দেশ করে।

  • শুধু তাই নয়, আপনি যদি মাঝের বর্গক্ষেত্রে জুম-ইন করেন, তাহলে দেখতে পাবেন যে deserialize আসলে worker-1-এ শুরু হয়েছে এবং withContext-এ কল করার কারণে কনটেক্সট সুইচ হয়েছে এবং তারপর, এটি worker-3-এ চলতে থাকে এবং তারপর, fetchProfile worker-3-এ আবার শুরু হয় কারণ coroutines মেশিনারি কনটেক্সট সুইচের সংখ্যা কমাতে চায়।

  • আপনি ঠিক কখন একটি কোরুটিন সাসপেন্ড করা হয়েছে, কখন এটি আবার শুরু হয়েছে তা দেখতে পারবেন এবং আপনি ইভেন্টের সম্পূর্ণ কার্যকারণ চেইন দেখতে পারবেন।

  • Tracing 2-এর মাধ্যমে আরেকটি জিনিস করা সম্ভব, সেটি হল ট্রেসে কাস্টম মেটাডেটা যোগ করার সুবিধা।

  • অতীতে, আপনার কাছে একমাত্র টুল ছিল ট্রেস বিভাগের নাম, কিন্তু এখন এর সাথে আপনি মেটাডেটা ব্লক যোগ করতে পারবেন যা আপনাকে যত খুশি মেটাডেটা এন্ট্রি যোগ করতে দেয়।

  • এবং আপনি সেটি ট্রেসে যোগ করতে পারবেন।

  • আপনি যখন আসল ট্রেস দেখবেন, তখন এখানে দেখতে পাবেন যে আপনার যোগ করা সব মেটাডেটা আসলে ট্রেসে রয়েছে যাতে সব টুল তা ব্যবহার করতে পারে।

  • তাই এখন, আপনি যা জানেন, আপনি সবসময় যে অতিরিক্ত তথ্য দিতে চেয়েছিলেন তা এম্বেড করতে পারেন।

  • আমি আপনাকে ট্রেসিংয়ের মাধ্যমে সম্ভব এমন কিছু অ্যাবস্ট্রাক্ট ফিচার সম্পর্কে বলেছি, তবে এই সবকিছুর মধ্যে সবচেয়ে উল্লেখযোগ্য হল Jetpack Compose-এর একটি নতুন ফিচার, যার নাম Recomposition Tracing।

  • এটি Compose 1.13-এর অংশ হিসেবে শিপ করা হয়েছে, তাই এটি আজই ব্যবহার করার জন্য রেডি।

  • তাই, এখানে একটি উদাহরণ দেওয়া হল।

  • এটি হল কম্পোজিশন ট্রেসিং, যার সাথে আপনারা সবাই সম্ভবত পরিচিত।

  • Compose-এর প্রথম দিন থেকেই এটি আছে।

  • এটি আপনাকে একটি কম্পোজেবল এবং এর সমস্ত, আপনি জানেন, সাবস্লাইসের আপেক্ষিক খরচ এবং যে থ্রেডে সেগুলি ঘটছে তার প্রতিটির খরচ সম্পর্কে জানায়।

  • তাহলে, এটি খুবই সহজ।

  • এটি আপনাকে যা বলে না তা হল প্রসঙ্গ।

  • এটি কেন হয়েছে তা আপনাকে জানানো হয় না।

  • এটি আপনাকে বলে না যে কেন জিনিসগুলি পুনরায় কম্পোজ করা হয়েছে।

  • সুতরাং, আমি যদি জুম আউট করি, তাহলে আমরা আগের স্লাইডে যে অঞ্চলটি দেখছিলাম সেটিই হল আগ্রহের অঞ্চল।

  • এবং বাঁদিকে, আপনি দেখতে পাবেন যে একটি ডিসপ্যাচ ইনপুট ইভেন্ট ঘটেছে।

  • হয়ত এর ফলে কিছু স্টেট পরিবর্তিত হয়েছে এবং হয়ত এর ফলে রিকম্পোজিশন হয়েছে।

  • তবে এটি অস্পষ্ট।

  • আপনি নিশ্চিতভাবে জানেন না।

  • তবে, রিকম্পোজিশন ট্রেসিংয়ের মাধ্যমে, এখন আমরা ট্রেসে কাস্টম মেটাডেটা যোগ করি যা আপনাকে ঠিক কেন রিকম্পোজিশন হয়েছে তা জানায়।

  • শুধু তাই নয়, এখন আপনি খুব সহজেই বলতে পারবেন যে এই ইভেন্টগুলি একে অপরের সাথে সম্পর্কিত।

  • তারপর, আপনি সেটিতে ক্লিক করলে, ঠিক কোন স্ট্যাটাস পরিবর্তন হয়েছে তা আপনাকে জানানো হবে।

  • এটি আপনাকে বলবে যে এটি একটি স্টেট ছিল, এটি একটি পরিবর্তনযোগ্য স্টেট ভ্যালু ছিল যা মিথ্যাতে পরিবর্তন করা হয়েছিল, যা আগে সত্য ছিল।

  • শুধু তাই নয়, আমরা আপনাকে সেই কল স্ট্যাকের কথাও জানাবো যার কারণে এটি হয়েছে।

  • সুতরাং, এখানে আপনি দেখতে পাচ্ছেন যে, AbstractClickableNode.performClick ঘটেছে, যার ফলে পরিবর্তনযোগ্য স্টেট পরিবর্তিত হয়েছে, যার ফলে রিকম্পোজিশন ঘটেছে।

  • তাই, এটি সত্যিই খুব ভালো, এমন কিছু যা আমরা আগে করতে পারিনি।

  • এইসব টুলও উপলভ্য, দুঃখিত, এই সব কার্যকারিতাও নতুন Android Performance Analyzer টুলে উপলভ্য, আপনি যদি কিছু এজেন্টিক টুল ব্যবহার করে দেখতে চান।

  • এবং ডানদিকে।

  • তাই, আমি আপনাকে বলেছি যে Kotlin coroutines-এর জন্য কনটেক্সট প্রোপাগেশন সম্পূর্ণভাবে কাজ করে।

  • কিন্তু কো-রুটিন ও নন-কো-রুটিন কোডের মিশ্রণ ব্যবহার করে এমন কোডের ক্ষেত্রে কী হবে, অথবা আপনি যদি নিজেই থ্রেড চালান, অথবা আপনার কাছে যদি এমন কোনও ব্রাউনফিল্ড কোড থাকে যা অনেক পুরনো এবং কোনও কারণে কলব্যাক ব্যবহার করে?

  • ঠিক আছে।

  • তাই, সুখবর হল, আপনি এখনও সেখানে প্রসঙ্গ প্রচারের সমস্ত সুবিধা পেতে পারেন।

  • তাহলে, ধরা যাক আমাদের কাছে, আপনি জানেন, একটি ব্রাউনফিল্ড API আছে যা একটি কলব্যাক এবং একটি এক্সিকিউটর ব্যবহার করে।

  • প্রয়োগটি executor.execute ব্যবহার করে, runCatching কল করে, যা প্রয়োগের বিবরণ, উত্তর পায় এবং তারপর উত্তর সম্পর্কে কলব্যাককে জানায়।

  • ঠিক আছে।

  • এখন, আমি যদি এটি ট্রেস করতে চাই, তাহলে আমি Tracer.global.trace করব, এটিকে একটি লেবেল দেব এবং তারপরে ব্লকটি ঘিরে ফেলব।

  • তবে, আমি যেহেতু ইভেন্টের কার্যকারণ সম্পর্কও বজায় রাখতে চাই, তাই আমি একটি নতুন, ঐচ্ছিক ধরন গ্রহণ করব, যাকে প্রোপাগেশন টোকেন বলা হয়।

  • আর আমি যা করব তা হল, আমি শুধু টোকেনটি ইনার ট্রেস API-তে পাস করব।

  • তাই, যে কেউ এই পদ্ধতি কল করলে, তিনি আমাকে প্রোপাগেশন টোকেন দিতে পারেন, যাতে আমি ঘটা ইভেন্টের কার্যকারণ চেইন সংরক্ষণ করতে পারি।

  • ঠিক আছে।

  • এখন, সেই API-এর কলার একটি সাসপেন্ডিং API হতে পারে।

  • সুতরাং, এখানে আমার কাছে একটি সাসপেন্ড ফাংশন profileRequest আছে, যা এখন API-কে কল করতে চলেছে এবং এটি একটি কলব্যাক এবং একটি এক্সিকিউটর ব্যবহার করে।

  • এখানে, যেহেতু আমি দুটি ওয়ার্ল্ডকে ব্রিজ করছি, যেখানে আমি সাসপেন্ডিং ওয়ার্ল্ডকে কলব্যাক ওয়ার্ল্ডের সাথে ব্রিজ করছি, তাই আমি suspendCoroutine বিল্ডার ব্যবহার করতে চলেছি।

  • আমি একটি কন্টিনিউয়েশন পাব এবং তারপরে আমি শুধু API কল করব এবং তারপরে উত্তর পাওয়ার পরে কলব্যাকে কন্টিনিউয়েশন আবার শুরু করব।

  • এবং তারপরে এখানে এক্সিকিউটর আছে যা আমি profileRequestContext হিসেবে উল্লেখ করছি।

  • এটি একটি সিঙ্গেল-থ্রেড এক্সিকিউটর।

  • আর যেহেতু traceCoroutine, কোরুটিন কনটেক্সটের মধ্যে প্রোপাগেশন টোকেন এম্বেড করে, তাই আমি কোরুটিন কনটেক্সটের মধ্যে থেকে প্রোপাগেশন টোকেন পেতে পারি এবং তারপর ব্রাউনফিল্ড API-তে ইনপুট হিসেবে সেটি পাস করতে পারি, যাতে আমি এখনও ইভেন্টের কার্যকারণ চেইন বজায় রাখতে পারি।

  • এবং ট্রেসে, এটি খুব স্পষ্ট করে তোলে।

  • সুতরাং, এখানে আপনার কাছে এমন কিছু আছে যা worker-3-এ শুরু হয়েছে যা সিঙ্গেল-থ্রেডেড এক্সিকিউটরে সুইচ করেছে, একবার আমরা কনটেক্সট সুইচ করেছি এবং তারপরে worker-এ আবার শুরু করেছি।

  • তাই এটি বেশ ভালো।

গ্লোবাল ট্রেসিং ও কাস্টম ইনিশিয়ালাইজেশন

  • রাহুল রবিকুমার

    ঠিক আছে।

  • আপনি অন্য যে কাজটি করতে পারেন তা হল, Tracer.global কাস্টমাইজ করা।

  • এখনও পর্যন্ত, Tracing 2.0 API আপনাকে Tracer.global-এর জন্য খুব ভালো ডিফল্ট দেয়, তবে আপনি যদি কখনও এটি কাস্টমাইজ করতে চান, তাহলে করতে পারেন।

  • এছাড়াও, Tracing 2.0-এ JVM ও Android কাজ করে, কারণ আমরা চাই Java ও Android লাইব্রেরি, দুটিতেই ট্রেসিং সম্পূর্ণভাবে কাজ করুক।

  • সুতরাং, ইনিশিয়ালাইজেশনের তিনটি ধাপ হল, আপনি একটি ট্রেস সিঙ্ক তৈরি করেন।

  • ট্রেস সিঙ্ক হল ট্রেস প্যাকেট কীভাবে স্টোর করা হয়।

  • এটি ওয়্যার ফর্ম্যাট এবং আউটপুট ট্রেস যেখানে স্টোর করা আছে সেই লোকেশন নির্ধারণ করে।

  • আমরা আপনাকে ট্রেস সিঙ্কের জন্য একটি আউট-অফ-দ্য-বক্স ইমপ্লিমেন্টেশন দিই যা Perfetto ফর্ম্যাটকে সাপোর্ট করে, তবে আপনি অবশ্যই নিজের ট্রেস সিঙ্ক লিখতে পারেন।

  • এটি সেই সমস্যার সমাধান করার চেষ্টা করে যেখানে Tracing 1-এ atrace একমাত্র ব্যাক এন্ড হিসেবে উপলভ্য ছিল।

  • আমরা এটি ঠিক করতে চেয়েছিলাম।

  • তাই, এখন আপনি যদি OpenTelemetry সিঙ্ক লিখতে চান বা নিজের সিঙ্ক নিয়ে আসতে চান, তাহলে তা সম্পূর্ণভাবে সম্ভব।

  • আপনি সেটি ওভাররাইড করার বিকল্প বেছে নিতে পারবেন।

  • সিঙ্ক তৈরি করার পরে, আপনি ট্রেস ড্রাইভার তৈরি করে সিঙ্কে দিতে পারবেন।

  • এবং তারপরে আপনি কোন কোন বিভাগ চালু করতে চান তা বেছে নিতে পারেন।

  • তাই, এই অংশেই ক্যাটেগরিগুলি সত্যিই উজ্জ্বল হয়ে ওঠে।

  • তাই, আপনি সিদ্ধান্ত নিতে পারেন যে রিলিজের ক্ষেত্রে কিছু বিভাগ ডিবাগের তুলনায় বেশি গুরুত্বপূর্ণ এবং আপনি বলতে পারেন যে আপনি সেই বিভাগগুলি চালু করতে চান।

  • অথবা আপনি শুধু বলতে পারেন, "আমি সব বিভাগ চালু করতে চাই, সেগুলি কোথা থেকে এসেছে তা নির্বিশেষে।"

  • আর এতে কোনও সমস্যা নেই।

  • এছাড়াও, আপনি কাস্টম অ্যাট্রিবিউট যোগ করতে পারেন যা আপনার ট্রেসের জন্য গ্লোবাল।

  • তাই আপনি বিল্ড ভার্সন, ফ্লেভার বা অন্য কোনও মেটাডেটা যা ট্রেসের সাথে অ্যাটাচ করতে চান, তা addAttribute API ব্যবহার করে অ্যাটাচ করতে পারবেন।

  • সবশেষে, আপনি setGlobalTracer নম্বরে কল করে ট্রেসার রেজিস্টার করতে পারবেন।

  • এটিই ট্রেসারের এই ইনস্ট্যান্সের সাথে Tracer.global-কে বাইন্ড করে এবং পরে প্রসেসের জন্য উপলভ্য হয়।

  • Android-এ, প্রসেসের অনেক ভালোভাবে সংজ্ঞায়িত লাইফসাইকেল থাকে, তাই আপনাকে শুধু AbstractTraceDriver.Factory প্রয়োগ করতে হবে, এর create পদ্ধতি ওভাররাইড করতে হবে এবং আপনি আগে যা করেছিলেন ঠিক তাই করতে হবে।

  • তাই আপনি সিঙ্ক তৈরি করেন এবং তারপর ড্রাইভার তৈরি করেন।

  • আপনাকে এখানে রেজিস্টার করতে হবে না।

  • আমরা আপনার জন্য রেজিস্ট্রেশন করে দেব, কারণ আমরা জানি যে এটিই প্রথমে ঘটেছে।

  • ঠিক আছে।

  • ঠিক আছে, আমি আবার বলতে চাই যে ট্রেসিং মাল্টি-প্ল্যাটফর্মের জন্য রেডি।

  • এটি খুব ইচ্ছাকৃত পছন্দ কারণ আমরা জানি যে Compose একাধিক প্ল্যাটফর্মে চলছে এবং আমরা চাই যে আপনি যতগুলি সম্ভব জায়গায় ট্রেস করতে পারেন।

  • বর্তমানে, আমরা Android এবং JVM-এ কাজ করি, তবে আমাদের ইমপ্লিমেন্টেশন সম্পূর্ণ ওপেন, তাই আমরা চাইলে ভবিষ্যতে অন্যান্য প্ল্যাটফর্মেও কাজ করতে পারব।

বিল্ড টুল অপ্টিমাইজেশন (R8 ও metalava)

  • রাহুল রবিকুমার

    আপনি জেনে খুশি হবেন যে, R8, যা Android-এ সোর্স কোড সঙ্কুচিত এবং অপ্টিমাইজ করার জন্য ব্যবহৃত টুল, Tracing 2.0 ব্যবহার করে।

  • এবং ট্রেসের সুবিধা গ্রহণ করে, আমরা R8 অপ্টিমাইজ করেছি যাতে আপনার কোড ২৫% দ্রুত সঙ্কুচিত এবং অপ্টিমাইজ করা যায়।

  • এর অর্থ হল, বিল্ড করার জন্য কম সময় লাগে এবং অপ্টিমাইজেশন পাসের জন্য কম সময় অপেক্ষা করতে হয়।

  • R8-এ আমরা যে প্রতিটি অপ্টিমাইজেশন করেছি, তার সবকটি আমি বলব না, তবে আমি শুধু একটির কথা বলব, যাতে ট্রেসিংয়ের মাধ্যমে কী কী করা সম্ভব, সেই সম্পর্কে আপনি একটি ধারণা পেতে পারেন।

  • তাই, R8, এর মূল অংশে, একটি সোর্স-টু-সোর্স ট্রান্সফরমার।

  • তাই, আপনি একগুচ্ছ JAR পান এবং আপনি সেগুলি সঙ্কুচিত এবং অপ্টিমাইজ করেন এবং আপনি JAR-এর আরেকটি সেট তৈরি করেন যা আপনি ডেক্স করতে পারেন।

  • তাই এখানে, AGP JAR রিড করার মাধ্যমে শুরু হয়, যা শুধু আপনার অ্যাপ নয়, এর সব ডিপেন্ডেন্সিও।

  • তাই, এটি সব ইনপুট JAR পড়া শুরু করার জন্য Gradle ওয়ার্কার ব্যবহার করে।

  • আপনার কাছে অনেক অনেক JAR আছে যা আপনি পড়তে চান।

  • তারপর, JAR-এর রিডিং শেষ হলে, R8 কোড পার্স করা শুরু করে এবং আপনার কোড কী উপস্থাপন করে তার একটি মডেল তৈরি করে এবং এর সমস্ত এন্ট্রি পয়েন্ট তৈরি করে, যাতে এটি আপনার কোড অপ্টিমাইজ এবং সঙ্কুচিত করা শুরু করতে পারে।

  • এখন, এটি হল স্লাইস, অপেক্ষা করুন, এটি দেখায় যে R8 কখন অপ্টিমাইজেশন প্রসেস শুরু করার জন্য সত্যিই প্রস্তুত, তাই না?

  • আপনি হয়ত মাঝখানে কিছু ডেড স্পেস দেখতে পাচ্ছেন এবং আপনি হয়ত ভাবছেন যে কেন আমাদের কাছে অব্যবহৃত সিপিইউ টাইম আছে।

  • আর এর কারণ হল, পুরনো API যেভাবে কাজ করত তা হল, আমরা কোনও কিছু পার্স করার আগে সমস্ত কর্মীদের প্রথমে তাদের সমস্ত ফাইল পড়ার জন্য অপেক্ষা করতাম।

  • অবশ্যই, আমরা এটি ঠিক করতে পারি এবং আমরা ঠিক তাই করেছি।

  • তাই AGP 9-এ, আপনি দেখতে পাবেন যে ইনপুট JAR পড়া শেষ করার সাথে সাথেই আমরা সেগুলি প্রসেস করা শুরু করেছি।

  • আর আমাদের প্রত্যেক কর্মীর ইনপুট পড়া শেষ করার জন্য অপেক্ষা করতে হয়নি।

  • এর ফলে, সব ইনপুট পড়তে আমাদের যে সময় লাগে তা অনেক কমে গেছে।

  • তাই এটি একটি স্পষ্ট অপ্টিমাইজেশন যা আপনি ট্রেস দেখলে খুব স্পষ্ট বুঝতে পারবেন, কিন্তু আপনি যখন সোর্স কোড দেখছেন তখন এটি ততটা স্পষ্ট নয়।

  • AndroidX ইঞ্জিনিয়ার হিসেবে আমরা প্রতিদিন ব্যবহার করি এমন আরেকটি টুল হল Metalava।

  • Metalava হল এমন একটি টুল যা আমরা ব্যবহার করি যাতে আমরা যে APIগুলি পাঠাই সেগুলির API সামঞ্জস্যের গ্যারান্টি থাকে যা আপনি আশা করেন এবং বাহ্যিক লোকেরা কোনও ফুটগান ছাড়াই সম্পূর্ণরূপে ব্যবহার করতে পারে যা আমরা এড়াতে চাই।

  • এটি এমন একটি টুল যা প্রতিটি পাবলিক API এবং সীমাবদ্ধ API-তে চলে এবং তাই আমরা এখানে যে সময় বাঁচাই তা আসলে AndroidX ইঞ্জিনিয়ার হিসেবে আমরা ফিরে পাই।

  • এছাড়াও, Metalava ট্রেসিং ব্যবহার করে পোস্ট-সাবমিট করার সময় ১৫% কমিয়েছে।

  • এবং কী ঘটেছে তা ব্যাখ্যা করার জন্য ট্রেসে যাওয়া, তাই Metalava দুই ধরনের চেক চালায়: প্রথমটি হল যেখানে এটি সীমাবদ্ধ API চেক করে এবং দ্বিতীয়টি হল যেখানে এটি সর্বজনীন API চেক করে।

  • তবে আপনি হয়ত একটি প্যাটার্ন লক্ষ্য করছেন।

  • আমরা সেইসব চেক দুবার চালানোর জন্য অনেক সেট-আপ করছি।

  • তাই, যা হয় তা হল, সব প্রোগ্রাম ইনপুট রিড করা হয়, আমরা PSI তৈরি করি, যা হল প্রোগ্রাম স্ট্রাকচার ইন্টারফেস, অথবা, আপনি জানেন, আপনার কোডের আকার ঠিক কেমন যা সম্পর্কে যুক্তি দেওয়া যেতে পারে।

  • এবং তারপরে, আমরা যে সমস্ত লিন্ট চেক করতে চাই তা প্রয়োগ করা শুরু করার আগে আমরা AST তৈরি করি।

  • এবং আমরা এই ব্যয়বহুল কাজটি দুবার করছি।

  • আমরা কীভাবে এই সমস্যার সমাধান করেছি?

  • আমরা শুধু একবারই এটি করেছি।

  • তাই, সেই সেট-আপের কাজ দুবার করার পরিবর্তে, আমরা একবারই করেছি এবং সেই ইনপুটগুলি সীমাবদ্ধ চেক এবং পাবলিক চেক, দুটির জন্যই আবার ব্যবহার করেছি, যার ফলে সেইসব সঞ্চয় হয়েছে।

  • হ্যাঁ।

  • ঠিক আছে।

পেশাদার পদ্ধতি ও বেঞ্চমার্কিং ট্রেস করা

  • রাহুল রবিকুমার

    সুতরাং, এখন আমি আপনাকে Tracing 2.0-এর মাধ্যমে কী কী করা সম্ভব তার একটি ধারণা দিয়েছি, এটি জানা গুরুত্বপূর্ণ যে ট্রেসিং গুরুত্বপূর্ণ হলেও, কী ট্রেস করতে হবে তা জানাও সমান গুরুত্বপূর্ণ।

  • আপনি সব জায়গায় ট্রেস ছড়িয়ে দিতে চান না।

  • আপনি কী বেছে নিচ্ছেন সেই ব্যাপারে আপনাকে খুব সতর্ক থাকতে হবে এবং আমি আপনাকে কিছু নির্দেশিকা দেওয়ার চেষ্টা করব যাতে আপনি বুঝতে পারেন যে কোনগুলি ট্রেস করা উচিত।

  • তাই, আপনার প্রথম কাজ হল ট্রেসে ব্যাখ্যা করা হয়নি এমন গ্যাপ খুঁজে বের করা।

  • তাই, আপনার থ্রেড যখন রান করছে বা রান করার মতো অবস্থায় আছে, তখন আপনি যেকোনও সময় আপনার সিস্টেম ট্রেসে স্পষ্ট ফাঁক দেখতে পেলে এবং আপনি সেগুলির কারণ ব্যাখ্যা করতে না পারলে এবং আপনার অ্যাপ কী করছে তা আপনি না জানলে, এটি তদন্ত করা উচিত।

  • সেই সময়, আমি সিস্টেম ট্রেসের সাথে ওভারলে করা মেথড ট্রেস নিতে পারি এবং দেখতে পারি যে কোন ট্রেসটি উপযুক্ত এবং আমি সেই প্রাসঙ্গিক ট্রেস বিভাগ যোগ করতে পারি।

  • এছাড়াও, আপনি ব্যবহারকারীর অভিজ্ঞতা অনুযায়ী অগ্রাধিকার দিতে চান।

  • তাহলে, আপনি অ্যাপ স্টার্টআপ দেখতে চান।

  • আপনি নিজের অ্যাপের মূল ব্যবহারকারীর অভিজ্ঞতা দেখতে চান এবং ট্রেস দেখে সেগুলি ব্যাখ্যা করতে পারবেন কিনা তা বুঝতে চান।

  • তাই, যেকোনও সময় আপনি কোনও কিছুর কারণ খুঁজে না পেলে, সেটি ট্রেস করা উচিত।

  • এছাড়াও, আপনার ট্রেস থেকে ডিপ কল স্ট্যাক বা ব্যাখ্যাতীত CPU ব্যবহার দেখা উচিত এবং ঠিক কী ঘটছে তা বোঝার চেষ্টা করা উচিত এবং তারপরে, আপনার কোডবেসের সেই অংশগুলিকে ট্রেসে রূপান্তর করা উচিত।

  • তাই, আপনি সেগুলি ট্রেস করতে পারবেন।

  • এবং তারপরে, যেকোনও সময় আপনার থ্রেড স্লিপিং মোডে থাকলে, আপনি নিশ্চিত করতে চান যে কেন সেগুলি স্লিপিং মোডে আছে তা আপনি বুঝতে পারছেন।

  • সেগুলিকে I/O-এর জন্য অপেক্ষা করতে হবে অথবা বাইন্ডার ট্রানজ্যাকশনের জন্য অপেক্ষা করতে হবে অথবা আপনি আশা করেন এমন কিছু এক্সটার্নাল ইনপুট ইভেন্টের জন্য অপেক্ষা করতে হবে।

  • কিন্তু আপনার যদি, আপনি জানেন, ব্যাখ্যাতীত ঘুম হয়, তাহলে সেগুলি অত্যন্ত তদন্তের যোগ্য কারণ স্পষ্টতই সেখানে কিছু লুকিয়ে থাকতে পারে।

  • এবং তারপরে, আপনি যখন সেই কোডের সমস্ত ট্রেস বিভাগগুলি ছড়িয়ে দেবেন, তখন আপনার সেগুলিকে বেঞ্চমার্কে রূপান্তর করা উচিত যাতে আপনি সেগুলিতে পরিবর্তনগুলি ট্র্যাক করতে পারেন।

  • তাই, আপনার কোড বেস উন্নত হওয়ার সাথে সাথে, আপনি দেখতে পারবেন যে মেট্রিকগুলি পরিবর্তিত হচ্ছে কিনা, আপনার ড্যাশবোর্ডগুলি আসলে বড় পরিবর্তনগুলি প্রতিফলিত করছে কিনা, কারণ তখন আপনি জানতে পারবেন যে গুরুত্বপূর্ণ কিছু পরিবর্তিত হয়েছে।

  • অথবা আপনি আগের সব ধাপ এড়িয়ে গিয়ে আপনার এজেন্টকে দিয়ে এটি করাতে পারেন।

  • এইসব নির্দেশিকা নিয়ে একটি স্কিল তৈরি করুন এবং আপনার পছন্দের এজেন্টকে সেটি ব্যবহার করতে বলুন।

  • হ্যাঁ।

সেট-আপ, সারসংক্ষেপ ও উপসংহার

  • রাহুল রবিকুমার

    তাই, ট্রেসিং যে একটি গুরুত্বপূর্ণ প্রচেষ্টা এবং আপনার এটি করা উচিত, এই বিষয়ে আমি যদি আপনাকে বোঝাতে পেরে থাকি, তাহলে এখানে প্রোজেক্ট সেট-আপের তথ্য দেওয়া হল।

  • এটি খুবই সহজ।

  • ট্রেসিং হল একটি সহজ, আপনি জানেন, শুধু একটি ঐতিহ্যবাহী জাভা লাইব্রেরি, তাই আপনি androidx.tracing:tracing-wire-এ একটি নির্ভরতা সংজ্ঞায়িত করেন, যা হল পারফেট্টো-সামঞ্জস্যপূর্ণ ট্রেস ড্রাইভার প্লাস ট্রেসিং কম্বো এবং বর্তমান স্থিতিশীল সংস্করণ হল ২.০.৫।

  • আপনি যদি Java লাইব্রেরি হন, তাহলে এটি ঠিক একই জিনিস; আবার, এটি একটি সম্পূর্ণ মাল্টিপ্ল্যাটফর্ম API।

  • আমরা অন্যান্য প্ল্যাটফর্মেও এটি প্রসারিত করতে চাই, যখন এটি অর্থপূর্ণ হবে।

  • আর হ্যাঁ, আমি শুধু একবার দ্রুত রিক্যাপ করতে চেয়েছিলাম।

  • তাহলে, আমি এই সব নতুন দুর্দান্ত ফিচার সম্পর্কে কথা বলেছি যা আমরা যোগ করেছি।

  • তাই, কনটেক্সট প্রোপাগেশন সত্যিই খুব শক্তিশালী।

  • আমরা কাস্টম তথ্য, মেটাডেটা, কল স্ট্যাক তথ্য এবং অন্যান্য সব ধরনের জিনিস এম্বেড করতে পারি।

  • আমি অনেক অনেক বিষয়ে কথা বলিনি।

  • আপনি অবশ্যই ট্রেসিং ফর্ম্যাট পরিবর্তন করতে পারেন, আপনি আপনার ট্রেস সিঙ্ক পরিবর্তন করতে পারেন, আপনি, আপনি জানেন, আপনার ট্রেসিং ডেটা OpenTelemetry-তে নিয়ে যেতে পারেন।

  • আপনি এইসব কাজ করতে পারবেন।

  • ট্রেসিং হল মাল্টিপ্ল্যাটফর্ম।

  • এটিও একটি অত্যন্ত সচেতন সিদ্ধান্ত কারণ আমরা চাই যত বেশি সম্ভব মানুষ যেন এর সুবিধা নিতে পারেন।

  • এবং আমরা Perfetto, AndroidX Benchmarks, নতুন পারফর্ম্যান্স অ্যানালাইজার বা পুরনো Android Profiler-এর মতো যেসব টুলিং শিপ করি, সেগুলি সবই Tracing 2.0-তে কাজ করে।

  • এর সাথে, শোনার জন্য আপনাকে অনেক ধন্যবাদ।

  • আশা করি আপনার ডেভ সামিট ভালো কাটবে এবং আপনাকে ধন্যবাদ।