ওকি ডোকি। আমি জাহান্নামের মধ্য দিয়ে এসেছি এবং এই সমস্যায় ফিরে এসেছি। কীভাবে এগিয়ে যেতে হবে তা এখানে। বাগ আছে। এই পোস্টিংটি কীভাবে বাস্তবায়নে বাগগুলি বিশ্লেষণ করতে এবং সমস্যাগুলি সম্পর্কে কাজ করে তা বর্ণনা করে।
কেবল সংক্ষেপে বলা যায়, জিনিসগুলি কীভাবে কাজ করার কথা। চলমান পরিষেবাদিগুলি প্রতি 30 মিনিট বা তার পরে নিয়মিতভাবে বেয়াদবি এবং সমাপ্ত হবে। এর চেয়ে বেশি সময়ের জন্য বেঁচে থাকতে চায় এমন পরিষেবাগুলিতে অবশ্যই পরিষেবা.স্টার্টফোরগ্রাউন্ড কল করতে হবে, যা বিজ্ঞপ্তি বারে একটি বিজ্ঞপ্তি রাখে, যাতে ব্যবহারকারীরা জানতে পারেন যে আপনার পরিষেবা স্থায়ীভাবে চলছে এবং সম্ভাব্যভাবে ব্যাটারির জীবন চুষছে। কেবলমাত্র 3 টি পরিষেবা প্রক্রিয়া যেকোন সময় তাদেরকে অগ্রভাগের পরিষেবা হিসাবে মনোনীত করতে পারে। যদি তিনটিরও বেশি অগ্রণী পরিষেবাদি থাকে তবে অ্যান্ড্রয়েড পুরানো পরিষেবাটিকে স্ক্যাভেঞ্জিং এবং সমাপ্তির জন্য প্রার্থী হিসাবে মনোনীত করবে।
দুর্ভাগ্যক্রমে, অ্যান্ড্রয়েডে অগ্রণী পরিষেবাগুলি অগ্রাধিকারের ক্ষেত্রে বাগ রয়েছে, যা পরিষেবা বাইন্ডিং পতাকাগুলির বিভিন্ন সংমিশ্রণ দ্বারা ট্রিগার করা হয়। যদিও আপনি নিজের পরিষেবাটিকে অগ্রভাগের পরিষেবা হিসাবে সঠিকভাবে মনোনীত করেছেন, অ্যান্ড্রয়েড যাইহোক আপনার পরিষেবাটি বন্ধ করতে পারে, যদি আপনার প্রক্রিয়াতে পরিষেবার সাথে কোনও সংযোগ কখনও বাধ্যতামূলক পতাকাগুলির নির্দিষ্ট সংমিশ্রণ দ্বারা তৈরি করা হয়ে থাকে। বিস্তারিত নীচে দেওয়া হল।
দ্রষ্টব্য যে খুব কম পরিষেবাগুলির অগ্রভাগ পরিষেবা হওয়া দরকার। সাধারণত, আপনার যদি কেবল কোনও ধরণের ক্রমাগত সক্রিয় বা দীর্ঘ-চলমান ইন্টারনেট সংযোগ থাকে যা চালু এবং বন্ধ করা যায় বা ব্যবহারকারীরা বাতিল করে দেয় তবে আপনার কেবল অগ্রভাগ পরিষেবা হতে হবে। অগ্রাধিকারের স্থিতির প্রয়োজন এমন পরিষেবার উদাহরণ: ইউপিএনপি সার্ভারগুলি, খুব বড় ফাইলগুলির দীর্ঘকালীন চলমান ডাউনলোডগুলি, উই-ফাই দ্বারা ফাইল সিস্টেমগুলিকে সিঙ্ক করতে এবং সঙ্গীত বাজানো।
যদি আপনি কেবল মাঝে মাঝে ভোটদান করেন, বা সিস্টেম ব্রডকাস্ট রিসিভারগুলি বা সিস্টেম ইভেন্টের জন্য অপেক্ষা করছেন, আপনি টাইমার বা আপনার ব্রডকাস্ট রিসিভারের প্রতিক্রিয়ায় আপনার পরিষেবা জাগিয়ে তুলতে আরও ভাল। এটি পরিষেবার জন্য নকশাকৃত আচরণ। আপনার যদি কেবল বেঁচে থাকতেই হয় তবে পড়ুন।
বক্সগুলি সুপরিচিত প্রয়োজনীয়তার (যেমন, সার্ভিস.স্টার্টফোরগ্রাউন্ডে কল করা) বোতামগুলি পরীক্ষা করে দেখার পরের স্থানটি কনটেক্সট.বাইন্ডসোর্সী কলগুলিতে আপনি যে পতাকাগুলি ব্যবহার করছেন তা হ'ল। বাঁধতে ব্যবহৃত পতাকাগুলি বিভিন্ন অপ্রত্যাশিত উপায়ে লক্ষ্য পরিষেবা প্রক্রিয়াটির অগ্রাধিকারকে প্রভাবিত করে। সর্বাধিক বিশেষত, নির্দিষ্ট বাইন্ডিং পতাকা ব্যবহারের ফলে অ্যান্ড্রয়েডকে ভুলভাবে আপনার অগ্রভাগের পরিষেবাটি একটি নিয়মিত পরিষেবাতে ডাউনগ্রেড করতে পারে। প্রক্রিয়া অগ্রাধিকার বরাদ্দ করতে ব্যবহৃত কোডটি বেশ ভারীভাবে মন্থন করা হয়েছে। উল্লেখযোগ্যভাবে, API 14+ এ সংশোধনী রয়েছে যা পুরানো বাইন্ডিং ফ্ল্যাগগুলি ব্যবহার করার সময় বাগের কারণ হতে পারে; এবং 4.2.1 এ নির্দিষ্ট বাগ রয়েছে।
এই সমস্ত ক্ষেত্রে আপনার বন্ধু হ'ল সিসডাম্প ইউটিলিটি, যা ক্রিয়াকলাপ পরিচালক আপনার পরিষেবা প্রক্রিয়াকে কোন অগ্রাধিকার অর্পণ করেছে এবং এটির ক্ষেত্রে কোনও ভুল অগ্রাধিকার দেওয়া হয়েছে তা চিহ্নিত করার জন্য এটি ব্যবহার করা যেতে পারে। আপনার পরিষেবাটি চালু এবং চলমান পান এবং তারপরে আপনার হোস্ট কম্পিউটারে একটি কমান্ড প্রম্পট থেকে নিম্নলিখিত কমান্ডটি জারি করুন:
adb শেল ডাম্পসিস ক্রিয়াকলাপের প্রক্রিয়া> tmp.txt
সামগ্রীগুলি পরীক্ষা করার জন্য নোটপ্যাড (ওয়ার্ডপ্যাড / লিখন নয়) ব্যবহার করুন।
প্রথমটি যাচাই করুন যে আপনি অগ্রভাগ অবস্থায় আপনার পরিষেবা সফলভাবে পরিচালনা করতে পেরেছেন। ডাম্পসিস ফাইলের প্রথম বিভাগে প্রতিটি প্রক্রিয়াটির জন্য ক্রিয়াকলাপ ব্যবস্থাপক বৈশিষ্ট্যগুলির বিবরণ রয়েছে। নীচের মত একটি লাইন অনুসন্ধান করুন যা ডাম্পসিস ফাইলের প্রথম বিভাগে আপনার আবেদনের সাথে মিলে যায়:
অ্যাপ্লিকেশন ইউআইডি 10068 প্রসেসরেকর্ড {41937d40 2205: tunein.service / u0a10068}
নিম্নলিখিত বিভাগে অগ্রভাগ সার্ভিসগুলি = সত্য যাচাই করুন। লুকানো এবং খালি সেটিংস সম্পর্কে চিন্তা করবেন না; তারা প্রক্রিয়াটির ক্রিয়াকলাপের অবস্থা বর্ণনা করে এবং সেগুলির সাথে পরিষেবাগুলির সাথে প্রক্রিয়াগুলির জন্য বিশেষভাবে প্রাসঙ্গিক বলে মনে হয় না। যদি ফোরগ্রাউন্ডসেবাটি সত্য না হয় তবে এটি সত্য করার জন্য আপনাকে পরিষেবা.স্টার্টফোরগ্রাউন্ডে কল করতে হবে।
আপনার পরবর্তী জিনিসটি দেখতে হবে "প্রসেস এলআরইউ তালিকা (oom_adj অনুসারে বাছাই করা):" শিরোনামের ফাইলটির শেষের নিকটবর্তী বিভাগটি। এই তালিকার এন্ট্রিগুলি আপনাকে নির্ধারণ করতে দেয় যে অ্যান্ড্রয়েড আসলে আপনার অ্যাপ্লিকেশনটিকে অগ্রভাগের পরিষেবা হিসাবে শ্রেণিবদ্ধ করেছে কিনা। যদি আপনার প্রক্রিয়া এই তালিকার নীচে থাকে, তবে এটি সংক্ষিপ্ত বিবরণ জন্য প্রধান প্রার্থী। যদি আপনার প্রক্রিয়া তালিকার শীর্ষের কাছাকাছি থাকে তবে এটি কার্যত অবিনাশযোগ্য।
এই টেবিলের একটি লাইন তাকান:
Proc
এটি পুরোপুরি পরিষেবাটির একটি উদাহরণ যা সবকিছু ঠিকঠাক করেছে। এখানে মূল ক্ষেত্রটি হ'ল "adj =" ক্ষেত্র। এটি আপনার প্রক্রিয়াটি অ্যাক্টিভিটি ম্যানেজার সার্ভিসেস দ্বারা সবকিছু সম্পন্ন হওয়ার পরে নির্ধারিত অগ্রাধিকারটিকে নির্দেশ করে। আপনি এটি "adj = prcp" (দৃশ্যমান অগ্রভাগ পরিষেবা) হতে চান; বা "adj = ভিজ" (কোনও ক্রিয়াকলাপের সাথে দৃশ্যমান প্রক্রিয়া) বা "সামনে" (অগ্রভাগের ক্রিয়াকলাপ সহ প্রক্রিয়া)। যদি এটি "অ্যাড = এসসিসি" (পরিষেবাদি প্রক্রিয়া), বা "অ্যাড = এসসিসিবি" (উত্তরাধিকার পরিষেবা?), বা "অ্যাজড = বাক" (খালি পটভূমি প্রক্রিয়া) থাকে, তবে আপনার প্রক্রিয়াটি সমাপ্তির সম্ভাব্য প্রার্থী, এবং অবসান হবে মেমরি পুনরুদ্ধার করতে কোনও চাপ না থাকলেও প্রতি 30 মিনিটের চেয়ে কম ঘন ঘন ঘন ঘন কম না। লাইনের অবশিষ্ট পতাকাগুলি বেশিরভাগই গুগল ইঞ্জিনিয়ারদের জন্য ডায়াগনস্টিক ডিবাগ তথ্য। সমাপ্তির সিদ্ধান্তগুলি পার্শ্ববর্তী ক্ষেত্রগুলির উপর ভিত্তি করে নেওয়া হয়। সংক্ষেপে, / এফএস একটি অগ্রভাগ পরিষেবা নির্দেশ করে; / এফএ কোনও ক্রিয়াকলাপের সাথে অগ্রভাগ প্রক্রিয়া নির্দেশ করে indicates / বি একটি পটভূমি পরিষেবা নির্দেশ করে। শেষে লেবেলটি সাধারণ নিয়মকে নির্দেশ করে যার অধীনে প্রক্রিয়াটিকে একটি অগ্রাধিকার অর্পণ করা হয়েছিল। সাধারণত এটি adj = ক্ষেত্রের সাথে মিলিত হওয়া উচিত; তবে অন্যান্য পরিষেবাদি বা ক্রিয়াকলাপের সাথে সক্রিয় বাঁধাইয়ের জন্য পতাকা বাঁধনের কারণে কিছু ক্ষেত্রে অ্যাডওয়্যার = মানটি উপরের বা নীচের দিকে সামঞ্জস্য করা যেতে পারে।
আপনি যদি কোনও বাঁধাই পতাকা সহ একটি বাগের উপর দিয়ে ট্রিপ করে ফেলেছেন তবে ডাম্পস লাইনটি দেখতে এটি দেখতে পাবেন:
Proc
নোট ক্ষেত্রটির মান কীভাবে ভুলভাবে "adj = বাক" (খালি ব্যাকগ্রাউন্ড প্রক্রিয়া) এ সেট করা আছে তা নোট করুন, যা প্রক্রিয়া বিচ্ছুরণের উদ্দেশ্যে "দয়া করে আমাকে এখনই শেষ করুন যাতে আমি এই অর্থহীন অস্তিত্ব শেষ করতে পারি" to লাইনটির শেষে (fg-service) পতাকাটিও নোট করুন যা নির্দেশ করে যে "ভুলে যাওয়া পরিষেবা নিয়মগুলি" অ্যাজড "সেটিংস নির্ধারণ করতে ব্যবহৃত হয়েছিল। fg-পরিষেবাদি বিধি ব্যবহৃত হয়েছিল সত্ত্বেও, এই প্রক্রিয়াটি একটি অ্যাডেজ সেটিং বরাদ্দ করা হয়েছিল "বক", এবং এটি বেশি দিন বাঁচবে না Pla সহজভাবে বলতে গেলে এটি একটি বাগ।
সুতরাং লক্ষ্যটি হ'ল আপনার প্রক্রিয়া সর্বদা "adj = prcp" (বা আরও ভাল) হয় তা নিশ্চিত করা। এবং এই লক্ষ্য অর্জনের জন্য পদ্ধতিটি হ'ল বাঁধাকৃত পতাকাগুলিকে টুইঙ্ক করা যতক্ষণ না আপনি অগ্রাধিকারের কার্যভারে বাগগুলি এড়ানোর ব্যবস্থা না করেন।
আমি যে বাগগুলি জানি সেগুলি এখানে। (1) যদি কোনও পরিষেবা বা ক্রিয়াকলাপ প্রাসঙ্গিক ব্যবহার করে সেবার সাথে কখনও আবদ্ধ হয়ে থাকে BI বি। এ। বি। এ। এ। বি। এ। এটি বিশেষত সত্য যদি আপনার যদি পরিষেবার মধ্যেও বাইন্ডিং থাকে। 4.2.1 উত্সগুলিতে একটি স্পষ্ট বাগ g (২) পরিষেবা-পরিষেবা-বাঁধাইয়ের জন্য অবশ্যই BIND_ABOVE_CLIENT কখনই ব্যবহার করবেন না। কার্যকলাপ-থেকে-পরিষেবা সংযোগের জন্য এটি ব্যবহার করবেন না। BIND_ABOVE_CLIENT আচরণ বাস্তবায়নের জন্য ব্যবহৃত পতাকাটি প্রতি সংযোগ ভিত্তির পরিবর্তে প্রতি-প্রক্রিয়া ভিত্তিতে সেট করা মনে হয়, সুতরাং এটি কোনও সক্রিয় ক্রিয়াকলাপ-থেকে-পরিষেবাতে না থাকলেও পরিষেবা-থেকে-পরিষেবা বাইন্ডিং সহ বাগগুলি ট্রিগার করে পতাকা সেট সঙ্গে বাঁধাই। প্রক্রিয়াটিতে পরিষেবা-থেকে-পরিষেবা বাইন্ডিংয়ের সাথে একাধিক পরিষেবা থাকলে অগ্রাধিকার প্রতিষ্ঠায় সমস্যা রয়েছে বলে মনে হয়। পরিষেবা-থেকে-পরিষেবা বাইন্ডিংগুলিতে কনটেক্সট.বি.আই.বি.উইউবিআইপিআরআইআরআই (এপিআই 14) ব্যবহার করা সহায়তা বলে মনে হচ্ছে। প্রসঙ্গ.বি.আই.আইআইআইআইএমআইআইএমআইপিটিটিকে কোনও ক্রিয়াকলাপ থেকে কোনও পরিষেবায় বাধ্যতামূলক করার সময় আরও কম বা কম ধারণা বলে মনে হয়। ক্রিয়াকলাপটি যখন থামানো বা সমাপ্ত হয় তখন কোনও আপত্তিজনক ক্ষতি না করেই কার্যকলাপটি অগ্রভাগে থাকা অবস্থায় আপনার প্রক্রিয়াটির অগ্রাধিকারটিকে এক দশমিক উচ্চতর বাধা দেয়।
তবে সামগ্রিকভাবে, কৌশলটি হ'ল সাইনডাম্পটি নির্দেশ করে যে আপনার প্রক্রিয়াটি সঠিক অগ্রাধিকার প্রাপ্ত না হওয়া পর্যন্ত আপনার বাইন্ডসাইজার পতাকাগুলি সামঞ্জস্য করা।
আমার উদ্দেশ্যগুলির জন্য, প্রসঙ্গটি ব্যবহার করুন BI বিবিND_AUTO_CREATE | প্রযোজনা-পরিষেবা-পরিষেবা বাইন্ডিংগুলি এবং প্রসঙ্গের জন্য প্রসঙ্গ.বি.আই.আইআইআইআইএমআইএমআইটি। প্রসঙ্গ। বিবিND_WAIVE_PRIORITY পরিষেবা থেকে পরিষেবা বাইন্ডিংয়ের জন্য সঠিক কাজটি মনে হচ্ছে। আপনার মাইলেজ পৃথক হতে পারে।
আমার অ্যাপটি মোটামুটি জটিল: দুটি ব্যাকগ্রাউন্ড পরিষেবা, যার প্রতিটি স্বতন্ত্রভাবে অগ্রভাগের পরিষেবাগুলির রাজ্যগুলি ধরে রাখতে পারে, তৃতীয়টি তৃতীয়টি যা অগ্রভাগের পরিষেবা রাষ্ট্র গ্রহণ করতে পারে; দুটি পরিষেবা শর্তাধীন একে অপরের সাথে আবদ্ধ; তৃতীয়টি সর্বদা প্রথমটিকে আবদ্ধ করে। এছাড়াও, অ্যাক্টিভিটগুলি একটি পৃথক প্রক্রিয়াতে চালিত হয় (অ্যানিমেশনটিকে মসৃণ করে তোলে)। একই প্রক্রিয়াতে ক্রিয়াকলাপ এবং পরিষেবাদি চালানো কোনও তাত্পর্যপূর্ণ বলে মনে হয় না।
স্ক্যাভেঞ্জিং প্রক্রিয়াগুলির জন্য নিয়মের প্রয়োগকরণ, (এবং সিস্টডাম্প ফাইলগুলির বিষয়বস্তু উত্পন্ন করতে উত্স কোড ব্যবহৃত হয়) মূল অ্যান্ড্রয়েড ফাইলে পাওয়া যাবে
frameworks\base\services\java\com\android\server\am\ActivityManagerService.java.
খারাপ সুযোগ.
পিএস: অ্যান্ড্রয়েড 5.0 এর জন্য সিসডাম্প স্ট্রিংয়ের ব্যাখ্যা এখানে। আমি তাদের সাথে কাজ করি নি, তাই আপনি যা চান তা তৈরি করুন। আমি বিশ্বাস করি যে আপনি 4 টি 'এ' বা 'এস', এবং 5 টি "আইএফ" বা "আইবি" হতে চান এবং 1 টি যতটা সম্ভব কম হতে হবে (সম্ভবত 3 এর নিচে, যেহেতু কেবলমাত্র তিনটি অগ্রভাগের পরিষেবা প্রক্রিয়া সক্রিয় রয়েছে ডিফল্ট কনফিগারেশন)।
Example:
Proc # : prcp F/S/IF trm: 0 31719: neirotech.cerebrum.attention:blePrcs/u0a77 (fg-service)
Format:
Proc # {1}: {2} {3}/{4}/{5} trm: {6} {7}: {8}/{9} ({10}
1: Order in list: lower is less likely to get trimmed.
2: Not sure.
3:
B: Process.THREAD_GROUP_BG_NONINTERACTIVE
F: Process.THREAD_GROUP_DEFAULT
4:
A: Foreground Activity
S: Foreground Service
' ': Other.
5:
-1: procState = "N ";
ActivityManager.PROCESS_STATE_PERSISTENT: procState = "P ";
ActivityManager.PROCESS_STATE_PERSISTENT_UI:procState = "PU";
ActivityManager.PROCESS_STATE_TOP: procState = "T ";
ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND: procState = "IF";
ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND: procState = "IB";
ActivityManager.PROCESS_STATE_BACKUP:procState = "BU";
ActivityManager.PROCESS_STATE_HEAVY_WEIGHT: procState = "HW";
ActivityManager.PROCESS_STATE_SERVICE: procState = "S ";
ActivityManager.PROCESS_STATE_RECEIVER: procState = "R ";
ActivityManager.PROCESS_STATE_HOME: procState = "HO";
ActivityManager.PROCESS_STATE_LAST_ACTIVITY: procState = "LA";
ActivityManager.PROCESS_STATE_CACHED_ACTIVITY: procState = "CA";
ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: procState = "Ca";
ActivityManager.PROCESS_STATE_CACHED_EMPTY: procState = "CE";
{6}: trimMemoryLevel
{8} Process ID.
{9} process name
{10} appUid