আপনি অ্যাপ-চালিত প্রোফাইল বা ট্রিগার-ভিত্তিক প্রোফাইল ক্যাপচার করুন না কেন,
ProfilingManager ডিভাইসে সম্পূর্ণ ফাইল সেভ করে এবং আপনার রেজিস্টার করা কলব্যাকে একটি
ProfilingResult ডেলিভার করে। সেভ করা প্রোফাইলের পাথ পেতে
ProfilingResult.getResultFilePath কল করুন:
- লোকাল টেস্টিং চলাকালীন:
adbব্যবহার করে আপনার কম্পিউটারে ফাইলটি পুল করুন। - প্রোডাকশনে:
WorkManagerজবে পাথ পাস করুন যা প্রোফাইল কম্প্রেস করে আপনার সার্ভারে আপলোড করে।
ডিভাইস থেকে প্রোফাইল ফিরিয়ে আনা
এই বিভাগে বর্ণনা করা হয়েছে যে ডিভাইসে ProfilingManager কোথায় প্রোফাইল স্টোর করে,
অটোমেটিক ফাইল ক্লিন-আপ কীভাবে কাজ করে এবং adb ব্যবহার করে কীভাবে লোকাল ফাইল পুল করতে হয়।
ফাইলের লোকেশন ও নাম দেওয়ার ফর্ম্যাট
ProfilingManager আপনার অ্যাপ-নির্দিষ্ট স্টোরেজ
ডিরেক্টরি-তে /data/user/0/<app>/files/profiling/-এ রিড্যাক্ট করা প্রোফাইল সেভ করে। ফাইলের নামের ফর্ম্যাট
প্রোফাইল কীভাবে ক্যাপচার করা হয়েছে তার উপর নির্ভর করে:
অ্যাপ-চালিত প্রোফাইল:
profile_<tag>_<datetime>_uid-<uid>.<profile-type-ext>প্রোফাইলের জন্য অনুরোধ করার সময় কোনও ট্যাগ প্রদান করা না হলে,
<tag>_বাদ দেওয়া হয়:profile_<datetime>_uid-<uid>.<profile-type-ext>.ট্রিগার-ভিত্তিক প্রোফাইল:
profile_trigger-type-<trigger_type>_<datetime>_uid-<uid>.<profile-type-ext>
যেখানে:
<app>হল আপনার অ্যাপের প্যাকেজের নাম।<tag>হল কলারের প্রদান করা ট্যাগের প্রথম ২০টি বর্ণসাংখ্যিক অক্ষর (এবং হাইফেন) যাsetTag-এর সাথে কনফিগার করা হয়েছে অথবাrequestProfiling-এ পাস করা হয়েছে,a-z,0-9এবং--এর বাইরে থাকা যেকোনও অক্ষর সরিয়ে দিয়ে ছোট হাতের অক্ষরে কনভার্ট করা হয়েছে।<trigger_type>হলProfilingTriggerথেকে ট্রিগারের জন্য পূর্ণসংখ্যা ধ্রুবক কোড। ফাইলের নাম পার্স করার পরিবর্তে কোডে সবসময়ProfilingResult.getTriggerTypeকল করুন।<datetime>হল প্রোফাইল রেকর্ড করার তারিখ ও সময় (yyyy-MM-dd-HH-mm-ss-SSS)।<uid>হল আপনার অ্যাপের Linux ব্যবহারকারী আইডি (সাম্প্রতিকProfilingমডিউল ভার্সনে অন্তর্ভুক্ত)।<profile-type-ext>হল ক্যাপচার করা প্রোফাইলের ধরনের ফাইল এক্সটেনশন:- সিস্টেম ট্রেসের জন্য
.perfetto-trace - Java হিপ ডাম্পের জন্য
.perfetto-java-heap-dump - হিপ প্রোফাইলের জন্য
.perfetto-heap-profile - স্ট্যাক স্যাম্পলিং প্রোফাইলের জন্য
.perfetto-stack-sample
- সিস্টেম ট্রেসের জন্য
অন-ডিভাইস স্টোরেজ ও ক্লিন-আপ
ডিভাইস স্টোরেজ দ্রুত খালি করতে, সফলভাবে আপলোড করার সাথে সাথেই আপনার আপলোড ওয়ার্কারে
প্রতিটি প্রোফাইল ফাইল মুছে দিন (কারণ অটোমেটিক ক্লিন-আপ তখনই
রান করে যখন ProfilingManager আপনার অ্যাপে ফলাফল ডেলিভার করে, অন্যথায় কোনও ক্যাম্পেন শেষ হওয়ার পরে
আপনার অ্যাপ কলব্যাক রেজিস্টার করা বন্ধ করে দিলে, আপলোড না করা ফাইল ডিস্কে থেকে যেতে
পারে)। সাম্প্রতিক Profiling মডিউল ভার্সনে ফলব্যাক হিসেবে,
নতুন ফলাফল ডেলিভার করা হলে, ProfilingManager আপনার অ্যাপ-নির্দিষ্ট স্টোরেজ ডিরেক্টরিতে ৫ দিনের বেশি পুরনো ডেলিভার করা ফাইলও অটোমেটিক মুছে দেয়।
WorkManager-এর মাধ্যমে প্রোডাকশনে প্রোফাইল আপলোড করা
প্রোফাইল ফাইলের সাইজ কয়েক মেগাবাইট হতে পারে, তাই ডিভাইস আনমিটার্ড নেটওয়ার্কে (ওয়াই-ফাই) কানেক্ট করা থাকলে, চার্জিং ও আইডল অবস্থায় থাকলে ব্যাকগ্রাউন্ডে প্রোডাকশন আপলোড শিডিউল করুন।
আপলোড করার আগে, প্রোফাইল ফাইল কম্প্রেস করুন (যেমন,
GZIPOutputStream বা ZipOutputStream ব্যবহার করে)। Perfetto protobuf প্রোফাইল এবং Java
হিপ ডাম্প উল্লেখযোগ্যভাবে কম্প্রেস করে, নেটওয়ার্ক ব্যান্ডউইথ এবং ব্যাকএন্ড
স্টোরেজ খরচ কমায়।
WorkManager ডিপেন্ডেন্সি যোগ করুন
ProfilingManager হল ক্লাউড-অ্যাগনস্টিক, তাই আপনি WorkManager ব্যবহার করে যেকোনও ব্যাকএন্ডে
প্রোফাইল আপলোড করার শিডিউল করতে পারবেন। আপনার build.gradle.kts ফাইলে
WorkManager লাইব্রেরি যোগ করুন:
Kotlin
dependencies { implementation("androidx.work:work-runtime:2.12.0") }
গ্ৰুভি
dependencies { implementation 'androidx.work:work-runtime:2.12.0' }
আপলোড করার কাজ শিডিউল করুন
আপনার অ্যাপ ProfilingResult পেলে, আপলোড করার কাজ শিডিউল করুন। নিম্নলিখিত
উদাহরণে প্রাথমিক প্রোফাইলিং অনুরোধ বাদ দেওয়া হয়েছে; সম্পূর্ণ অনুরোধের
উদাহরণ দেখতে, সিস্টেম ট্রেস রেকর্ড করুন বিকল্প দেখুন।
Kotlin
class TraceUploadWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) { override fun doWork(): Result { // Perform your uploading work here Log.d("ProfileTest", "Uploading trace: " + inputData.getString("PROFILE_PATH")) return Result.success() } } fun setupProfileUploadWorker(profileFilepath: String?) { val workMgr = WorkManager.getInstance(applicationContext) val workRequestBuilder = OneTimeWorkRequest.Builder(TraceUploadWorker::class) val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .build() workRequestBuilder.setConstraints(constraints) val inputDataBuilder = Data.Builder() inputDataBuilder.putString("PROFILE_PATH", profileFilepath) workRequestBuilder.setInputData(inputDataBuilder.build()) workMgr.enqueue(workRequestBuilder.build()) }
জাভা
public static class TraceUploadWorker extends Worker { public TraceUploadWorker( @androidx.annotation.NonNull Context context, @androidx.annotation.NonNull WorkerParameters workerParams) { super(context, workerParams); } @androidx.annotation.NonNull @Override public Result doWork() { // Perform your uploading work here Log.d("ProfileTest", "Uploading trace: " + getInputData().getString("PROFILE_PATH")); return Result.success(); } } public void setupProfileUploadWorker(String profileFilepath) { WorkManager workMgr = WorkManager.getInstance(getApplicationContext()); OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder( TraceUploadWorker.class); Constraints constraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .build(); workRequestBuilder.setConstraints(constraints); Data.Builder inputDataBuilder = new Data.Builder(); inputDataBuilder.putString("PROFILE_PATH", profileFilepath); workRequestBuilder.setInputData(inputDataBuilder.build()); workMgr.enqueue(workRequestBuilder.build()); }
কোড ওয়াকথ্রু
আগের উদাহরণটি নিম্নলিখিত ধাপগুলি সম্পাদন করে:
- ওয়ার্কারকে সংজ্ঞায়িত করুন:
TraceUploadWorkerক্লাস তৈরি করুন যাWorker-কে এক্সটেন্ড করে। প্রোফাইল ফাইলটি এখনও আছে কিনা তা যাচাই করতেdoWorkপ্রয়োগ করুন, আপনার ব্যাকএন্ড SDK বা HTTP ক্লায়েন্ট ব্যবহার করে এটি কম্প্রেস এবং আপলোড করুন এবং আপলোড সফল হলে স্থানীয় ফাইলটি মুছে দিন। - কাজ শিডিউল করা:
- আপনার কর্মীর জন্য একটি
OneTimeWorkRequestতৈরি করুন। - সীমাবদ্ধতা সেট করুন:
setRequiredNetworkType(NetworkType.UNMETERED),setRequiresDeviceIdle(true)এবংsetRequiresCharging(true)ব্যবহার করুন যাতে ডিভাইস ওয়াই-ফাইয়ে কানেক্ট করা, চার্জিং এবং আইডল অবস্থায় থাকলে তবেই আপলোড হয়। - ডেটা পাস করা:
setInputDataব্যবহার করেgetResultFilePathথেকে প্রোফাইল পাথ ওয়ার্কারের কাছে পাস করুন। - সারিতে যোগ করুন:
WorkManager.enqueue-এ কল করেWorkManager-এ অনুরোধ জমা দিন।
- আপনার কর্মীর জন্য একটি
পরবর্তী ধাপ
প্রোফাইল ফিরিয়ে আনা বা আপলোড করার পরে, Perfetto UI-তে সেগুলি ভিজ্যুয়ালাইজ করুন, PerfettoSQL-এর মাধ্যমে স্বতন্ত্র প্রোফাইল কোয়েরি করুন, একসাথে অনেক ট্রেস বিশ্লেষণ করুন, অথবা AI-এর মাধ্যমে প্রোফাইল বিশ্লেষণ করুন। স্কেলেবল সার্ভার-সাইড বিশ্লেষণ পাইপলাইন সেট-আপ করার ব্যাপারে নির্দেশিকা পেতে, Kubernetes-এ Bigtrace ডেপ্লয় করা দেখুন।