Visualizza lo stack di attività dell'attività


138

Ho appena iniziato a sviluppare una semplice applicazione Android mentre sto ancora imparando la piattaforma.

Sto usando Eclipse IDE con il plugin ADT 0.9.6.

Devo sapere se è possibile visualizzare lo Activitystack associato a un'attività?

Esiste un modo attraverso lo strumento DDMS o qualsiasi altra tecnica?

In sostanza, ciò di cui ho bisogno è poter vedere l'attività dello stack di un'attività per assicurarmi che l'applicazione si comporti come previsto.

So che è possibile controllare il comportamento dell'attività in una certa misura attraverso l'uso di flag Intentnell'oggetto e attraverso alcuni attributi <activity>dell'elemento.

Tuttavia sarebbe bello avere una sorta di strumento - specialmente in modalità debug o giù di lì - che consentirebbe agli sviluppatori di vedere lo Activitystack direttamente.


Se stai usando Android Studio, ho pubblicato una soluzione [qui] [1]. [1]: stackoverflow.com/a/22392616/1798991
Nebu

Risposte:


164

Dalla riga di comando, puoi usare: adb shell dumpsys activity

Ciò richiede al manager delle attività di stampare un dump del suo stato corrente. La prima parte è la cronologia completa delle attività, organizzata per attività. Ci sono anche molte cose stampate dopo, quindi potrebbe essere necessario scorrere un po 'verso l'alto per trovare quello che vuoi.

Ecco un esempio del suo output (il contenuto esatto varia a seconda della versione della piattaforma), mostrando l'attività principale che consiste in contatti con due attività, e dietro quello il lanciatore con una attività:

Attività nello stato del gestore attività corrente:
  * TaskRecord {44d07218 # 4 A android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    affinità = android.task.contacts
    intent = {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10600000 cmp = com.android.contacts / .DialtactsActivity bnds = [125.640] [235.758]}
    origActivity = com.android.contacts / .DialtactsContactsEntryActivity
    realActivity = com.android.contacts / .DialtactsActivity
    lastActiveTime = 288203177 (inattivo per 14 secondi)
    * Hist # 8: HistoryRecord {44b87a30 com.android.contacts / .ViewContactActivity}
        packageName = com.android.contacts processName = android.process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Intent {act = android.intent.action.VIEW dat = content: //com.android.contacts/contacts/lookup/144i148.144i461a29500afc8eeb/1927 cmp = com.android.contacts / .ViewContactActivity}
        frontOfTask = false task = TaskRecord {44d07218 # 4 A android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .ViewContactActivity
        base = / system / app / Contacts.apk / system / app / Contacts.apk data = / data / data / com.android.contacts
        labelRes = 0x7f090012 icon = 0x7f02006b theme = 0x7f0e0004
        stateNotNeeded = false componentSpecified = false isHomeActivity = false
        configurazione = {scala = 1.0 imsi = 310/4 loc = en_US touch = 3 tasti = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = preferiti resultCode = 2
        launchFailed = false haveState = false icicle = null
        stato = RIPRENDI arrestato = falso ritardoResume = falsa finitura = falso
        keysPaused = false inHistory = true persistent = false launchMode = 0
        fullscreen = true visible = true frozenBeforeDestroy = false thumbnailNeeded = false inattivo = true
        waitingVisible = false nowVisible = true
    * Hist # 7: HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity}
        packageName = com.android.contacts processName = android.process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Intent {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10200000 cmp = com.android.contacts / .DialtactsContactsEntryActivity bnds = [125.640] [235.758]}
        frontOfTask = true task = TaskRecord {44d07218 # 4 A android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .DialtactsActivity
        base = / system / app / Contacts.apk / system / app / Contacts.apk data = / data / data / com.android.contacts
        labelRes = 0x7f090007 icon = 0x7f02006b theme = 0x7f0e0000
        stateNotNeeded = false componentSpecified = true isHomeActivity = false
        configurazione = {scala = 1.0 imsi = 310/4 loc = en_US touch = 3 tasti = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        stato = STOPPED arrestato = true delayedResume = false finish = false
        keysPaused = false inHistory = true persistent = false launchMode = 2
        fullscreen = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false inattivo = true
  * TaskRecord {44c4ee90 # 2 A com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    affinità = com.android.launcher
    intent = {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10600000 cmp = com.android.launcher / .Launcher}
    realActivity = com.android.launcher / .Launcher
    lastActiveTime = 214734838 (inattivo per 73483s)
    * Hist # 6: HistoryRecord {44c4d988 com.android.launcher / .Launcher}
        packageName = com.android.launcher processName = android.process.acore
        launchFromUid = 0 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Intent {act = android.intent.action.MAIN cat = [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
        base = / system / app / Launcher.apk / system / app / Launcher.apk data = / data / data / com.android.launcher
        labelRes = 0x7f0a0000 icon = 0x7f020015 theme = 0x103005f
        stateNotNeeded = true componentSpecified = false isHomeActivity = true
        configurazione = {scala = 1.0 imsi = 310/4 loc = en_US touch = 3 tasti = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        stato = STOPPED arrestato = true delayedResume = false finish = false
        keysPaused = false inHistory = true persistent = false launchMode = 2
        fullscreen = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false inattivo = true

c'è un buon modo per mostrare tutti i compiti e le attività dello stack dell'app corrente tramite logcat? abbiamo davvero bisogno di analizzare il comando adb?
sviluppatore Android

85
Inoltre, se vuoi solo vedere il nome delle attività nello stack puoi farlo: adb shell <invio> dumpsys activity | grep -i run .
Surya Wijaya Madjid,

6
Bella risposta! Ho scritto uno script pratico che filtra l'output per ottenere le attività / attività per un determinato pacchetto.
sschuberth,

5
inoltre adb shell dmpsys activityè possibile ottenere per ogni elenco, ad esempio adb shell dmpsys activity activitiesper ATTIVITÀ DEL MANAGER DI ATTIVITÀ che contiene stack principale, attività in esecuzione e attività recenti. dumpsys activity intentsper intenti pendenti; dumpsys activity broadcastsper stato di trasmissione; dumpsys activity providersper i fornitori di contenuti; dumpsys activity servicesper i servizi; dumpsys activity processesper i processi in esecuzione.
Fredrick Gauss,

1
Il comando @ SuryaWijayaMadjid può essere eseguito su una riga: adb shell dumpsys activity | grep -i runo adb shell dumpsys activity activities | grep -i runper un output leggermente più pulito.
vaughandroid,

58

È possibile utilizzare il comando seguente nella riga di comando per visualizzare le attività e gli zaini nel sistema:

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

Oppure puoi provare TaskLogger , un semplice strumento che ho creato che può monitorare tutte le attività e le attività nella tua app e inviarle in Logcat in tempo reale.


+1 .... Ho provato il tuo TaskLogger che è un ottimo strumento e mi aiuta molto, ma stampa valanghe di tronchi indesiderati.
ThinkDeep,

34

So che questa è una vecchia domanda, ma questa funzionalità è ora incorporata in Android Studio:

screenshot di Android Studio

Quindi nel file di testo risultante, cerca ACTIVITY(tutto maiuscolo):

screenshot del file di testo di Android Studio


20
Penso che questa opzione non esista più poiché la nuova finestra di Android Profiler in Android Studio 3.0 sostituisce gli strumenti di Android Monitor.
Frutta

5
Ho creato un problema per questa funzione mancante: issuetracker.google.com/issues/77944626, quindi vota per favore. Grazie
mtrakal,

27

Se si desidera ispezionare lo stack di attività di un pacchetto specifico, eseguirà il comando seguente:

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist

12

Controllo sempre questa parte dei messaggi di dump lunghi ...

  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}

Nota: Run # 4 è l'attività che vedi ora sullo schermo. :)


2
Cosa sono i "messaggi di dump lunghi"?
Marian Paździoch,

2
@ MarianPaździoch "attività dumpsys shell adb" ci mostra messaggi troppo lunghi. Questi messaggi, sopra, sono un po 'di loro. A proposito, ho un suggerimento che posso evitare. Esegui questo, "attività di attività dumpsys della shell adb" Puoi vedere messaggi più brevi e leggere più facilmente lo stack di attività. :)
cmcromance

1
... e se l'elenco è ancora troppo lungo, apri l'elenco App recenti e fai scorrere alcune attività.
Barry Fruitman,

10

Puoi usare lo strumento hierarchyviewer.bat. Fa parte dell'SDK Android. Funziona solo con l'emulatore però. Ma è molto più comodo e chiaro.

Modifica: ho appena trovato il Gerarchia Viewer in Eclipse! E funziona anche con dispositivi reali. Basta aprire la prospettiva Windows-> Apri prospettiva-> Vista gerarchia Nell'elenco è possibile visualizzare tutti i dispositivi e gli emulatori collegati e lo stack di attività. Inoltre, nella vista ad albero puoi vedere molte più informazioni sulla vista stessa.

Modifica: il visualizzatore di gerarchie funzionerà solo con dispositivi di sviluppo. I dispositivi di produzione non possono farlo per motivi di sicurezza. Per ulteriori informazioni, consultare la seguente risposta


4
Hierarchy Viewer consente di visualizzare la gerarchia di visualizzazione di un'attività. La domanda riguardava lo stack di attività / attività .
Jeremy Logan,

8

Per l'elenco delle attività recenti

adb shell dumpsys activity recents

Per l'elenco dei servizi in esecuzione

adb shell dumpsys activity services

Per l'elenco degli attuali fornitori di contenuti

adb shell dumpsys activity providers

Per l'elenco dello stato di trasmissione

adb shell dumpsys activity broadcasts

Per l'elenco degli Intenti in sospeso

adb shell dumpsys activity intents

Per l'elenco delle autorizzazioni

adb shell dumpsys activity permissions

Se ti piace di più il modo GUI-sh puoi usare il AdbCommanderplugin e aggiungere quei comandi nella macrosscheda
prot0n


1

Soluzione: "attività dumpsys della shell adb" non funziona con TabActivity. Quando ciascuna voce della scheda selezionata, verrà avviata l'attività corrispondente. Ma quando si usa 'attività dumpsys shell adb' Restituisce sempre l'attività 'principale':

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);

    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.