আপনার ফোন যদি একজন ব্যক্তি হত, তাহলে সম্ভবত সেই অতি সফল বন্ধু যে বসে থাকতে পারে না। এই ধরনের যারা জোর দিয়ে বলেন যে তারা গোপনে কাজ চালানোর সময়, বার্তার উত্তর দেওয়ার সময় এবং একই সাথে আবহাওয়া পরীক্ষা করার সময় শিথিল হন৷
আপনার অ্যান্ড্রয়েড ডিভাইসের ভিতরে, প্রতি মুহূর্তে খুব অনুরূপ কিছু ঘটছে। এক সেকেন্ডে প্রসেসরটি ব্লুটুথের মাধ্যমে আপনার প্লেলিস্ট স্ট্রিম করছে, পরবর্তীতে এটি বিজ্ঞপ্তিগুলি প্রক্রিয়া করছে, আপনার অবস্থান ট্র্যাক করছে বা পটভূমিতে ডেটা সিঙ্ক করছে। কোনো না কোনোভাবে এটি আপনার জিন্স না গলিয়ে বা লাঞ্চের আগে চার্জারের জন্য ভিক্ষা না করেই সবকিছু পরিচালনা করে।
এই অতিমানবীয় স্ট্যামিনার পিছনের রহস্য লুকিয়ে আছে সিলিকনের ভিতরে একটি ছোট অভয়ারণ্য যা নিম্ন শক্তি দ্বীপ নামে পরিচিত, প্রায়ই সংক্ষেপে এলপিআই নামে পরিচিত। আপনার প্রসেসরের জন্য এটিকে একটি ধ্যান কোণ হিসাবে মনে করুন। যখন জরুরী কিছু করার নেই, তখন চিপের কিছু অংশ নিঃশব্দে এই স্থানটিতে বিশ্রামের জন্য পিছিয়ে যায়, যখন কিছু প্রয়োজনীয় উপাদান বিশ্বের উপর নজর রাখতে জাগ্রত থাকে।
একটি ব্যস্ত কফি শপ হিসাবে আপনার CPU কল্পনা করুন. প্রধান ব্যারিস্তা হল উচ্চ-কার্যক্ষমতা সম্পন্ন কোর, গেম বা ভিডিও এডিটরের মতো অ্যাপের চাহিদার জন্য অভিনব এস্প্রেসো পানীয় প্রস্তুত করতে ঘুরে বেড়ায়। ছোট দক্ষতার কোরগুলি হালকা অর্ডারগুলি যেমন বিজ্ঞপ্তি বা পটভূমির কাজগুলি পরিচালনা করে। এখন একটি নিঃসঙ্গ ড্রিপ কফি মেশিনের ছবি দেখুন যা ঘন্টা বন্ধ হওয়ার পরে কোণায় গুনগুন করছে। এটি খুব বেশি শক্তি ব্যবহার না করে প্রয়োজনীয় জিনিসগুলিকে সচল রাখে। সেই নম্র মেশিনটি হল আপনার লো পাওয়ার আইল্যান্ড।
যখন অ্যান্ড্রয়েড বুঝতে পারে যে কেউ স্ক্রীন স্পর্শ করছে না, কোনও ভারী গণনা চলছে না, এবং কোনও গুরুত্বপূর্ণ ওয়েক লক সক্রিয় নেই, তখন এটি ডিভাইসটিকে এই মৃদু অর্ধ-নিদ্রায় চলে যেতে দেয়৷ সিস্টেমটি সম্পূর্ণরূপে অচেতন নয় কারণ কাউকে এখনও অ্যালার্ম, নেটওয়ার্ক কার্যকলাপ বা ব্লুটুথ প্যাকেটের জন্য শুনতে হবে। এটা অনেকটা একটা বিড়ালের মতো ঘুমানোর মতো একটা কান নাচিয়ে শব্দ করে।
এই ডিজাইনটি আধুনিক ডিভাইসগুলিকে প্রতিক্রিয়াশীল থাকার সময় শক্তি সংরক্ষণের অনুমতি দেয়। পুরানো সিস্টেমে, ঘুমাতে যাওয়ার অর্থ হল সবকিছু বন্ধ করে দেওয়া এবং তারপর একটি একক ঘটনার জন্য বেদনাদায়কভাবে জেগে ওঠা। এটি এমন হবে যে প্রতিবার গ্রাহক না থাকলে কফি শপের বিদ্যুৎ বন্ধ করে দেওয়া, তারপর পরবর্তী অর্ডার আসার সময় মেশিনগুলি গরম হওয়ার জন্য অপেক্ষা করা। লো পাওয়ার আইল্যান্ড শুধুমাত্র প্রয়োজনীয় জিনিসগুলিকে বাঁচিয়ে রেখে সেই বর্জ্যকে এড়িয়ে যায়।
সুতরাং পরের বার যখন আপনার ফোনটি কয়েক ঘন্টা স্থির থাকার পরে অবিলম্বে জ্বলে উঠবে, মনে রাখবেন যে আপনার প্রসেসরের গভীরে, কয়েকটি শান্ত ট্রানজিস্টর গেটগুলি পাহারা দিচ্ছিল। তারা পুরোপুরি জেগে ছিল না বা পুরোপুরি ঘুমিয়ে ছিল না কিন্তু মাঝখানে শান্তিতে ভাসছিল। এটি হল লো পাওয়ার আইল্যান্ড, অ্যান্ড্রয়েডের ব্যাটারি সহনশীলতার লুকানো নায়ক৷
৷এই নিবন্ধে, আমরা সেই নায়কের পর্দা তুলতে যাচ্ছি। আপনি দেখতে পাবেন কিভাবে LPI কাজ করে, শুধুমাত্র CPU-এর জন্য একটি নিদ্রাহীন নক হিসেবে নয় বরং Android-এর আর্কিটেকচারে বোনা একটি পূর্ণাঙ্গ পাওয়ার-ম্যানেজমেন্ট কৌশল হিসেবে। আমরা আরও অন্বেষণ করব কীভাবে ব্লুটুথ বড় কোরগুলিকে না জাগিয়ে দ্বীপের অভ্যন্তরে নিঃশব্দে চ্যাটিং চালিয়ে যায়, কীভাবে পাওয়ার HAL এবং কার্নেল প্রতিটি ঘুম এবং জাগরণ চক্রকে অর্কেস্ট্রেট করে এবং কীভাবে ফার্মওয়্যার একটি অক্লান্ত নাইট গার্ডের ভূমিকা পালন করে৷
আপনি সত্যিকারের AOSP স্নিপেট, আসল কার্নেল লগ এবং ব্লুটুথ কোড লেখার বিষয়ে ব্যবহারিক পরামর্শ পাবেন যা উচ্চস্বরে বার্জিং করার পরিবর্তে দ্বীপের সাথে সহযোগিতা করে।
শেষ পর্যন্ত, আপনি বুঝতে পারবেন কেন আপনার ফোন যতক্ষণ পর্যন্ত টিকে থাকে, এবং কীভাবে সিলিকনের এই লুকানো কোণটি সবকিছুকে শান্ত সূক্ষ্মতার সাথে চালায়।
সূচিপত্র
-
অ্যান্ড্রয়েড ব্লুটুথে লো পাওয়ার আইল্যান্ড (এলপিআই) কী?
-
দ্য সাইলেন্ট অর্কেস্ট্রা:কিভাবে LPI পাওয়ার HAL এবং কার্নেলের সাথে কাজ করে
-
ব্লুটুথ
তে কম পাওয়ার আইল্যান্ড ডিবাগিং এবং যাচাই করা -
ব্লুটুথ শিখিয়ে ঘুমাতে আরও স্মার্ট
-
উপসংহার:আপনার ফোনের ভিতরে শান্ত প্রতিভা
ব্লুটুথ একটি সামাজিক প্রজাপতি। এমনকি যখন স্ক্রীন অন্ধকার থাকে, তখনও এটি আপনার ইয়ারবাড, স্মার্টওয়াচ বা গাড়ির স্টেরিওতে ফিসফিস করে, ডেটার প্যাকেট বিনিময় করে যা জীবনকে নির্বিঘ্ন বোধ করে। সমস্যা হল যে ক্রমাগত কথোপকথন শক্তি খরচ করে। প্রতি কয়েক সেকেন্ডে পুরো ফোনকে জাগিয়ে তোলা মাত্র কয়েকটা বাইট পাঠালে আপনার চাবি খুঁজে পেতে স্টেডিয়ামের ফ্লাডলাইট চালু করার মতো হবে।
এখানেই আবার নায়ক হয়ে ওঠে লো পাওয়ার আইল্যান্ড। আধুনিক অ্যান্ড্রয়েড ফোনের ভিতরে, ব্লুটুথ যোগাযোগ একটি ডেডিকেটেড ব্লুটুথ কন্ট্রোলার দ্বারা পরিচালিত হয় , প্রধান CPU হিসাবে একই সিস্টেম-অন-চিপের মধ্যে একটি ছোট মাইক্রোপ্রসেসর। এই নিয়ামকটির নিজস্ব মেমরি এবং নিজস্ব পাওয়ার ডোমেন রয়েছে। এটি আংশিকভাবে জেগে থাকতে পারে যখন বড় CPU কোরগুলি বিশ্রাম নেয়, সংযোগ বজায় রাখে এবং প্রধান প্রসেসরের প্রায় কোনও সাহায্য ছাড়াই রেডিও ট্র্যাফিক পরিচালনা করে৷
যখন Android এর পাওয়ার ম্যানেজার সিদ্ধান্ত নেয় সিস্টেম ঘুমাতে পারে, এটি ব্লুটুথ HAL এর মাধ্যমে সংকেত পাঠায় এবং বিক্রেতা ড্রাইভারকে কন্ট্রোলারকে জানাতে হবে যে হোস্ট সাইড একটি কম-পাওয়ার অবস্থায় প্রবেশ করছে। তারপর কন্ট্রোলার নিজে থেকেই হালকা ওজনের কাজগুলি গ্রহণ করে, যেমন সংযোগগুলিকে জীবিত রাখা, স্নিফ ইন্টারভালের সময় নির্ধারণ করা এবং এনক্রিপশন হ্যান্ডশেকগুলি পরিচালনা করা। ফলাফল হল একটি নিরবচ্ছিন্ন অভিজ্ঞতা যেখানে আপনার ইয়ারবাডগুলি জোড়া এবং প্রতিক্রিয়াশীল থাকে যখন আপনার ফোনের বাকি অংশগুলি শান্তভাবে শক্তি সঞ্চয় করে৷
AOSP-এর ব্লুটুথ পরিষেবার মধ্যে একটি সরলীকৃত উঁকি এই সহযোগিতাকে কার্যে দেখায়:
// From system/bt/service/btif/src/btif_core.cc
void btif_pm_enter_low_power_mode() {
LOG_INFO("%s: entering low power mode", __func__);
// Notify controller to enter sleep mode
BTA_dm_pm_btm_status_evt(BTA_DM_PM_BTM_STATUS_IDLE);
// Suspend host stack threads
btif_thread_suspend();
}
void btif_pm_exit_low_power_mode() {
LOG_INFO("%s: exiting low power mode", __func__);
// Resume host stack threads
btif_thread_resume();
// Notify controller that the host is active again
BTA_dm_pm_btm_status_evt(BTA_DM_PM_BTM_STATUS_ACTIVE);
}
এই ফাংশনগুলি অ্যান্ড্রয়েড এবং কন্ট্রোলারের মধ্যে অনেক বড় কথোপকথনের একটি ছোট অংশ উপস্থাপন করে। হোস্ট স্ট্যাক নিঃশব্দে বিরতি দেয় যখন কন্ট্রোলার নজর রাখে। অনেক চিপ বিক্রেতা প্ল্যাটফর্মে, এই অবস্থাটিকে কন্ট্রোলার স্লিপ বলা হয় অথবা স্নুজ মোড . ব্লুটুথ কন্ট্রোলার হোস্টকে তখনই জাগিয়ে তুলতে পারে যখন অর্থপূর্ণ কিছু ঘটে, যেমন একটি ইনকামিং কল বা আপনার হেডসেট থেকে একটি বোতাম টিপে৷
এটি একটি রাতের নিরাপত্তা প্রহরীর মতো কাজ করে যে সবাই বাড়িতে যাওয়ার পরে একটি বিল্ডিং টহল দেয়। লাইট বন্ধ থাকে, বাতাস স্থির থাকে, কিন্তু কেউ সদা সতর্ক থাকে। কিছু ঘটলে, গার্ড বেল বাজায়, এবং বাকি ক্রু জেগে ওঠে। এইভাবে আপনার ফোনের ব্লুটুথ কাজ করতে থাকে এমনকি যখন ডিসপ্লে অন্ধকার থাকে এবং CPU কোরগুলি লো পাওয়ার আইল্যান্ডের ভিতরে বিশ্রাম নেয়।
হার্ডওয়্যার, ফার্মওয়্যার এবং অ্যান্ড্রয়েডের পাওয়ার ম্যানেজমেন্টের মধ্যে এই সহযোগিতা আপনার জন্য ব্যাটারি নিষ্কাশন না করেই তাৎক্ষণিকভাবে গান শোনা, স্মার্টওয়াচের বিজ্ঞপ্তি গ্রহণ করা বা প্লেব্যাক পুনরায় শুরু করা সম্ভব করে তোলে। এটি সর্বোত্তমভাবে শান্ত দক্ষতা, সচেতনতা এবং বিশ্রামের মধ্যে একটি ভারসাম্য যা আধুনিক অ্যান্ড্রয়েড ডিজাইনের সৌন্দর্যকে সংজ্ঞায়িত করে৷
দ্য সাইলেন্ট অর্কেস্ট্রা:অ্যান্ড্রয়েড পাওয়ার এইচএএল এবং কার্নেলের সাথে কীভাবে লো পাওয়ার আইল্যান্ড কাজ করে
আপনার ফোন ঘুমন্ত অবস্থায় আপনি যদি Android এর হুডের নীচে উঁকি দিতে পারেন, তাহলে আপনি এমন কিছু দেখতে পাবেন যা দেখতে অনেকটা নিখুঁতভাবে নির্ধারিত অর্কেস্ট্রার মতো। প্রতিটি যন্ত্রই জানে কখন মৃদুভাবে বাজতে হবে, কখন বিশ্রাম নিতে হবে এবং কখন একটি বিট মিস না করে ফিরে আসতে হবে৷
লো পাওয়ার আইল্যান্ড এই শোতে একক অভিনয়শিল্পী নয়। এটি অনেকটা মৃদু ছন্দ বিভাগের মতো, যা পাওয়ার HAL-এর ভিতরে বসবাসকারী অদৃশ্য কন্ডাক্টরের একটি সেট দ্বারা সমন্বিত। , কার্নেল , এবং ফার্মওয়্যার .
চলুন শুরু করা যাক পাওয়ার HAL দিয়ে , বা হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার। অ্যান্ড্রয়েডে, পাওয়ার HAL সিস্টেম ফ্রেমওয়ার্ক এবং নিম্ন-স্তরের কার্নেল ড্রাইভারগুলির মধ্যে মধ্যস্থতাকারী হিসাবে কাজ করে। অ্যান্ড্রয়েড যখনই সিদ্ধান্ত নেয় যে এটি পাওয়ার খরচ কমাতে পারে, তখন এটি HAL ইন্টারফেসের মাধ্যমে এই সিদ্ধান্তের সাথে যোগাযোগ করে। হার্ডওয়্যারের কোন অংশ নিরাপদে ঘুমাতে পারে তা নির্ধারণ করতে পাওয়ার HAL চিপসেট বিক্রেতার বাস্তবায়নের সাথে কথা বলে। এটি শুধুমাত্র CPU ক্লাস্টার নয় বরং GPU, ডিসপ্লে পাইপলাইন এবং ব্লুটুথ এবং Wi-Fi এর মত পেরিফেরাল কন্ট্রোলারগুলিকেও নিয়ন্ত্রণ করে৷
একটি সরলীকৃত অর্থে, অ্যান্ড্রয়েডের পাওয়ার ম্যানেজার এমন কিছু বলেছেন, "আরে HAL, আমরা এখন অলস, আমরা কি একটু ঘুমাতে পারি?" পাওয়ার HAL তারপর কার্নেল এবং হার্ডওয়্যার দিয়ে চেক করে যে কে ঘুমাতে পারে। যদি ব্লুটুথ কন্ট্রোলার নিশ্চিত করে যে এটি একা চলমান যোগাযোগ পরিচালনা করতে পারে, পাওয়ার HAL কার্নেলকে প্রধান প্রসেসরের অংশগুলি বন্ধ করা শুরু করার জন্য সংকেত দেয়৷
কার্নেল , ঘুরে, তার পাওয়ার ডোমেনগুলির মাধ্যমে এই রূপান্তরটি পরিচালনা করে৷ এবং ঘড়ি গেটিং সিস্টেম চিপের প্রতিটি হার্ডওয়্যার ব্লক একটি নির্দিষ্ট পাওয়ার ডোমেনের অন্তর্গত। কার্নেল জানে কোন ডোমেনগুলি সম্পূর্ণরূপে বন্ধ করা যেতে পারে এবং কোনটি আংশিকভাবে সক্রিয় থাকতে হবে৷
ব্লুটুথ কন্ট্রোলার সাধারণত একটি ডোমেনের অন্তর্গত যা ধারণ মোড সমর্থন করে৷ , যার অর্থ হল এর কিছু মেমরি এবং লজিক রাষ্ট্রকে রক্ষা করার জন্য যথেষ্ট চালিত থাকে।
যখন ডিভাইসটি এলপিআই মোডে প্রবেশ করা শুরু করে তখন কার্নেল লগের ভিতরে একটি সাধারণ প্রবাহ এইরকম কিছু দেখায়:
PM: suspend entry (deep)
controller-bluetooth 0001:00:00.0: entering controller sleep
PM: suspend devices complete
PM: suspend exit
controller-bluetooth 0001:10:00.0: waking host
এই সংক্ষিপ্ত এক্সচেঞ্জে, আপনি দেখতে পাবেন কিভাবে অ্যান্ড্রয়েডের পাওয়ার ম্যানেজার পুরো ঘুম-জাগানোর প্রক্রিয়াকে সাজায়। ব্লুটুথ ড্রাইভার রিপোর্ট করে যে এটি কন্ট্রোলার স্লিপে প্রবেশ করছে, কার্নেল নিশ্চিত করে যে সমস্ত ডিভাইস স্থগিত করা হয়েছে এবং তারপরে একটি বাধা ঘটলে সবকিছু জাগিয়ে তোলে।
হার্ডওয়্যার স্তরে, এই আচরণটি নির্ভর করে ভোল্টেজ দ্বীপের উপর এবং ঘড়ি ডোমেন SoC প্রস্তুতকারকের দ্বারা সংজ্ঞায়িত। "দ্বীপ" শব্দটি এখানে রূপক নয় - এটি আক্ষরিকভাবে চিপের একটি বৈদ্যুতিকভাবে বিচ্ছিন্ন অঞ্চলকে প্রতিনিধিত্ব করে যা স্বাধীনভাবে চালিত হতে পারে। যখন কার্নেল প্রধান CPU-কে ঘুমোতে রাখে, তখন সেই দ্বীপের পাওয়ার কম বা বন্ধ হয়ে যায়, যখন ব্লুটুথ কন্ট্রোলার সম্বলিত আরেকটি দ্বীপ একটি ছোট স্বাধীন অসিলেটর ব্যবহার করে কাজ করতে থাকে।
এদিকে, ফার্মওয়্যার ব্লুটুথ কন্ট্রোলারে চলমান হালকা গৃহস্থালির কাজ করে। এটি নির্ধারিত ইভেন্টগুলি পরিচালনা করে যেমন সংযোগের ব্যবধান, স্নিফ সাবরেট ট্রানজিশন এবং লিঙ্ক তত্ত্বাবধানের সময়সীমা। এমনকি এটি হোস্ট প্রসেসরকে বিরক্ত না করে প্যাকেটগুলিকে ডিক্রিপ্ট বা পুনরায় এনক্রিপ্ট করতে পারে। এটি অ্যান্ড্রয়েডকে একটি লাইভ ব্লুটুথ সংযোগ বজায় রাখার অনুমতি দেয় যখন এটি সাধারণত যে শক্তি ব্যবহার করে তার একটি ভগ্নাংশ ব্যবহার করে৷
যখন একটি ইভেন্ট যার জন্য উচ্চ-স্তরের মনোযোগের প্রয়োজন হয়, যেমন একজন ব্যবহারকারী তাদের হেডসেটের একটি বোতাম টিপে, তখন কন্ট্রোলার একটি হোস্ট ওয়েক সিগন্যাল উত্থাপন করে UART বা শেয়ার্ড মেমরি পরিবহনের মাধ্যমে। কার্নেল এই বাধা গ্রহণ করে, CPU ঘড়ি পুনরুদ্ধার করে এবং Android এর পাওয়ার ম্যানেজার পুনরায় চালু করে। হোস্ট স্ট্যাকটি পুনরায় সক্রিয় হয়, ইভেন্টটি প্রক্রিয়া করে এবং তারপর আবার নিষ্ক্রিয় হয়ে যাওয়ার পরে করুণার সাথে নিয়ন্ত্রণ করে।
পাওয়ার HAL, কার্নেল এবং ফার্মওয়্যারের মধ্যে এই নৃত্যটি জটিল শোনাতে পারে, তবে এটি Android এর মধ্যে সবচেয়ে মার্জিত ডিজাইনগুলির মধ্যে একটি। প্রতিটি স্তর সুনির্দিষ্টভাবে তার ভূমিকা পালন করে। পাওয়ার এইচএএল নীতিগুলি নিয়ে আলোচনা করে, কার্নেল সেগুলিকে প্রয়োগ করে এবং ফার্মওয়্যারটি পটভূমিতে শান্তভাবে সেগুলি কার্যকর করে৷ একসাথে, তারা নিশ্চিত করে যে ঘন্টার পর ঘন্টা বিশ্রামের পরেও আপনার ফোন অবিলম্বে জেগে উঠছে।
পরের বার আপনার ফোনটি আপনার পকেটে ঘুমানোর পরে আপনার ইয়ারবাডগুলি দেরি না করে পুনরায় সংযোগ করলে, জেনে রাখুন যে এটি ঘটতে সফ্টওয়্যার এবং সিলিকনের একটি সম্পূর্ণ চেইন ত্রুটিহীনভাবে সহযোগিতা করেছে৷ লো পাওয়ার আইল্যান্ড শুধু শক্তি সঞ্চয় করেনি - এটি আপনার আঙুলের নীচে একটি নীরব অর্কেস্ট্রা পরিচালনা করছিল৷
ব্লুটুথে লো পাওয়ার আইল্যান্ড ডিবাগিং এবং যাচাই করা
আপনি যদি কখনও একটি ঘুমন্ত বিড়ালকে তার কান নাড়তে দেখে থাকেন এবং ভেবে থাকেন যে এটি স্বপ্ন দেখছে কিনা, তাহলে অ্যান্ড্রয়েডে লো পাওয়ার আইল্যান্ড ডিবাগ করার মতোই এটি দেখতে অনেকটা। ডিভাইসটি স্থির থাকতে পারে, কিন্তু লগের গভীরে, জীবনের ছোট ছোট ঢেউ প্রতি কয়েক সেকেন্ডে দেখা যায়। ইঞ্জিনিয়াররা এই শান্ত বিশৃঙ্খলা পছন্দ করেন কারণ এটি তাদের বলে যে সিস্টেমটি বিশ্রাম এবং প্রস্তুতির মধ্যে পুরোপুরি ভারসাম্য বজায় রাখছে।
ব্লুটুথ যখন তার কম শক্তির পর্যায়ে প্রবেশ করে, তখন অ্যান্ড্রয়েড একটি ব্রেডক্রাম্ব ট্রেইল থেকে ক্লুস রেখে যায়। আপনি উভয় logcat এ দেখতে পারেন৷ এবং কার্নেল dmesg আউটপুট এই লগগুলি নিশ্চিত করতে সাহায্য করে যে ব্লুটুথ কন্ট্রোলার সত্যিই তার কম শক্তির অবস্থায় প্রবেশ করছে কিনা যখন হোস্ট সিপিইউ শান্ত দ্বীপে ফিরে যাচ্ছে।
এই প্রক্রিয়ার মধ্যে উঁকি দেওয়ার একটি সহজ উপায় হল চালানো:
adb logcat -b all | grep -i "btif_pm"
আপনি এই মত কিছু দেখতে পারেন:
08-05 12:23:44.732 1712 1725 I bt_btif_pm: entering low power mode
08-05 12:23:44.733 1712 1725 I bt_btif_pm: controller idle, suspending host threads
08-05 12:23:46.008 1712 1725 I bt_btif_pm: exiting low power mode
প্রতিটি লাইন গল্পের অংশ বলে। প্রথম বার্তাটি নিশ্চিত করে যে অ্যান্ড্রয়েডের ব্লুটুথ স্ট্যাক কম পাওয়ার স্টেটে প্রবেশের অনুরোধ করেছে। দ্বিতীয়টি দেখায় যে হোস্ট-সাইড থ্রেডগুলি বিরাম দেওয়া হয়েছে, এবং চূড়ান্ত বার্তাটি দেখায় যে কন্ট্রোলার আবার হোস্টকে জাগিয়েছে৷
নীচে কী ঘটছে তা দেখতে, আপনি কার্নেল লগগুলি পরীক্ষা করতে পারেন:
adb shell dmesg | grep -i bluetooth
আপনি এন্ট্রি খুঁজে পেতে পারেন যেমন:
[ 1423.347102] controller-bluetooth 0001:00:00.0: entering controller sleep
[ 1423.347117] PM: suspend entry (deep)
[ 1425.105993] controller-bluetooth 0001:00:00.0: host wake received
[ 1425.106005] PM: resume complete
এই লাইনগুলি নিশ্চিত করে যে ব্লুটুথ ড্রাইভার এবং পাওয়ার ম্যানেজমেন্ট সিস্টেম সঠিকভাবে সহযোগিতা করছে। কন্ট্রোলার ঘুমাতে গিয়েছিল, কার্নেল সিপিইউ ক্লাস্টারগুলিকে সাসপেন্ড করেছিল, এবং ব্লুটুথ কন্ট্রোলার থেকে একটি জাগ্রত সংকেত এলে সবকিছু আবার জেগে ওঠে৷
আপনি যদি কখনও হোস্টকে খুব ঘন ঘন জেগে উঠতে দেখেন, তবে এর মানে সাধারণত কিছু উপাদান ঘুমের সীমানাকে সম্মান করছে না। সাধারণ অপরাধীদের মধ্যে রয়েছে অসদাচরণকারী ওয়েক লক, ক্রমাগত স্ক্যান করার অনুরোধকারী সশব্দ অ্যাপস, বা টাইমার যা কখনো মেয়াদোত্তীর্ণ হয় না। এই ধরনের ক্ষেত্রে, Android এর PowerStats HAL এবং ব্যাটারি স্ট্যাটস ফ্রেমওয়ার্ক ট্র্যাক করতে সাহায্য করতে পারে কে গভীর ঘুমে বাধা দিচ্ছে।
আপনি ব্যবহার করে সামগ্রিক নিম্ন-শক্তি পরিসংখ্যান পরীক্ষা করতে পারেন:
adb shell dumpsys batterystats | grep "bluetooth"
এটি প্রকাশ করে যে ব্লুটুথ সাবসিস্টেমটি কতক্ষণ সক্রিয় ছিল তার তুলনায় সিস্টেমটি কতক্ষণ কম পাওয়ার মোডে ছিল। আদর্শভাবে, সংখ্যাগুলি দেখাবে যে ব্লুটুথ সংক্ষিপ্ত জেগে ওঠার সময় ব্যতীত বেশিরভাগই নিষ্ক্রিয় থাকে৷
সিস্টেম আনয়নে কাজ করা প্রকৌশলীরা প্রায়ই বিশেষ ট্রেসিং টুল ব্যবহার করেন যেমন systrace , ftrace , অথবা perfetto পাওয়ার ট্রানজিশন কল্পনা করতে। একটি পাওয়ার ট্রেস একটি ছন্দ দেখায়:একটি দীর্ঘ সমতল রেখা যা ঘুমের প্রতিনিধিত্ব করে, যখন নিয়ন্ত্রক একটি অর্থপূর্ণ ইভেন্টের জন্য হোস্টকে জাগিয়ে তোলে তখন কার্যকলাপের তীক্ষ্ণ স্পাইক দ্বারা বাধাপ্রাপ্ত হয়। যদি এই স্পাইকগুলি খুব ঘন ঘন হয়, আপনি জানেন যে সিস্টেমটি দক্ষতার সাথে লো পাওয়ার আইল্যান্ডে প্রবেশ করছে না৷
এখানে একটি সাধারণ Perfetto ট্রেস স্নিপেট থেকে একটি উদ্ধৃতি:
bluetooth_host_state: IDLE → SUSPENDED
bluetooth_controller_state: ACTIVE → SLEEP
kernel_cpu_cluster_0: ACTIVE → RETENTION
kernel_cpu_cluster_1: ACTIVE → POWER_OFF
এই সহজ ক্রম একটি শক্তিশালী গল্প বলে. হোস্ট স্ট্যাক সাসপেন্ড হয়েছে, কন্ট্রোলার ঘুমোচ্ছে, এবং CPU ক্লাস্টারগুলি সুন্দরভাবে চালিত হয়েছে। পরবর্তী ঘটনা ঘটলে, রূপান্তর বিপরীত হয়, এবং ডিভাইসটি প্রায় সঙ্গে সঙ্গে জেগে ওঠে।
পর্দার আড়ালে, বিক্রেতা ফার্মওয়্যার এই যাদুটিকে অনায়াসে দেখতে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। ব্লুটুথ কন্ট্রোলার ফার্মওয়্যারটি টাইমিং স্লট, স্নিফ ইন্টারভাল এবং লিঙ্ক-লেয়ার এনক্রিপশন কীগুলি বজায় রাখে, সব কিছু কিছু মিলিওয়াট পাওয়ারে চলাকালীন। এটি আশ্চর্যজনকভাবে কার্যকর। একটি সাধারণ কন্ট্রোলার এক মিলিওয়াটের অধীনে পাওয়ার খরচের সাথে একটি সক্রিয় ACL সংযোগ বজায় রাখতে পারে, এমনকি যখন প্রধান CPU কোরগুলি সম্পূর্ণভাবে বন্ধ থাকে।
এই সিস্টেমটিকে ডিবাগ করা কিছুটা পাখি দেখার মতো মনে হয়৷ আপনাকে ধৈর্যশীল, নীরব এবং পর্যবেক্ষক থাকতে হবে। বেশিরভাগ সময়, লগগুলিতে নাটকীয় কিছুই ঘটে না। কিন্তু শেষ পর্যন্ত যখন আপনি একটি নিখুঁত ঘুম-জাগরণ চক্র ধরবেন, তখন প্রকৃতিকে সাদৃশ্যপূর্ণভাবে দেখার মতো মনে হয়। এটি ব্লুটুথের সাথে কাজ করে অ্যান্ড্রয়েডের লো পাওয়ার আইল্যান্ডের সৌন্দর্য৷
৷তাই যখন আপনার ইয়ারবাডগুলি অর্ধেক সেকেন্ডের মধ্যে পুনরায় সংযোগ করে বা আপনার ফোন টেবিলে থাকা অবস্থায় আপনার স্মার্টওয়াচ নীরবে ডেটা সিঙ্ক করে, তখন পর্দার পিছনের এই শান্ত অর্কেস্ট্রাটি মনে রাখবেন। এটি ব্রুট পাওয়ার নয় কিন্তু স্মার্ট পাওয়ার ম্যানেজমেন্ট যা অভিজ্ঞতাকে মসৃণ করে তোলে। লো পাওয়ার আইল্যান্ড হল অদৃশ্য কারিগর যা আপনার অ্যান্ড্রয়েড ব্লুটুথকে তার শান্ত নির্ভুলতা দেয়, ব্যাটারি এক সময়ে একটি ঘুমন্ত প্যাকেট বাঁচায়৷
ব্লুটুথকে আরও স্মার্ট করে ঘুমাতে শেখানো
যদি লো পাওয়ার আইল্যান্ড আপনার প্রসেসরের জন্য যোগব্যায়াম হয়, তাহলে একজন বিকাশকারী হিসাবে আপনার কাজ হবে আপনার ব্লুটুথ কোডটি ড্রাম সেটের সাথে দেখা যাচ্ছে না তা নিশ্চিত করা। আপনার যখন প্রয়োজন নেই তখন ঘটনাক্রমে সিস্টেমটিকে জাগ্রত রাখা সহজ। একটি একক অসতর্ক জাগরণ লক, একটি পুনরাবৃত্ত টাইমার, বা একটি কখনও শেষ না হওয়া স্ক্যান অনুরোধ হার্ডওয়্যারটিকে সেই শান্ত, শক্তি-দক্ষ অবস্থায় প্রবেশ করা থেকে আটকাতে পারে৷
লো পাওয়ার আইল্যান্ডের জন্য অপ্টিমাইজ করার লক্ষ্য হল আপনার ব্লুটুথ যুক্তি কম কাজ করা নয়। এটি বুদ্ধিমানের সাথে কাজ করা , প্রধান CPU শান্তিতে ঘুমানোর সময় কন্ট্রোলারকে ছোট ব্যাকগ্রাউন্ড এক্সচেঞ্জগুলি পরিচালনা করতে দেয়। অ্যান্ড্রয়েডের ব্লুটুথ স্ট্যাক এবং বিক্রেতা ড্রাইভাররা ইতিমধ্যেই বেশিরভাগ ভারী উত্তোলন পরিচালনা করে, তবে বিকাশকারীরা সেই সীমানাকে সম্মান করে এমন শক্তি-সচেতন কোড লিখে একটি বড় পার্থক্য করতে পারে৷
প্রথম নিয়মটি সহজ:দায়িত্বের সাথে স্ক্যান করুন . ব্লুটুথ পাওয়ার প্রোফাইলে ক্রমাগত স্ক্যানিং হল এক নম্বর ভিলেন। প্রতিটি স্ক্যান রেডিও, কন্ট্রোলার এবং প্রায়শই হোস্ট প্রসেসরকে জাগিয়ে তোলে। যদি আপনার অ্যাপ ক্রমাগত BluetoothLeScanner.startScan() কল করে একটি পরিষ্কার স্টপ কন্ডিশন ছাড়াই, আপনি কার্যকরভাবে প্রতি কয়েক সেকেন্ডে লো পাওয়ার আইল্যান্ডে একটি টর্চলাইট জ্বলছেন।
পরিবর্তে, আপনার স্ক্যানগুলি ব্যাচ করুন এবং ফিল্টারগুলি ব্যবহার করুন৷ সিস্টেমের ScanSettings.SCAN_MODE_LOW_POWER মোড বিশেষভাবে স্ক্যান করার অনুমতি দেওয়ার জন্য ডিজাইন করা হয়েছে যা LPI ট্রানজিশনের সাথে সহযোগিতা করে।
এখানে AOSP এর একটি উদাহরণ যা দেখায় যে আপনি কীভাবে একটি পাওয়ার-বান্ধব উপায়ে একটি স্ক্যান ট্রিগার করতে পারেন:
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
.setReportDelay(5000) // batch results every 5 seconds
.build();
bluetoothLeScanner.startScan(filters, settings, scanCallback);
ফলাফল ব্যাচ করে এবং হার্ডওয়্যারকে অভ্যন্তরীণভাবে স্ক্যান করার অনুমতি দিয়ে, আপনি হোস্ট ওয়েকআপগুলি নাটকীয়ভাবে হ্রাস করেন। ব্লুটুথ কন্ট্রোলার নিজে থেকেই বিজ্ঞাপন সংগ্রহ করতে পারে, ফলাফল দেওয়ার জন্য প্রতি কয়েক সেকেন্ডে একবার CPU-কে জাগিয়ে তোলে।
দ্বিতীয় নিয়ম হল স্ট্যাকটিকে ঘুমাতে দেওয়া . অনেক ডেভেলপার অজান্তেই ওয়েক লক ধরে রেখে বা অপ্রয়োজনীয় কলব্যাক চালিয়ে ব্লুটুথ থ্রেড ব্লক করে। অ্যান্ড্রয়েড ব্লুটুথ স্ট্যাক বার্তা লুপের মাধ্যমে অভ্যন্তরীণ সিঙ্ক্রোনাইজেশন বজায় রাখে যা নিষ্ক্রিয় সময়কালে নিরাপদে বিরতি দিতে পারে।
BluetoothGattCallback.onCharacteristicChanged() এর মতো কলব্যাকগুলিতে দীর্ঘস্থায়ী ক্রিয়াকলাপগুলি এড়িয়ে চলুন৷ . পরিবর্তে, Android এর ডোজ এবং অ্যাপ স্ট্যান্ডবাই নীতিগুলিকে সম্মান করে এমন ব্যাকগ্রাউন্ড এক্সিকিউটরদের কাজ অফলোড করে৷
আরেকটি অপ্টিমাইজেশন হল সংযোগের ব্যবধান এবং লেটেন্সি বুদ্ধিমানের সাথে ব্যবহার করা . BLE সংযোগ আপনাকে কনফিগার করতে দেয় যে ডিভাইসগুলি কত ঘন ঘন প্যাকেট বিনিময় করে। একটি ছোট ব্যবধান প্রতিক্রিয়াশীলতা উন্নত করে কিন্তু শক্তি পোড়ায়। একটি দীর্ঘ ব্যবধান কন্ট্রোলারকে ইভেন্টগুলির মধ্যে বিশ্রাম নেওয়ার আরও সুযোগ দেয়। যদি আপনার ব্যবহারের ক্ষেত্রে এটির অনুমতি দেয়, সংযোগগুলি শুরু করার সময় উচ্চতর সংযোগ ব্যবধান এবং পেরিফেরাল লেটেন্সি মানগুলি চয়ন করুন৷
// Example: Requesting a higher connection interval in GATT
bluetoothGatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER);
হুডের নীচে, এটি ব্লুটুথ কন্ট্রোলারকে তার স্নিফ ব্যবধানকে দীর্ঘ করতে বলে, লিঙ্কের উভয় প্রান্তকে কম পাওয়ার মোডে আরও বেশি সময় ব্যয় করতে দেয়। ফলে ব্যাকগ্রাউন্ড আপডেট বা সেন্সর রিডের জন্য ব্যবহারকারীর অভিজ্ঞতার উপর প্রায় কোন দৃশ্যমান প্রভাব ছাড়াই ব্যাটারি লাইফ দীর্ঘ হয়।
সিস্টেম স্তরে, ইঞ্জিনিয়ারদের টিউনিং প্ল্যাটফর্ম আচরণ পাওয়ার HAL এবং কার্নেল কনফিগারেশনের প্যারামিটারগুলিকেও সামঞ্জস্য করতে পারে। /sys/power ডিরেক্টরিতে CPU ধারণ এবং কন্ট্রোলার ওয়েক থ্রেশহোল্ডের জন্য টিউনেবল রয়েছে। perfetto, systrace, এবং btsnooz.py-এর মতো টুলগুলি ব্লুটুথ পাওয়ার ইভেন্টগুলিকে কল্পনা করতে পারে, যা নিশ্চিত করতে সাহায্য করে যে ঘুমের চক্র প্রত্যাশা অনুযায়ী ঘটছে৷
উদাহরণস্বরূপ, প্রতি সেকেন্ডে অনেক বেশি ওয়েকআপ দেখানো একটি ট্রেস এইরকম দেখতে পারে:
bluetooth_host_state: SUSPENDED → ACTIVE
reason: controller wake (LL control packet)
interval: 150 ms
আপনি যদি অল্প সময়ের মধ্যে এরকম কয়েক ডজন ওয়েকআপ দেখতে পান, তাহলে এটি একটি অত্যধিক আক্রমণাত্মক সংযোগ ব্যবধান বা পেরিফেরাল থেকে ধ্রুবক GATT বিজ্ঞপ্তি নির্দেশ করতে পারে। এই পরামিতিগুলিকে সামঞ্জস্য করা হলে ওয়েক ব্যবধান মিলিসেকেন্ডের পরিবর্তে সেকেন্ডে নামিয়ে আনতে পারে, যা শক্তি দক্ষতার ব্যাপক উন্নতি করে৷
তৃতীয় এবং সম্ভবত সবচেয়ে গুরুত্বপূর্ণ নিয়ম হল জানুন কখন ছেড়ে দিতে হবে . যখন আপনার অ্যাপটি একটি ব্লুটুথ অপারেশন শেষ করে, সর্বদা GATT সংযোগ বন্ধ করুন, স্ক্যান করা বন্ধ করুন এবং রেফারেন্স প্রকাশ করুন৷ অনেক ডেভেলপার এই পদক্ষেপটি ভুলে যান, ভূত সংযোগ বা স্ক্যানগুলিকে পটভূমিতে নীরবে চলমান রেখে। প্রত্যেকটি শীতকালে একটি জানালা খোলা রাখার মতো:হিটারটি আরও বেশি কাজ করে এবং ব্যাটারির আয়ু ক্ষতিগ্রস্থ হয়৷
অবশেষে, মনে রাখবেন যে প্রতিটি ব্লুটুথ ইভেন্ট হোস্ট ওয়েকআপের যোগ্য নয়। আধুনিক কন্ট্রোলাররা এনক্রিপশন রিফ্রেশ, তত্ত্বাবধানের সময়সীমা, এবং বিজ্ঞাপন ফিল্টারিং সম্পূর্ণভাবে তাদের নিজস্বভাবে পরিচালনা করতে পারে। হার্ডওয়্যার বিশ্বাস করুন। অ্যান্ড্রয়েডের লো পাওয়ার আইল্যান্ড এবং ব্লুটুথ স্ট্যাক বুদ্ধিমত্তার সাথে অর্পণ করার জন্য ডিজাইন করা হয়েছে। আপনার অ্যাপ যত কম হস্তক্ষেপ করবে, নাচ তত মসৃণ হবে।
লো পাওয়ার আইল্যান্ডের জন্য অপ্টিমাইজ করা বৈশিষ্ট্যগুলি অক্ষম করার বিষয়ে নয়৷ এটি স্তরগুলির মধ্যে সাদৃশ্য তৈরি করার বিষয়ে। অ্যান্ড্রয়েড ফ্রেমওয়ার্ক, কার্নেল এবং কন্ট্রোলার ফার্মওয়্যার ইতিমধ্যেই একটি অর্কেস্ট্রায় অভিজ্ঞ সঙ্গীতজ্ঞদের মতো যোগাযোগ করে৷ আপনার কোড যে ensemble অন্য উপকরণ. হালকাভাবে খেলুন, নীরবতার জন্য জায়গা ছেড়ে দিন এবং বাকি সিস্টেমকে শ্বাস নিতে দিন।
আপনি যখন এটি সঠিকভাবে করেন, আপনার ব্যবহারকারীরা কখনই একটি জিনিস লক্ষ্য করবেন না। তাদের ইয়ারবাডগুলি অবিলম্বে পুনরায় সংযোগ করবে, তাদের ফিটনেস ট্র্যাকারগুলি শান্তভাবে সিঙ্ক হবে এবং তাদের ফোনগুলি প্রতিদিন অতিরিক্ত কয়েক ঘন্টা স্থায়ী হবে৷ পর্দার আড়ালে, ঘুম ও জাগরণের সেই নির্মল ছন্দ চলতেই থাকে, লো পাওয়ার আইল্যান্ড অ্যান্ড্রয়েড ব্লুটুথে নিয়ে আসে এমন মার্জিত ভারসাম্য দ্বারা চালিত৷
উপসংহার:আপনার ফোনের ভিতরে শান্ত প্রতিভা
আপনার ফোন যদি একজন মিউজিশিয়ান হয়ে থাকে, তাহলে লো পাওয়ার আইল্যান্ড হবে তার নীরব মেট্রোনোম, সময় বজায় রাখা, তাল ধরে রাখা, এবং সুরটি কখনই একটি বীট এড়িয়ে যায় না তা নিশ্চিত করে। এটি মনোযোগ দাবি করে না বা এর কাজ সম্পর্কে গর্ব করে না। এটি কেবল পটভূমিতে বিদ্যমান, এমনভাবে শক্তি সঞ্চয় করে যা বেশিরভাগ লোকেরা কখনই বুঝতে পারে না।
এই পুরো যাত্রা জুড়ে, আমরা দেখেছি কিভাবে লো পাওয়ার আইল্যান্ড হার্ডওয়্যার এবং সফ্টওয়্যারের মধ্যে মিটিং পয়েন্ট হিসাবে কাজ করে, যেখানে নীরবতা কৌশল হয়ে ওঠে। আমরা এই ধারণা দিয়ে শুরু করেছি যে আপনার সিপিইউ, অনেকটা অস্থির বন্ধুর মতো, শ্বাস নেওয়ার জন্য একটি জায়গা প্রয়োজন। আমরা তখন দেখেছি যে ব্লুটুথ, সমস্ত রেডিওর মধ্যে সবচেয়ে সামাজিক, যখন সিস্টেমের বাকি অংশ ঘুমের দিকে চলে যায় তখন চিৎকারের পরিবর্তে ফিসফিস করতে শেখে৷ একসাথে, তারা Android এর ডিজাইনের সবচেয়ে সূক্ষ্ম কিন্তু শক্তিশালী প্রক্রিয়াগুলির মধ্যে একটি গঠন করে৷
ব্লুটুথ কন্ট্রোলার সিলিকন সিটির নাইট গার্ড হয়ে ওঠে। যখন বড় CPU কোরগুলি বন্ধ গেটের পিছনে নিশ্চিন্তে ঘুমায়, তখন নিয়ামক নীরবে টহল দেয়, সংযোগগুলিকে বাঁচিয়ে রাখে, সিগন্যাল শোনে এবং সত্যিকারের গুরুত্বপূর্ণ কিছু ঘটলেই বেল বাজায়। এটি একটি ছোট কিন্তু গুরুত্বপূর্ণ সহযোগিতার কাজ যা আধুনিক অ্যান্ড্রয়েড ডিভাইসগুলিকে তাদের কমনীয়তা দেয়৷
পর্দার আড়ালে, পাওয়ার HAL নীতিগুলি নিয়ে আলোচনা করে, কার্নেল সেগুলিকে প্রয়োগ করে এবং ফার্মওয়্যার অস্ত্রোপচারের নির্ভুলতার সাথে সেগুলিকে কার্যকর করে৷ তারা অর্কেস্ট্রার মতো চলে, কখনও প্রাণবন্ত, কখনও নীরব, তবে সর্বদা সাদৃশ্যে। এবং যখন আপনার ফোন মিউজিক বাজানোর জন্য, একটি কল করতে বা আপনার ইয়ারবাডগুলি পুনরায় সংযোগ করার জন্য অবিলম্বে জেগে ওঠে, তখন সেই মসৃণতা ভাগ্য নয়৷ এটি লো পাওয়ার আইল্যান্ড ঠিক যা করার জন্য এটি তৈরি করা হয়েছিল:পাওয়ার ম্যানেজমেন্টকে অদৃশ্য মনে করা।
বিকাশকারীদের জন্য, এই সিস্টেমটি বোঝা কেবল কৌতূহলের অনুশীলন নয়। এটি একটি অনুস্মারক যে সত্য অপ্টিমাইজেশান সর্বদা পাশবিক শক্তি বা দ্রুত কোড থেকে আসে না। কখনও কখনও এটি সংযম থেকে আসে, কখন ছেড়ে দিতে হবে, কখন বিশ্রাম নিতে হবে এবং কখন সিস্টেমটিকে তার শান্ত জাদু করতে দিতে হবে তা জানা থেকে। প্রতিটি ছোট সিদ্ধান্ত, ব্যাচিং স্ক্যান, সংযোগের ব্যবধান সামঞ্জস্য করা, ঘুমের সীমানাকে সম্মান করা, ভারসাম্যের একটি বড় গল্পে অবদান রাখে।
পরের বার যখন আপনার ফোনটি ব্লুটুথ স্ট্রিমিং, নেভিগেশন এবং নোটিফিকেশনের পুরো দিনের মধ্য দিয়ে ঝাঁকুনি ছাড়া করে, সেই কাঁচের স্ক্রিনের নীচে কী ঘটছে তা উপলব্ধি করতে কিছুক্ষণ সময় নিন। ভিতরে, ট্রানজিস্টরের একটি শহর ঘুমিয়ে আছে তবুও জেগে আছে, শান্ত অথচ সতর্ক, নিখুঁত সিঙ্ক্রোনাইজেশনে একসাথে কাজ করছে। লো পাওয়ার আইল্যান্ড শুধু একটি ইঞ্জিনিয়ারিং কৌশল নয়। এটি একটি দর্শন:এমনকি যন্ত্রের জগতেও শান্তি এবং ধৈর্য ধ্রুব গতির চেয়ে বেশি শক্তিশালী হতে পারে।
এবং যদি আপনি এটি সম্পর্কে চিন্তা করেন, এটি ফোন এবং মানুষ উভয়ের জন্যই একটি শিক্ষা রাখার মতো।
বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন