2011-09-21 15 views
36

task killer ऐप्स की उपयोगीता पर बहस है, लेकिन मुझे आश्चर्य है: वे वास्तव में कैसे काम करते हैं? विशेष प्रक्रिया को मारना कैसे संभव है?कार्य हत्यारों कैसे काम करते हैं?

क्या इसके लिए कोई एपीआई है, और यदि ऐसा है तो वास्तव में क्या करता है?

संपादित

वर्थ जोड़ने: मैंने देखा कार्य हत्यारा क्षुधा not rooted devices पर प्रक्रियाओं को बंद। तो, मुझे आश्चर्य है कि प्रक्रिया को मारना कैसा है, जो आपके एंड्रॉइड में नहीं है?

+1

के बारे में पढ़ा पर होना चाहिए http://android.stackexchange.com/ –

+21

खैर मुझे लगता है कि इसकी एक वास्तविक सवाल है जो इतना के अंतर्गत आता है: वह जानना चाहता है कि क्यों एंड्रॉइड पर प्रक्रियाओं को मारने के लिए प्रोग्रामेटिक रूप से संभव है। यह मेरी आंखों से संबंधित प्रोग्रामिंग और एक बहुत ही समेकित प्रश्न है। – theomega

+0

एंड्रॉइड/मल्टीटास्किंग के लिए: http://android-developers.blogspot.com/2010/04/multitasking-android-way.html –

उत्तर

51

संक्षेप में, स्वचालित टास्क किलर वर्तमान में चल रही प्रक्रियाओं और उनकी स्मृति की स्मृति के लिए ओएस को मतदान करके काम करते हैं। फिर या तो एक बुद्धिमान एल्गोरिदम या उपयोगकर्ता इनपुट के साथ टास्क किलर सिस्टम को कॉल को जारी करते हैं जो सिस्टम को प्रक्रिया को मारने के लिए कहता है। दो एपिस हैं जो आप कर सकते हैं।

वे हैं

  • Process.killProcess(int pid)
  • ActivityManager.killBackgroundProcesses(String packageName)

Process.killProcess(int pid) लागू द्वारा यह पहला काम करता है जहां pid एक विशिष्ट प्रक्रिया के लिए अद्वितीय पहचानकर्ता है। एंड्रॉइड प्रक्रियाओं को उसी तरह मारता है जैसे लिनक्स करता है; हालांकि, उपयोगकर्ता केवल उन प्रक्रियाओं को मार सकता है जिनके पास वे हैं। एंड्रॉइड में प्रत्येक ऐप एक अद्वितीय यूआईडी (उपयोगकर्ता आईडी) के साथ चलाया जाता है। इस एपीआई का उपयोग करने वाले ऐप्स केवल ऐप ही अपनी प्रक्रियाओं को मार सकते हैं, इसलिए निम्नलिखित explanation in the docs for Process.killProcess(int pid):

दिए गए पीआईडी ​​के साथ प्रक्रिया को मार दें। ध्यान दें कि, हालांकि यह एपीआई हमें अपने पीआईडी ​​के आधार पर किसी भी प्रक्रिया को मारने का अनुरोध करने की अनुमति देता है, कर्नेल अभी भी मानक प्रतिबंध लगाएगा जिस पर आप वास्तव में को मारने के लिए सक्षम हैं। आम तौर पर इसका मतलब केवल कॉलर के पैकेज/एप्लिकेशन और उस ऐप द्वारा बनाई गई अतिरिक्त प्रक्रियाओं को चलाने की प्रक्रिया है; एक सामान्य यूआईडी साझा करने वाले पैकेज भी एक दूसरे की प्रक्रियाओं को मारने में सक्षम होंगे।

जब इस विधि को signal कहा जाता है तो ओएस द्वारा उत्पन्न होता है और प्रक्रिया में भेजा जाता है। जब भी कोई प्रक्रिया ओएस से सिग्नल प्राप्त करती है तो उसे या तो उस सिग्नल को संभालना चाहिए या तुरंत मरना चाहिए। SIG_KILL जैसे संकेतों को संभाला नहीं जा सकता है और परिणामस्वरूप प्राप्तकर्ता प्रक्रिया की तत्काल मृत्यु हो सकती है। यदि आप उन प्रक्रियाओं को मारना चाहते हैं जिनके पास आपके पास मारने के लिए विशेषाधिकार नहीं हैं, यानी यह आपकी प्रक्रिया नहीं है, तो आपको उपयोगकर्ताओं को स्विच करना होगा या अपने विशेषाधिकारों को बढ़ाना होगा (एंड्रॉइड पर डिवाइस पर रूट विशेषाधिकारों की आवश्यकता है)।

दूसरा एपीआई ActivityManager में निर्मित बताकर काम करता है कि आप एक विशिष्ट पैकेज से जुड़े प्रक्रियाओं को मारने के लिए चाहते हैं। यह एपीआई आपकी यूआईडी प्रक्रिया की यूआईडी से मेल खाने की आवश्यकता के आसपास हो जाती है क्योंकि इसे उपयोगकर्ता को KILL_BACKGROUND_PROCESSES अनुमति स्वीकार करने की आवश्यकता होती है। यह अनुमति ओएस को संकेत देती है कि उपयोगकर्ता द्वारा कार्य हत्यारा के रूप में उपयोगकर्ता द्वारा अनुमोदित किया गया है। जब कोई टास्क किलर ऐप को मारना चाहता है, तो यह ओएस को प्रक्रिया को मारने के लिए कहता है कि ऐप को केवल उन प्रक्रियाओं को मारने में सक्षम होने की समस्या को हल करने की इजाजत मिलती है।

Android Docs it says that this API actually uses the first Process.killProcess API

में सिस्टम तुरंत दिया पैकेज के साथ जुड़े सभी पृष्ठभूमि प्रक्रियाओं को बंद करें। यह कर्नेल के समान है जो स्मृति को पुनः प्राप्त करने के लिए उन प्रक्रियाओं को मार रहा है; प्रणाली भविष्य में इन प्रक्रियाओं को भविष्य में पुनरारंभ करने का ख्याल रखेगी।

आप और अधिक जानना चाहते हैं मैं सुझाव है कि आप Posix Signals और The Linux kill command

संबंधित मुद्दे