कार्य की गतिविधि स्टैक देखें


138

मैंने अभी एक सरल एंड्रॉइड एप्लिकेशन विकसित करना शुरू कर दिया है जबकि मैं अभी भी प्लेटफॉर्म सीख रहा हूं।

मैं एडीटी प्लगइन 0.9.6 के साथ ग्रहण आईडीई का उपयोग कर रहा हूं।

मुझे यह जानने की ज़रूरत है कि क्या यह Activityस्टैक देखने के लिए संभव है जो किसी कार्य के साथ जुड़ा हुआ है?

क्या डीडीएमएस उपकरण के माध्यम से या किसी अन्य तकनीक के माध्यम से कोई रास्ता है?

अनिवार्य रूप से मुझे जो कुछ भी चाहिए वह कार्य की स्टैक गतिविधि को देखने में सक्षम होना है ताकि यह सुनिश्चित हो सके कि आवेदन अपेक्षित रूप से व्यवहार करता है।

मुझे पता है कि Intentऑब्जेक्ट में झंडे के उपयोग और <activity>तत्व की कुछ विशेषताओं के माध्यम से कुछ हद तक कार्य व्यवहार को नियंत्रित करना संभव है ।

हालाँकि, एक प्रकार का टूल रखना अच्छा होगा - विशेष रूप से डिबग मोड में या तो - यह डेवलपर्स को Activityसीधे स्टैक को देखने की अनुमति देगा ।


यदि आप एंड्रॉइड स्टूडियो का उपयोग कर रहे हैं, तो मैंने एक समाधान [यहां] [1] पोस्ट किया है। [1]: stackoverflow.com/a/22392616/1798991
नेबु

जवाबों:


164

कमांड लाइन से, आप उपयोग कर सकते हैं: adb shell dumpsys activity

यह गतिविधि प्रबंधक को उसकी वर्तमान स्थिति का एक डंप प्रिंट करने के लिए कहता है। इसका पहला भाग पूर्ण गतिविधि इतिहास है, जो कार्य द्वारा आयोजित किया गया है। उसके बाद भी बहुत सारी चीजें छपी हैं, इसलिए आपको जो भी चाहिए उसे खोजने के लिए थोड़ा स्क्रॉल करने की आवश्यकता हो सकती है।

यहां इसके आउटपुट का एक उदाहरण है (सटीक सामग्री प्लेटफ़ॉर्म संस्करणों में भिन्न होती है), शीर्ष कार्य को दो गतिविधियों के साथ संपर्क करते हुए दिखाया गया है, और इसके पीछे एक गतिविधि वाला लॉन्चर है:

वर्तमान गतिविधि प्रबंधक राज्य में गतिविधियाँ:
  * TaskRecord {44d07218 # 4 एक android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    आत्मीयता = android.task.contacts
    आशय = {अधिनियम = android.intent.action। कोई बिल्ली = [android.intent.category.LAUNCHER] flg = 0x10600000 cmp = com.android.contacts / .DialtactsActive bnds = [125,640] [235,758]}}।
    origActivity = com.android.contacts / .DialtactsContactsEntryActivity
    realActivity = com.android.contacts / .DialtactsActivity
    lastActiveTime = 288203177 (14 के लिए निष्क्रिय)
    * Hist # 8: HistoryRecord {44b87a30 com.android.contacts / .ViewContactorctivity}
        packageName = com.android.contacts processName = android.process.acore
        LaunchFromUid = 10004 ऐप = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        आशय {अधिनियम = android.intent.action.VIEW dat = सामग्री: //com.android.contacts/contacts/lookup/144i148.144i461a29500afc8eeb/1927&mp = com.android.contacts/ .ViewContactActivity}।
        frontOfTask = गलत कार्य = TaskRecord {44d07218 # 4 एक android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .ViewContactActivity
        आधार = / प्रणाली / ऐप / Contacts.apk / प्रणाली / ऐप / Contacts.apk डेटा = / डेटा / डेटा / com.android.contacts
        लेबलRes = 0x7f090012 आइकन = 0x7f02006b थीम = 0x7f0e004
        StateNotNeeded = false ComponentsSpecified = false isHomeActivity = false
        कॉन्फ़िगरेशन = {स्केल = 1.0 imsi = 310/4 loc = en_US स्पर्श = 3 कुंजी = 2/1/2 नौसेना = 2/2 orien = 1 लेआउट = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = पसंदीदा resultCode = 2
        लॉन्चफेल्ड = झूठी हैवस्टेट = झूठी आइकॉल = अशक्त
        राज्य = बंद कर दिया गया = गलत विलंबित हो गया है। गलत = गलत परिष्करण = गलत
        KeyPaused = false inHistory = true persistent = false launchMode = 0
        फुलस्क्रीन = सत्य दृश्यमान = सत्य जमे हुए ।बेस्टडेस्ट्रॉय = गलत थंबनेल। निर्देशित = गलत आइडल = सत्य
        प्रतीक्षाशील = असत्य अब अदृश्य = सत्य
    * Hist # 7: HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity}
        packageName = com.android.contacts processName = android.process.acore
        LaunchFromUid = 10004 ऐप = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        आशय {अधिनियम = android.intent.action। कोई बिल्ली = [android.intent.category.LAUNCHER] flg = 0x10200000 cmp = com.android.contacts / .DialtactsContentsEntryActryActivity bnds = [125,640] [235,758]}}।
        frontOfTask = true task = TaskRecord {44d07218 # 4 एक android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .DialtactsActivity
        आधार = / प्रणाली / ऐप / Contacts.apk / प्रणाली / ऐप / Contacts.apk डेटा = / डेटा / डेटा / com.android.contacts
        लेबलRes = 0x7f090007 आइकन = 0x7f02006b थीम = 0x7f0E0000
        StateNotNeeded = false ComponentsSpecified = true isHomeActivity = false
        कॉन्फ़िगरेशन = {स्केल = 1.0 imsi = 310/4 loc = en_US स्पर्श = 3 कुंजी = 2/1/2 नौसेना = 2/2 orien = 1 लेआउट = 34}
        लॉन्चफेल्ड = गलत हैवेट = सच आइकल = बंडल [mParcelledData.dataSize = 4196]
        राज्य = रोक दिया गया = सत्य देरी से रोका गया। समाप्त = गलत परिष्करण = गलत
        KeyPaused = false inHistory = true persistent = false launchMode = 2
        फुलस्क्रीन = सत्य दृश्यमान = गलत जमे हुएबेस्टरड्रोय = झूठा थंबनेल
  * TaskRecord {44c4ee90 # 2 A com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    आत्मीयता = com.android.launcher
    आशय = {अधिनियम = android.intent.action। कोई बिल्ली = [android.intent.category.HOME] flg = 0x10600000 cmp = com.android.launcher / .Launcher}।
    realActivity = com.android.launcher / .Launcher
    lastActiveTime = 214734838 (73483s के लिए निष्क्रिय)
    * Hist # 6: HistoryRecord {44c4d988 com.android.launcher / .Launcher}
        packageName = com.android.launcher processName = android.process.acore
        LaunchFromUid = 0 ऐप = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        आशय {अधिनियम = android.intent.action। कोई बिल्ली = [android.intent.category.HOME] flg = 0x10000000 cmp = com.android.launcher / .Launcher}।
        frontOfTask = true task = TaskRecord {44c4ee90 # 2 A com.android.launcher}
        taskAffinity = com.android.launcher
        realActivity = com.android.launcher / .Launcher
        आधार = / प्रणाली / एप्लिकेशन / Launcher.apk / प्रणाली / एप्लिकेशन / Launcher.apk डेटा = / डेटा / डेटा / com.android.launcher
        लेबलRes = 0x7f0a0000 आइकन = 0x7f020015 थीम = 0x103005f
        StateNotNeeded = true ComponentsSpecified = false isHomeActivity = true
        कॉन्फ़िगरेशन = {स्केल = 1.0 imsi = 310/4 loc = en_US स्पर्श = 3 कुंजी = 2/1/2 नौसेना = 2/2 orien = 1 लेआउट = 34}
        लॉन्चफेल्ड = गलत हैवेट = सच आइकल = बंडल [mParcelledData.dataSize = 5964]
        राज्य = रोक दिया गया = सत्य देरी से रोका गया। समाप्त = गलत परिष्करण = गलत
        KeyPaused = false inHistory = true persistent = false launchMode = 2
        फुलस्क्रीन = सत्य दृश्यमान = गलत जमे हुएबेस्टरड्रोय = झूठा थंबनेल

क्या लॉगकैट के माध्यम से वर्तमान ऐप के सभी कार्यों और गतिविधियों को दिखाने का एक अच्छा तरीका है? क्या हमें वास्तव में adb कमांड को पार्स करने की आवश्यकता है?
Android डेवलपर

85
इसके अलावा, यदि आप केवल स्टैक में गतिविधियों का नाम देखना चाहते हैं, तो आप ऐसा कर सकते हैं: adb shell <Enter> dumpsys activity | grep -i run
सूर्या विजया मदजीद

6
बहुत बढ़िया जवाब! मैंने एक सुविधा स्क्रिप्ट लिखी है जो किसी दिए गए पैकेज के लिए कार्यों / गतिविधियों को प्राप्त करने के लिए आउटपुट को फ़िल्टर करती है।
sschuberth

5
इसके अलावा adb shell dmpsys activityआप प्रत्येक सूची के लिए प्राप्त कर सकते हैं उदाहरण के adb shell dmpsys activity activitiesलिए गतिविधि प्रबंधन गतिविधियाँ जिनमें मुख्य स्टैक, रनिंग गतिविधियाँ और हाल के कार्य शामिल हैं। dumpsys activity intentsलंबित इरादों के लिए; dumpsys activity broadcastsप्रसारण राज्य के लिए; dumpsys activity providersसामग्री सिद्ध करने वालों के लिए; dumpsys activity servicesसेवाओं के लिए; dumpsys activity processesप्रक्रियाओं को चलाने के लिए।
फ्रेड्रिक गॉस

1
@ SuryaWijayaMadjid की कमांड एक लाइन में की जा सकती है: adb shell dumpsys activity | grep -i runया adb shell dumpsys activity activities | grep -i runथोड़े क्लीनर आउटपुट के लिए।
vaughandroid

58

सिस्टम में कार्यों और बैकस्ट को देखने के लिए आप अपनी कमांड लाइन में निम्न कमांड का उपयोग कर सकते हैं:

adb shell dumpsys activity activities | sed -En -e '/Stack #/p' -e '/Running activities/,/Run #0/p'

या आप टास्कलॉगर की कोशिश कर सकते हैं , एक सरल टूल जो मैंने बनाया है जो आपके ऐप में सभी गतिविधियों और कार्यों की निगरानी कर सकता है, और उन्हें वास्तविक समय में लॉगकैट में आउटपुट कर सकता है।


+1 .... मैंने आपके टास्कलॉगर की कोशिश की है यह अच्छा उपकरण है और मुझे बहुत मदद करता है, लेकिन अवांछित लॉग के हिमस्खलन को प्रिंट करता है।
थिंकडिप

34

मुझे पता है कि यह एक पुराना प्रश्न है लेकिन, इस कार्यक्षमता को अब Android Studio में बेक किया गया है:

Android स्टूडियो स्क्रीनशॉट

फिर परिणामी पाठ फ़ाइल में, ACTIVITY(सभी कैप्स) खोजें:

एंड्रॉयड स्टूडियो पाठ फ़ाइल स्क्रीनशॉट


20
मुझे लगता है कि यह विकल्प अब मौजूद नहीं है क्योंकि एंड्रॉइड स्टूडियो 3.0 में नया एंड्रॉइड प्रोफाइलर विंडो एंड्रॉइड मॉनिटर टूल को बदल देता है।
फ्रूट

5
मैंने इस गुमशुदा समारोह के लिए मुद्दा बनाया: जारी करने वाला। URLissues / 77944626 इसलिए कृपया इसे वोट करें। धन्यवाद
mtrakal

27

यदि आप किसी विशिष्ट पैकेज के कार्य स्टैक का निरीक्षण करना चाहते हैं, तो निम्न कमांड करेंगे:

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist

12

मैं हमेशा लंबे डंप संदेशों के इस हिस्से की जाँच करता हूँ ।।

  Running activities (most recent first):
TaskRecord{4307f828 #56 A com.demo.proj U 0}
  Run #4: ActivityRecord{425a6838 com.demo.proj/com.demo.proj.Activity2}
  Run #3: ActivityRecord{427dc860 com.demo.proj/com.demo.proj.Activity1}
  Run #2: ActivityRecord{420cba18 com.demo.proj/com.demo.proj.MainActivity}
TaskRecord{430341d0 #2 A com.lge.launcher2 U 0}
  Run #1: ActivityRecord{41e0af68 com.lge.launcher2/.Launcher}
TaskRecord{44e26ce0 #18 A com.lge.appbox.client U 0}
  Run #0: ActivityRecord{41e9dbe8 com.lge.appbox.client/.AppBoxClient}

नोट: रन # 4 वह गतिविधि है जिसे आप स्क्रीन पर अब देखते हैं। :)


2
"लंबे डंप संदेश" क्या है?
मैरियन पाडज़िओच

2
@ MarianPa Mardzioch "adb shell dumpsys activity" हमें बहुत लंबे संदेश दिखाती है। यह संदेश, ऊपर, उनमें से एक सा है। वैसे, मुझे एक टिप मिल गया है इससे बच सकते हैं। इसे चलाएं, "adb shell dumpsys activity activities" आप छोटे संदेश देख सकते हैं और गतिविधि स्टैक के बारे में अधिक आसानी से पढ़ सकते हैं। :)
सेमीक्रोमेंस

1
... और यदि वह सूची अभी भी बहुत लंबी है, तो हाल के ऐप्स सूची खोलें और कुछ कार्यों को स्वाइप करें।
बैरी फ्रूटमैन

10

आप उपकरण hierarchyviewer.bat का उपयोग कर सकते हैं। यह android SDK का हिस्सा है। यह केवल हालांकि एमुलेटर के साथ काम करता है। लेकिन यह बहुत अधिक आरामदायक और स्पष्ट है।

संपादित करें: मुझे सिर्फ ग्रहण के भीतर पदानुक्रम दर्शक मिला! और यह वास्तविक उपकरणों के साथ भी काम करता है। बस परिप्रेक्ष्य खोलें विंडोज-> ओपन पर्सपेक्टिव-> पदानुक्रम देखें सूची में आप सभी कनेक्टेड डिवाइस और एमुलेटर और गतिविधि स्टैक देख सकते हैं। और पेड़ के दृश्य के अलावा आप स्वयं दृश्य के बारे में अधिक जानकारी देख सकते हैं।

संपादित करें: पदानुक्रम व्यूअर केवल डेवलपर उपकरणों के साथ काम करेगा। उत्पादन उपकरण सुरक्षा कारणों से ऐसा नहीं कर सकते। अधिक जानकारी के लिए कृपया निम्नलिखित उत्तर पर एक नज़र डालें


4
पदानुक्रम व्यूअर किसी गतिविधि के दृश्य पदानुक्रम को देखने के लिए है। प्रश्न कार्य / गतिविधि स्टैक के बारे में था ।
जेरेमी लोगन

8

हाल के कार्यों की सूची के लिए

adb shell dumpsys activity recents

चल रही सेवाओं की सूची के लिए

adb shell dumpsys activity services

वर्तमान सामग्री प्रदाताओं की सूची के लिए

adb shell dumpsys activity providers

प्रसारण राज्य की सूची के लिए

adb shell dumpsys activity broadcasts

लंबित इरादों की सूची के लिए

adb shell dumpsys activity intents

अनुमतियों की सूची के लिए

adb shell dumpsys activity permissions

यदि आपको अधिक GUI-sh तरीका पसंद है तो आप AdbCommanderप्लगइन का उपयोग कर सकते हैं और उन कमांड्स को macrosटैब में जोड़ सकते हैं
prot0n


1

समाधान: 'adb खोल डिप्सिस एक्टिविटी' TabActivity के साथ काम नहीं करता है। जब प्रत्येक टैब आइटम का चयन किया जाता है, तो संबंधित गतिविधि लॉन्च की जाएगी। लेकिन जब 'एडीबी शेल डंप्स एक्टिविटी' का उपयोग करते हैं तो यह हमेशा 'मुख्य' गतिविधि देता है:

public class main extends TabActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.e("xyz", "start main...............");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Resusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, widgets.class);
        spec = tabHost.newTabSpec("Widgets").setIndicator("Widgets", res.getDrawable(R.drawable.tab1)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, layouts.class);
        spec = tabHost.newTabSpec("Layouts").setIndicator("Layouts",res.getDrawable(R.drawable.tab2)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, composite1.class);
        spec = tabHost.newTabSpec("Composite").setIndicator("Composite",res.getDrawable(R.drawable.tab3)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, imageMedia.class);
        spec = tabHost.newTabSpec("Image_Media").setIndicator("Image&Media",res.getDrawable(R.drawable.tab4)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, timeDate.class);
        spec = tabHost.newTabSpec("Time_Date").setIndicator("Time&Date",res.getDrawable(R.drawable.tab5)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, transitions.class);
        spec = tabHost.newTabSpec("Transitions").setIndicator("Transitions",res.getDrawable(R.drawable.tab6)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, advanced.class);
        spec = tabHost.newTabSpec("Advanced").setIndicator("Advanced",res.getDrawable(R.drawable.tab7)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, others.class);
        spec = tabHost.newTabSpec("Others").setIndicator("Others",res.getDrawable(R.drawable.tab8)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, Dynamic.class);
        spec = tabHost.newTabSpec("Dynamic").setIndicator("Dynamic",res.getDrawable(R.drawable.tab2)).setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(0);

    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.