কীভাবে অ্যান্ড্রয়েড আমার প্রক্রিয়া হত্যার অনুকরণ করতে পারে


174

অ্যান্ড্রয়েড কোনও প্রক্রিয়াটি ব্যাকগ্রাউন্ডে থাকলে হত্যা করে এবং ওএস সিদ্ধান্ত নেয় যে এটির সংস্থান প্রয়োজন (র‌্যাম, সিপিইউ ইত্যাদি)। পরীক্ষার সময় আমার এই আচরণটি অনুকরণ করতে সক্ষম হওয়া দরকার যাতে আমি নিশ্চিত করতে পারি যে আমার অ্যাপ্লিকেশনটি সঠিকভাবে আচরণ করছে। আমি এটি একটি স্বয়ংক্রিয় পদ্ধতিতে করতে সক্ষম হতে চাই যাতে এটি যখনই ঘটে তখনই অ্যাপ্লিকেশনটি সঠিকভাবে আচরণ করে কিনা তা পরীক্ষা করে দেখতে পারি, যার অর্থ আমাকে প্রতিটি ক্রিয়াকলাপে এটি পরীক্ষা করতে হবে ইত্যাদি etc.

আমি জানি আমার প্রক্রিয়াটি কীভাবে হত্যা করা যায়। সমস্যা নেই। সমস্যা হল যখন আমি আমার প্রক্রিয়া হত্যা (DDMS ব্যবহার করে, হয় adb shell kill, Process.killProcess()ইত্যাদি) অ্যান্ড্রয়েড এটা একই ভাবে এটা করবে কি Android OS এটি নিজে হত্যা করেছে পুর্নসূচনা করবেন না।

যদি অ্যান্ড্রয়েড ওএস প্রক্রিয়াটি হ্রাস করে (রিসোর্সের প্রয়োজনীয়তার কারণে), যখন ব্যবহারকারী অ্যাপ্লিকেশনটিতে ফিরে আসে অ্যান্ড্রয়েড প্রক্রিয়াটি পুনরায় তৈরি করবে এবং তারপরে ক্রিয়াকলাপের স্ট্যাক (কলিং onCreate()) এর শীর্ষ ক্রিয়াকলাপটি পুনরায় তৈরি করবে ।

অন্যদিকে, আমি যদি প্রক্রিয়াটি মেরে ফেলি তবে অ্যান্ড্রয়েড ধরে নিয়েছে যে ক্রিয়াকলাপের স্ট্যাকের শীর্ষে থাকা কার্যকলাপটি খারাপভাবে আচরণ করা হয়েছিল , সুতরাং এটি স্বয়ংক্রিয়ভাবে প্রক্রিয়াটি পুনরায় তৈরি করে এবং তারপরে ক্রিয়াকলাপের স্ট্যাক থেকে শীর্ষস্থানীয় কার্যকলাপটি সরিয়ে দেয় এবং নীচে থাকা ক্রিয়াকলাপটি পুনরায় তৈরি করে শীর্ষ কার্যকলাপ (কলিং অনক্রিট () re)। এটি আমি চাই আচরণ নয়। অ্যান্ড্রয়েড যখন প্রক্রিয়াটি মেরে ফেলেছিল তেমন আচরণ করতে চাই।

কেবল চিত্রেরূপে ব্যাখ্যা করার জন্য, যদি আমার ক্রিয়াকলাপের স্ট্যাকটি এমন দেখায়:

    ActivityA -> ActivityB -> ActivityC -> ActivityD

যদি অ্যান্ড্রয়েড প্রক্রিয়াটিকে মেরে ফেলে এবং ব্যবহারকারী অ্যাপ্লিকেশনটিতে ফিরে আসে, অ্যান্ড্রয়েড প্রক্রিয়াটি পুনরায় তৈরি করে এবং ক্রিয়াকলাপ তৈরি করে।

আমি যদি প্রক্রিয়াটি মেরে ফেলি তবে অ্যান্ড্রয়েড প্রক্রিয়াটি পুনরায় তৈরি করে এবং ক্রিয়াকলাপ তৈরি করে।


4
আপনি কি ব্যাকগ্রাউন্ডে আপনাকে হত্যা করতে প্রয়োজনীয় পরিমাণ প্রসেস তৈরি করতে পারবেন না?
অ্যালেক্স W


2
@ পাং আমি মনে করি আপনি পয়েন্টটি মিস করছেন। আমি জানি যে কীভাবে অ্যান্ড্রয়েড প্রক্রিয়াটিকে হত্যা করেছে detect আমার কাছে এমন কোড রয়েছে যা এই শর্তগুলি পরিচালনা করে। আমি যা করতে চাই তা হ'ল সঠিকভাবে (এবং একটি স্বয়ংক্রিয় পদ্ধতিতে) এই কোডটি পরীক্ষা করা । এটি করার জন্য, আমার সাধারণত প্রক্রিয়া সংস্থান চাপের মধ্যে যেমন হয় তেমনভাবে আমার প্রক্রিয়াটিকে মেরে ফেলার জন্য অ্যান্ড্রয়েডকে উস্কে দেওয়ার কিছু উপায় আমার প্রয়োজন। লিঙ্কযুক্ত প্রশ্নটি আকর্ষণীয় হলেও এখানে কোনও মান যুক্ত করে না।
ডেভিড ওয়াসার


@ আইগরগানাপলস্কি লিঙ্কগুলির জন্য ধন্যবাদ, তবে আসলে এই লিঙ্কগুলির কোনওটিরই সমস্যার সমাধান নেই।
ডেভিড ওয়াসার

উত্তর:


127

আমার জন্য এটি পরীক্ষা করার সর্বোত্তম উপায়টি এটি করছিল:

  • আপনার অ্যাপ্লিকেশনটিতে ক্রিয়াকলাপ খুলুন
  • হোম বোতাম টিপুন
  • Terminate Applicationঅ্যান্ড্রয়েড স্টুডিওতে লগক্যাট উইন্ডোতে টিপুন (এটি অ্যাপ্লিকেশন প্রক্রিয়াটিকে হত্যা করবে, নিশ্চিত করুন যে আপনি আপনার ডিভাইসটি নির্বাচন করেছেন এবং শীর্ষে লোগক্যাট ড্রপডাউনগুলিতে প্রক্রিয়াটি নিশ্চিত করুন)
  • হোম দীর্ঘ প্রেস বা খোলা অ্যাপস (ডিভাইসের উপর নির্ভরশীল) এর সাহায্যে অ্যাপ্লিকেশনটিতে ফিরে যান
  • অ্যাপ্লিকেশনটি পুনরায় তৈরি করা অ্যাক্টিভিটি ডিতে শুরু হবে (অ্যাক্টিভিটিএ, অ্যাক্টিভিটিবি, অ্যাক্টিভিটি সি মারা গেছে এবং আপনি যখন তাদের কাছে ফিরে আসবেন তখন পুনরায় তৈরি করা হবে)

কিছু ডিভাইসে আপনি অ্যাপ্লিকেশন -> আপনার লঞ্চার আইকন সহ অ্যাপ্লিকেশনটিতে (অ্যাক্টিভিটিডি) ফিরে যেতে পারেন তবে অন্যান্য ডিভাইসে এটি এর পরিবর্তে অ্যাক্টিভিটিএ শুরু করবে।

অ্যান্ড্রয়েড ডক্স এটি সম্পর্কে যা বলছে:

সাধারণত যখন ব্যবহারকারী হোম স্ক্রীন থেকে সেই কাজটি পুনরায় নির্বাচন করেন তখন সিস্টেমটি নির্দিষ্ট পরিস্থিতিতে কোনও কাজ (রুট ক্রিয়াকলাপের উপরের স্ট্যাক থেকে সমস্ত ক্রিয়াকলাপ সরিয়ে দেয়) সিস্টেমটি সাফ করে দেয়। সাধারণত, যদি ব্যবহারকারী নির্দিষ্ট সময়, যেমন 30 মিনিটের জন্য টাস্কটি না দেখে থাকে তবে এটি করা হয়।


2
আপনার উত্তরের জন্য ধন্যবাদ তবে এটি আমার পক্ষে কার্যকর নয় কারণ স্বয়ংক্রিয় পরীক্ষার জন্য আমার এটি করার জন্য একটি স্বয়ংক্রিয় পদ্ধতি দরকার।
ডেভিড ওয়াসার

1
এটি আমার জন্য সত্যই সহায়ক ছিল।
জন রবার্টস

6
এটি স্বয়ংক্রিয় নয় তবে এটি আমার উদ্দেশ্যগুলির জন্য পুরোপুরি কাজ করেছে worked পদক্ষেপ 2 এড়ানো না যাওয়া খুব গুরুত্বপূর্ণ । এটি কাজ করার জন্য ডিডিএমএসে প্রক্রিয়া বন্ধ করার আগে আপনাকে অবশ্যই অ্যাপটিকে পটভূমিতে প্রেরণ করতে হবে। যেখানে ডক কোট এটা থেকে এসেছিলেন হতাশ তাদের জন্য এর এখানে । যদিও আমি নিশ্চিত নই যে তারা প্রকৃতপক্ষে বিষয়টির সাথে সম্পর্কিত কারণ এটি <activity>ম্যানিফেস্টে ট্যাগ সম্পর্কে ।
টনি চ্যান

1
ঠিক আমার যা প্রয়োজন ছিল। ধন্যবাদ. যারা জানেন না তাদের জন্য, ডিডিএমএস গ্রহপথে রয়েছে, উইন্ডোতে যান -> দৃষ্টিকোণটি খুলুন এবং আপনার এটি সেখানে পাওয়া উচিত।
রিচার্ড

4
বিকল্পভাবে আপনি "বিকাশ বিকল্পগুলি" এ যেতে পারেন এবং ব্যাকগ্রাউন্ড সীমাটি "কোনও ব্যাকগ্রাউন্ড প্রক্রিয়া নেই" তে সেট করতে পারেন তারপরে আপনি যখনই বাড়িতে চাপবেন তখন প্রক্রিয়াটি মারা যাবে।
জোওও গাওয়াজি

56

এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে:

adb shell am kill <package_name>

এটি adb shell killওপি দ্বারা উল্লেখ করার চেয়ে আলাদা ।

নোট করুন যে am killকমান্ডের জন্য সহায়তা বলেছে:

am kill: Kill all processes associated with <PACKAGE>.  Only kills.
  processes that are safe to kill -- that is, will not impact the user
  experience.

সুতরাং, এটি অগ্রভাগে থাকলে প্রক্রিয়াটি হারাবে না। এটি ওপিতে যেমনটি চেয়েছিল তেমন কাজ করে বলে মনে হচ্ছে যে আমি যদি আমার অ্যাপ থেকে দূরে চলে যাই তবে adb shell am kill <package_name>এটি চালান যা অ্যাপটিকে মেরে ফেলবে (আমি psএটি ডিভাইসে ব্যবহার করে নিশ্চিত করেছি )। তারপরে আমি যদি অ্যাপটিতে ফিরে আসি তবে আমি আগের ক্রিয়াকলাপে ফিরে এসেছি - যেমন ওপি'র উদাহরণে প্রক্রিয়াটি পুনরায় তৈরি হয়ে অ্যাক্টিভিটি তৈরি করে (বরং অন্যান্য ক্রিয়াকলাপ হত্যার অন্যান্য পদ্ধতির মতো অ্যাক্টিভিসি)।

দুঃখিত, আমি ওপিটির জন্য কয়েক বছর দেরি করেছি, তবে আশা করি অন্যরাও এটি দরকারী পাবেন।


ধন্যবাদ! এই আমি কি খুঁজছিলাম! আমি উল্লেখ করতে চাই যে এই আদেশটি তার চেয়ে আলাদা আচরণ করে adb shell am force-stop। এটি সর্বশেষে আপনার অ্যাপ্লিকেশন সম্পর্কিত কোনও মুলতুবি ইন্টেন্ট (বিজ্ঞপ্তিগুলির মতো) সরিয়ে ফেলবে যখন প্রথমটি তা না করে।
Bonnyz

ওএস সোর্স কোডটি অনুসন্ধান করে এমন যে কেউ চিহ্নিত করেছেন যে এটি মেমরির পুনর্বিবেচনার জন্য কোনও প্রক্রিয়া মারা গেলে কোন কোডটি চালিত হয় তা দেখার জন্য - আমার বাজি এটি হ'ল একই কোড am kill
অ্যান্ড্রয়েডজি

অ্যান্ড্রয়েড 7.1 স্যামসাং জে 5 এ কাজ করে না। psআমার অ্যাপ্লিকেশনটি দেখায়
ভালগাল

17

অন্য একটি পদ্ধতি, সম্ভবত এটি এমন যা স্ক্রিপ্টযোগ্য কারণ এটির জন্য ডিডিএমএস প্রয়োজন হয় না:

একটি সময় সেটআপ: বিকাশকারী বিকল্পগুলিতে যান, ব্যাকগ্রাউন্ড প্রক্রিয়া সীমা নির্ধারণ নির্বাচন করুন, 'স্ট্যান্ডার্ড সীমাবদ্ধতা' থেকে 'কোনও পটভূমি প্রক্রিয়া নয়' এ মান পরিবর্তন করুন।

আপনার যখন প্রক্রিয়াটি পুনরায় চালু করতে হবে তখন হোম বোতামটি টিপুন। প্রক্রিয়াটি মারা যাবে (আপনি স্টুডিওতে লগক্যাট / অ্যান্ড্রয়েড মনিটরে যাচাই করতে পারবেন - প্রক্রিয়াটি চিহ্নিত করা হবে [DEAD])। তারপরে টাস্ক সুইচারটি ব্যবহার করে অ্যাপ্লিকেশনটিতে ফিরে যান switch


2
মজাদার. আমি মনে করি এটি ঠিক আছে, অগ্রণী পরিষেবাগুলি প্রভাবিত করে না?
ইগোরগানাপলস্কি

আমার ২.৩.৩ এর পুরানো অ্যান্ড্রয়েড চালিত প্রকৃত ডিভাইসগুলিতে এটি করা দরকার, সুতরাং এটি কোনও সহায়তা নয়।
ডেভিড ওয়াসার

13

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

ওএস দ্বারা অ্যাপ্লিকেশন রিস্টার্ট অনুকরণ করতে, আপনার অ্যাপটি চলাকালীন অ্যাপ্লিকেশন সেটিংসে যান, কোনও অনুমতি অক্ষম করুন (তারপরে আপনি সক্ষম করতে পারেন) এবং সাম্প্রতিক অ্যাপ্লিকেশনগুলি থেকে অ্যাপটি ফিরে আসুন। যখন অনুমতি অক্ষম করা হয়, তখন ওএস অ্যাপ্লিকেশনটিকে হত্যা করে তবে সংরক্ষণের উদাহরণটি রাখে। যখন ব্যবহারকারী অ্যাপটি ফেরত দেয়, অ্যাপ এবং শেষ ক্রিয়াকলাপটি (সংরক্ষিত রাজ্যের সাথে) পুনরায় তৈরি করা হয়।

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

উদাহরণ:

আমাদের অ্যাপের দুটি ক্রিয়াকলাপ রয়েছে। ক্রিয়াকলাপ হ'ল প্রধান ক্রিয়াকলাপ যা লঞ্চার থেকে শুরু হয়েছিল। অ্যাক্টিভিটিবিটি অ্যাক্টিভিএএ থেকে শুরু হয়েছে। আমি কেবল অনক্রিট, অনস্টার্ট, অনস্টপ, অনডাস্ট্রয়ে পদ্ধতিগুলি দেখাব। অ্যান্ড্রয়েড সবসময় অনসটপ কল করার আগে সেভইনস্ট্যান্সস্টেটে কল করে, কারণ স্টপ স্টেটে থাকা একটি ক্রিয়াকলাপ সিস্টেমে মারা যেতে পারে। [ https://developer.android.com/references/android/app/Activity.html# ক্রিয়াকলাপের চক্র]

অনুমতি পদ্ধতি:

<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop (the order is like this, it is stopped after new one is started)
<go settings>
ActivityB onStop
<disable a permission>
//Application is killed, but onDestroy methods are not called.
//Android does not call onDestroy methods if app will be killed.
<return app by recent apps>
Application onCreate (this is the important part. All static variables are reset.)
ActivityB onCreate WITH savedInstance (user does not notice activity is recreated)
//Note that ActivityA is not created yet, do not try to access it.
ActivityB onStart
<return ActivityA by back>
ActivityA onCreate WITH savedInstance (user does not notice activity is recreated)
ActivityA onStart
ActivityB onStop
ActivityB onDestroy
<press back again, return launcher>
ActivityA onStop
ActivityA onDestroy
<open app again>
//does not call Application onCreate, app was not killed
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart

আমি অন্যান্য উত্তরগুলির সাথে উল্লিখিত অন্যান্য পদ্ধতির তুলনা করতে চাই।

ক্রিয়াকলাপ রাখবেন না: এটি প্রয়োগকে হত্যা করে না।

<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop
ActivityA onDestroy (do not keep)
<return launcher by home button>
ActivityB onStop
ActivityB onDestroy (do not keep) 
<retun app from recent apps>
// NO Application onCreate
ActivityB onCreate WITH savedInstance (user does not notice activity recreated)
ActivityB onStart
<return ActivityA by back>
ActivityA onCreate WITH savedInstance (user does not notice activity recreated)
ActivityA onStart
ActivityB onStop
ActivityB onDestroy
<press back again, return launcher>
ActivityA onStop
ActivityA onDestroy
<open app again>
//does not call Application onCreate, app was not killed
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart

ফোর্স স্টপ পদ্ধতি: সংরক্ষিত উদাহরণ স্টেটগুলি সঞ্চয় করে না

<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop
<go settings>
ActivityB onStop
<force stop, return app from recent apps>
Application onCreate
ActivityA onCreate WITHOUT savedInstance 
//This is important part, app is destroyed by user.
//Root activity of the task is started, not the top activity.
//Also there is no savedInstance.

~ " অ্যাপ্লিকেশনটিকে এর পরিষেবা সহ সিস্টেমের দ্বারা হত্যা করা যেতে পারে "।
পূর্বাভাস

@ ডেভিডওয়াসার অনুমানটি পড়ুন! বিকাশকারী.অ্যান্ড্রয়েড. com/guide/compferences/services.html# অগ্রভাগ একটি অগ্রভাগ পরিষেবা একটি পরিষেবা যা ব্যবহারকারী সক্রিয়ভাবে সচেতন এবং মেমরি কম থাকলে সিস্টেমটি মারা যাওয়ার প্রার্থী নয়।
ইগোরগানাপলস্কি

3
@ ইগরগানাপলস্কি ডকুমেন্টেশনটি দুর্দান্ত, বিশেষত যদি এটি সম্পূর্ণ এবং সঠিক হয় (যা এটি দুর্ভাগ্যক্রমে নয়) তবে আমি সাধারণত প্রকৃত ব্যক্তিগত পর্যবেক্ষণের উপর বেশি নির্ভর করি। আমি একটি অগ্রভাগ Serviceবহুবার নিহত দেখেছি । এমনকি সিস্টেমটি মেমরি কম নয়। বেশিরভাগ ডিভাইস নির্মাতারা ব্যাটারি শক্তি বাঁচাতে অ্যান্ড্রয়েড ওএসে তাদের নিজস্ব "অপ্টিমাইজেশন" এবং "উন্নতি" লিখেছেন। স্ট্যান্ডার্ড অ্যান্ড্রয়েডের তুলনায় প্রচুর ডিভাইসে অনেক বেশি আক্রমণাত্মক "খুনি" রয়েছে।
ডেভিড ওয়াসার

@ ডেভিডওয়াসার মেলা পর্যবেক্ষণ তাহলে এত বছর পরেও আপনি কি সমাধান নিয়ে এসেছেন?
ইগোরগানাপলস্কি

@ ইগোরগানাপলস্কি নং। আমি এই সমস্যার কোনও সমাধান পাইনি। এ কারণেই প্রশ্নটি এখনও উন্মুক্ত।
ডেভিড ওয়াসার

7

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

adb shell ps | grep <package name> | awk '{print $2}' | xargs adb shell run-as <package name again> kill

অ্যাপ্লিকেশন স্থিতি হারাবে না এবং আমার নিজের অভিজ্ঞতা থেকে এটি ওএস পটভূমিতে অ্যাপটিকে মেরে ফেলার মতো কাজ করে। এটি কেবল ডিবাগ নির্মিত অ্যাপ্লিকেশনগুলির জন্য কাজ করে


আমি পেয়েছি'grep' is not recognized as an internal or external command, operable program or batch file.
ডেল

তবে আমি শেলটিতে থাকাকালীন run-as <package name> kill 7379এটি করেছি, তবে এটি আমাকে পূর্বের ক্রিয়াকলাপে রেখেছিল, আমি হোম বোতামটি টিপানোর সময় আমার যে ক্রিয়াকলাপ ছিল তা নয়।
ডেল

6

আপনি এটি অ্যান্ড্রয়েড স্টুডিওতে এটি করেন।

  1. ডিবাগ মোডে আপনার ডিভাইসটি আপনার কম্পিউটারের সাথে সংযুক্ত করুন।
  2. আপনার ডিভাইসে অ্যাপ্লিকেশনটি খুলুন এবং যে কোনও ক্রিয়াকলাপটিতে যান "মৃত থেকে এটিতে ফিরে যান" পরীক্ষা করতে চান।
  3. আপনার ডিভাইসে হোম বোতাম টিপুন।
  4. অ্যান্ড্রয়েড স্টুডিওতে অ্যান্ড্রয়েড মনিটর -> মনিটরে যান এবং টার্মিনেট অ্যাপ্লিকেশন আইকনটি টিপুন।
  5. এখন আপনি হয় সাম্প্রতিক অ্যাপ্লিকেশনগুলির মাধ্যমে বা এটির লঞ্চ আইকনে ক্লিক করে আপনার অ্যাপ্লিকেশনটিতে ফিরে যেতে পারেন, আমার পরীক্ষাগুলিতে আচরণ একই রকম ছিল।

2
এটি কোনও সাহায্য নয়। আমার পরীক্ষামূলক স্যুটটির মধ্যে এই প্রোগ্রামক্রমেটিকভাবে করা দরকার। যা হোক ধন্যবাদ.
ডেভিড ওয়াসার

এছাড়াও, এই উত্তরটি মার্কের উত্তরের মতো প্রায় একই রকম।
ডেভিড ওয়াসার

ইউআইএআউটোমেটর বা এসপ্রেসোর মাধ্যমে কীভাবে এটি করবেন কোনও ধারণা?
ইগোরগানাপলস্কি

আমি খুঁজে পাচ্ছি না Android Monitor - Monitors। তারা কিছু থেকে মুক্তি পেয়েছে of আমি v 3.2.1 এ আছি
ডেল

1
@ ডেল অ্যান্ড্রয়েড ডিভাইস মনিটরের অ্যান্ড্রয়েড স্টুডিও ৩.১ এ অবমুক্ত করা হয়েছিল এবং অ্যান্ড্রয়েড স্টুডিও ৩.২ থেকে সরানো হয়েছিল।
ভালগাল

5

হোম বোতামের সাহায্যে অ্যাপ্লিকেশনটিকে পটভূমিতে রাখুন

অ্যান্ড্রয়েড স্টুডিওতে "লগক্যাট" মোডে আপনার প্রক্রিয়াটি নির্বাচন করুন, তারপরে নীচে কোণায় অ্যাপ্লিকেশন টার্মিনেট ক্লিক করুন

সমাপ্ত বোতাম

এখন অ্যান্ড্রয়েড ডিভাইসে লঞ্চার থেকে আপনার অ্যাপ্লিকেশনটি লঞ্চ করুন


সম্পাদনা: ইন্টারনেট অনুসারে নিম্নলিখিতগুলিও কাজ করে:

 adb shell am kill [my-package-name]

ভবিষ্যত থেকে সম্পাদনা করুন: লক্ষ করার মতো কিছু, অ্যান্ড্রয়েড স্টুডিও ৪.০ এ পরিবর্তন হয়েছে, আপনি যদি Runএএস থেকে ব্যবহার করেন তবে Terminateএকটি জারি করবে Force Stop

তবে, আপনি যদি পরে লঞ্চারটি থেকে লঞ্চ করেন এবং তারপরে আপনি এটিকে অনুকরণ করার চেষ্টা করেন, তবে আপনি পছন্দসই ফলাফলগুলি পাবেন (কম স্মৃতির আচরণ)।


এটি একটি সদৃশ উত্তর
16

@ অনিক অন্যান্য সমস্তগুলিতে ডিডিএমএস এবং যা কিছু যাবতীয় অপ্রয়োজনীয় ফ্লাফ রয়েছে। যদিও প্রযুক্তিগতভাবে হ্যাঁ, স্ট্যাকওভারফ্লো.com / a / 41975750 / 2413303 একই জিনিস বলে। হয়তো আমার ছবি যুক্ত করা উচিত।
এপিকপান্ডা ফোরস

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

the behaviour is not the same as what happens when Android kills the processহ্যা এটাই
EpicPandaForce

এই প্রক্রিয়াটি আমাকে পূর্ববর্তী ক্রিয়াকলাপটি দেখায়, যখন হোম বোতামটি টিপানো হয় তার কার্যকলাপ নয়।
ডেল

2

আচরণের জন্য পুনরুত্পাদন করার জন্য আপনি পরবর্তী পদক্ষেপগুলি করতে পারেন:

  1. আপনার অ্যাপ্লিকেশনটি খুলুন, শীর্ষ কার্যকলাপে নেভিগেট করুন
  2. অন্য কোনও পূর্ণ-স্ক্রিন অ্যাপ্লিকেশনটিতে নেভিগেট করতে বিজ্ঞপ্তি প্যানেল ব্যবহার করুন (উদাহরণস্বরূপ, সিস্টেম সেটিংসে - ডান উপরের কোণে)
  3. আপনার আবেদন প্রক্রিয়া হত্যা
  4. পিছনে বোতাম টিপুন

1
আপনার উত্তরের জন্য ধন্যবাদ তবে এটি আমার পক্ষে কার্যকর নয় কারণ স্বয়ংক্রিয় পরীক্ষার জন্য আমার এটি করার জন্য একটি স্বয়ংক্রিয় পদ্ধতি দরকার।
ডেভিড ওয়াসার

সুতরাং, এটিই কেবলমাত্র একটি পদ্ধতি যা আমি পেয়েছিলাম আসলে অ্যান্ড্রয়েড ক্লিয়ারিং মেমরিটি অনুকরণ করে এবং আপনার অ্যাপ্লিকেশনটি মেরে ফেলেছে (আমার এপিআই স্তরটি 19 এর, এবং তাই আমি প্রেরণ-ছাঁটা-মেমরি কমান্ডটি ব্যবহার করতে পারি না)। অন্যান্য কমান্ড যেমন এডিবি শেল এম ফোর্স-স্টপ com.my.app.package বা কিল, উপরের পদ্ধতি অনুসরণ করে একই সঠিক প্রক্রিয়া পুনরুত্পাদন করবে না!
মার্ক গার্সিয়া

2

সেটিংসের অধীনে বিকাশকারী বিকল্পগুলিতে, 'ক্রিয়াকলাপগুলি রাখবেন না' নির্বাচন করুন, যা এগুলি থেকে দূরে সরে যাওয়ার সাথে সাথে ক্রিয়াকলাপগুলি ধ্বংস করবে।

দ্রষ্টব্য: নীচে সহায়ক মতামত অনুসারে, যদি আপনি স্থির মানগুলি সাফ হওয়ার বিষয়ে চিন্তা না করেন তবে এটি ব্যবহার করুন।


এটি কার্যকরভাবে এক বছর আগে সমাধান - ইতিমধ্যে পোস্ট করা এবং প্রত্যাখ্যান - সমান। পার্থক্যটি কেবলমাত্র একটি এমুলেটরটিতে সেট করার জন্য ব্যবহৃত অ্যাপ্লিকেশন হিসাবে মনে হয়, সাম্প্রতিক ফোনগুলি যা এটি সমর্থন করে vs
ক্রিস স্ট্রাটন 21

1
দুঃখিত, ক্রিস স্ট্রাটন যেমন বলেছেন, এটি অন্যান্য উত্তরগুলির মতোই একই পরামর্শ। এটি অ্যান্ড্রয়েড সমাপ্তি কার্যক্রম সম্পর্কে নয়। এটি অ্যান্ড্রয়েড পুরো প্রক্রিয়াটি হত্যার বিষয়ে (যা এটি নিয়মিত এবং কার্যকরভাবে করে, বিশেষত অ্যান্ড্রয়েড ৪.x চালিত এইচটিসি ডিভাইসে)।
ডেভিড ওয়াসার

6
এটি প্রায় ভাল তবে এটি প্রক্রিয়াটিকে হত্যা করবে না, এটি কেবল ক্রিয়াকলাপটিকেই ধ্বংস করে দেয়। এর মানে কী? আপনার ক্রিয়াকলাপটি SaveInstanceState দিয়ে খোলা হবে তবে সমস্ত স্ট্যাটিক ভেরিয়েবলগুলি এখনও প্রক্রিয়াধীন রয়েছে। প্রক্রিয়া কিল করার পরে সমস্ত স্ট্যাটিক ভেরিয়েবলগুলিও সাফ হয়ে যায়।
চিহ্নিত করুন

1

হোম বোতাম টিপুন এবং অ্যাপটিকে প্রথমে পটভূমিতে রাখুন। তারপরে ডিডিএমএস বা এডিবি থেকে প্রক্রিয়াটি বন্ধ বা হত্যা করুন।


আপনার উত্তরের জন্য ধন্যবাদ তবে এটি আমার পক্ষে কার্যকর নয় কারণ স্বয়ংক্রিয় পরীক্ষার জন্য আমার এটি করার জন্য একটি স্বয়ংক্রিয় পদ্ধতি দরকার।
ডেভিড ওয়াসার

আপনার ক্রিয়াকলাপটি বর্তমানে অগ্রভাগে থাকলে অ্যান্ড্রয়েড কখনই আপনার প্রক্রিয়াটিকে হত্যা করবে না। আপনি এমন একটি শর্ত পরীক্ষা করার চেষ্টা করছেন যা কখনই ঘটে না। যদি আপনার ক্রিয়াকলাপ ব্যাকগ্রাউন্ডে থাকে তবে এর রাজ্যটি ইতিমধ্যে সংরক্ষিত হয়েছে এবং আপনি এটিকে ম্যানুয়ালি মেরে ফেলা এবং অ্যান্ড্রয়েড এটিকে কম স্মৃতিতে হত্যা করা অর্থাৎ প্রক্রিয়াটি সবেমাত্র নিহত হওয়ার মধ্যে কোনও পার্থক্য নেই; লো মেমোরি কিল সম্পর্কে বিশেষ কিছু নেই। যখন মেমরিটি আবার পাওয়া যায় তখন আপনার স্টিকি পরিষেবাদি পুনরায় চালু হবে (৪.৪ ব্যতীত) এবং আপনি যখন আইকনটি বা সাম্প্রতিক কাজটি ট্যাপ করবেন তখন স্ট্যাক এবং ক্রিয়াকলাপের অবস্থা পুনরুদ্ধার করা হবে।
মনস্টিয়র

3
আপনার উদাহরণস্বরূপ, এটি ক্রিয়াকলাপ সিটিতে ফিরে যাচ্ছে কারণ আপনি ক্রিয়াকলাপ ডিটিকে স্ক্রিনে দৃশ্যমান হওয়ার সময় প্রক্রিয়াটি মেরেছিলেন (এটি কখনও কম স্মৃতিতেও ঘটবে না) এবং ব্যাকগ্রাউন্ডে থাকার কারণে ক্রিয়াকলাপ সি এর রাজ্যটি সংরক্ষণ করা হয়েছিল। আপনার প্রক্রিয়াটি কেবল তখনই মেরে ফেলা হবে যদি তা অগ্রভাগে একেবারেই না হয় অর্থাত্ কার্যকলাপের ডি এর রাজ্যটি পটভূমিতে গেলে সংরক্ষণ করা যেত এবং এভাবে আপনার প্রক্রিয়াটি মারা গেলেও পুনরুদ্ধার করা হবে। প্রতিটি ক্রিয়াকলাপে আপনার পরীক্ষা করার জন্য, অ্যাপ্লিকেশনটিকে হত্যা করার আগে আপনাকে প্রথমে পটভূমিতে প্রেরণ করতে হবে।
মনস্টিওর

আপনি by "দ্বারা কী বোঝাতে চেয়েছিলেন এবং অ্যাপটিকে প্রথমে পটভূমিতে রেখেছিলেন "?
ইগোরগানাপলস্কি

1

আপনি টার্মিনাল থেকে আপনার ডিভাইস / এমুলেটরটির সাথেও সংযোগ করতে পারেন adb shell, তারপরে আপনার প্রক্রিয়াটির পিআইডি পান ps | grep <your_package_nameএবং সম্পাদন করুন kill -9 <pid>। তারপরে সাম্প্রতিক অ্যাপস চয়নকারী থেকে আপনার ন্যূনতম অ্যাপ্লিকেশনটি খুলুন এবং এটি শেষ ক্রিয়াকলাপটি পুনরায় চালু করবে


অ্যান্ড্রয়েড কি কম মেমরির পরিস্থিতিতে কোনও প্রক্রিয়া হত্যার মতো? আমি মনে করি ওপি বিশেষত এটি চেয়েছিল ...
ইগোরগানাপলস্কি

1
@ আইগোরগানাপলস্কি তাত্ত্বিকভাবে হ'ল যদিও এটি কোনও মূল ডিভাইসটিতে না থাকলে যদি আপনি এটি করতে পারেন না।
ফ্রান মারজোয়া 19

0

আপনার সমস্যার মূলে মনে হয় Activityআপনি প্রক্রিয়াটি মারার সময় আপনার অগ্রভাগে রয়েছে।

Activityএটি দৃশ্যমান হওয়ার পরে আপনি ডিডিএমএসে স্টপ টিপতে এবং আপনার বাড়ির পরে স্টপ টিপতে এবং পরে অ্যাপটিতে ফিরে এসে তুলনা করে এটি পর্যবেক্ষণ করতে পারেন ।

moveTaskToBack(true)আপনার পরীক্ষাগুলিতে কোনওভাবে নিশ্চিত হয়ে নিন ।


0

আমি নিশ্চিত নই যে আপনি যে উত্তরটি সন্ধান করছেন এটি এটিই যুক্তিযুক্ত চিন্তার মতো।

আমি মনে করি না যে আপনি সত্যিই একটি সম্পূর্ণ স্বয়ংক্রিয় পরীক্ষা করতে পারেন, এটি সিমুলেট করার একমাত্র উপায়, এটি পুনরায় তৈরি করা হবে, এ কেএর এমন অনেকগুলি ক্রিয়াকলাপ রয়েছে যা অ্যান্ড্রয়েড আপনার অ্যাপ্লিকেশনটিকে মেরে ফেলবে।

সুতরাং আমার ধারণা বা পরামর্শটি হ'ল আরেকটি ছোট অ্যাপ তৈরি করা, যা অ্যানড্রয়েডের স্মৃতিশক্তি শেষ না হওয়া পর্যন্ত এবং এটিকে ব্যাকগ্রাউন্ডে হত্যা প্রক্রিয়া শুরু না করা পর্যন্ত নতুন ক্রিয়াকলাপ বাড়িয়ে তোলে।

লাইনের মধ্যে কিছু:

ক্রিয়াকলাপ শুরু করুন আমি -> অ্যাপটি তালিকায় থাকলে চলমান প্রক্রিয়াটি চেক করুন, বর্তমান ক্রিয়াকলাপ বন্ধ না করেই i বৃদ্ধি করুন এবং লুপটি পুনরায় চালু করুন, অন্যথায় -> i হ্রাস করুন এবং বর্তমান ক্রিয়াকলাপটি বন্ধ করুন, আগেরটিতে ফিরে যান এবং যাচাই করুন ...


0

যখন অ্যাপ্লিকেশন প্রক্রিয়াটি মারা যায়, অ্যান্ড্রয়েড ক্রিয়াকলাপের রেকর্ডগুলির মধ্য দিয়ে যায় (এন্ট্রিগুলি ইতিহাসের স্তরের ক্রিয়াকলাপ উপস্থাপন করে), এবং সিদ্ধান্ত নেয় যে কোনটি ইতিহাসে রাখা উচিত এবং কোনটি এ থেকে সরানো উচিত।

এখানে মূল পয়েন্টগুলির মধ্যে একটি হল ActivityRecordক্ষেত্র haveState, যা অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ইঞ্জিনিয়াররা "আমরা শেষ ক্রিয়াকলাপের স্থিতি অর্জন করেছি?" হিসাবে বর্ণনা করে।

ডিফল্টরূপে, অ্যান্ড্রয়েড সেই ক্রিয়াকলাপের একটি রাষ্ট্র রয়েছে বলে বিবেচনা করে। কার্যকলাপ হয়ে রাষ্ট্রহীন যখন আবেদন রিপোর্ট কার্যকলাপ টাস্ক ম্যানেজার সেবার কার্যকলাপ শুরু হয়েছে এবং এই হল বৈধ আবেদন পর্যন্ত সূচিত ফ্রেমওয়ার্ক যে কার্যকলাপ বন্ধ রাষ্ট্র প্রবেশ করেছে। সহজ কথায়, haveStateমান falseমধ্যে কার্যকলাপ onResume()বলা হয় এবং onStop()বা onSaveInstanceState()প্রার্থনা করা হয়, নির্ভর করে আবেদন লক্ষ্য সংস্করণের উপর।

আমি যদি প্রক্রিয়াটি মেরে ফেলি তবে অ্যান্ড্রয়েড প্রক্রিয়াটি পুনরায় তৈরি করে এবং ক্রিয়াকলাপ তৈরি করে।

android:stateNotNeeded="true"এক্ষেত্রে অ্যাক্টিভিটিটির অ্যাপ্লিকেশন ম্যানিফেস্টে কোনও বৈশিষ্ট্য নেই এবং এটি বর্তমানে অগ্রভাগে চলছে, সুতরাং অ্যান্ড্রয়েড এটিকে ইতিহাস থেকে সরিয়ে দেয় কারণ সিস্টেমটি তার শেষের অবস্থাটি পায় নি।

কীভাবে অ্যান্ড্রয়েড আমার প্রক্রিয়া হত্যার অনুকরণ করতে পারে

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

তা সত্ত্বেও, অ্যাপ্লিকেশন প্রক্রিয়া মৃত্যুর দৃশ্যের পরীক্ষার জন্য আরও একটি সহজ উপায় রয়েছে। উপরে বর্ণিত সমস্ত বিবরণ এবং সত্যটি জেনে রাখা, আপনি যদি বর্তমানে চলমান ActivityD থেকে নতুন ক্রিয়াকলাপটি শুরু করেন তবে ActivityD onStop()কলব্যাকটি কেবল ActivityE onResume()পদ্ধতি পরে শুরু করা হয় , আপনি নিম্নলিখিত কৌশলটি করতে পারেন।

class TerminatorActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val isPrePie = applicationInfo.targetSdkVersion < Build.VERSION_CODES.P
        val callbacks = TerminatorLifecycleCallbacks(isPrePie)
        (applicationContext as Application).registerActivityLifecycleCallbacks(callbacks)
    }

    private class TerminatorLifecycleCallbacks(
        // Before P onSaveInstanceState() was called before onStop(), starting with P it's
        // called after
        // Used to schedule the death as app reports server that activity has stopped
        // after the latest of these was invoked
        private val isPrePie: Boolean
    ) : ActivityLifecycleCallbacksDefault {

        private val handler = Handler(Looper.getMainLooper())

        override fun onActivityPostStopped(activity: Activity) {
            if (isPrePie) {
                terminate()
            }
        }

        override fun onActivityPostSaveInstanceState(activity: Activity, outState: Bundle) {
            if (!isPrePie) {
                terminate()
            }
        }

        fun terminate() {
            handler.postDelayed(
                {
                    Process.killProcess(Process.myPid()) // This is the end... 
                },
                LAST_MILLIS
            )
        }

        companion object {
            // Let's wait for a while, so app can report and server can handle the update
            const val LAST_MILLIS = 100L
        }

    }

    private interface ActivityLifecycleCallbacksDefault : Application.ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
        override fun onActivityStarted(activity: Activity) {}
        override fun onActivityResumed(activity: Activity) {}
        override fun onActivityPaused(activity: Activity) {}
        override fun onActivityStopped(activity: Activity) {}
        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
        override fun onActivityDestroyed(activity: Activity) {}
    }
}

তারপরে TerminatorActivityআপনি যখন অ্যাপ্লিকেশনটি হত্যা করতে চান তখনই শুরু করুন ।

শেষে একটা লাইটওয়েট সরঞ্জাম যা সহজসাধ্য আপনার আবেদন প্রক্রিয়া মৃত্যু, নামক পরীক্ষা করছে ভেনম

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.