Просмотр стека активности задания


138

Я только начал разрабатывать простое приложение для Android, пока еще изучаю платформу.

Я использую Eclipse IDE с плагином ADT 0.9.6.

Мне нужно знать, возможно ли просмотреть Activityстек, связанный с задачей?

Есть ли какой-нибудь способ через инструмент DDMS или через любой другой метод?

По сути, мне нужно иметь возможность видеть активность задачи в стеке, чтобы убедиться, что приложение работает должным образом.

Я знаю, что можно управлять поведением задачи в некоторой степени с помощью флагов в Intentобъекте и с помощью некоторых атрибутов <activity>элемента.

Однако было бы неплохо иметь своего рода инструмент - особенно в режиме отладки или около того - который позволял бы разработчикам видеть Activityстек прямо вперед.


Если вы используете Android Studio, я разместил решение [здесь] [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
    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 (неактивно в течение 14 с)
    * 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 = ложная задача = TaskRecord {44d07218 # 4 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
        конфигурация = {масштаб = 1,0 imsi = 310/4 loc = en_US touch = 3 клавиши = 2/1/2 nav = 2/2 ориентация = 1 макет = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = избранное resultCode = 2
        launchFailed = false haveState = false icicle = null
        состояние = возобновлено остановлено = ложно delayedResume = ложь окончание = ложь
        keysPaused = false inHistory = true persistent = false launchMode = 0
        fullscreen = true visible = true frozenBeforeDestroy = false thumbnailNeeded = false idle = true
        waitVisible = false nowVisible = true
    * Hist # 7: HistoryRecord {44d174d0 com.android.contacts / .КонтактыEntryActivity}
        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 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
        конфигурация = {масштаб = 1,0 imsi = 310/4 loc = en_US touch = 3 клавиши = 2/1/2 nav = 2/2 ориентация = 1 макет = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        состояние = STOPPED остановлено = true delayedResume = false окончание = false
        keysPaused = false inHistory = true persistent = false launchMode = 2
        fullscreen = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false idle = true
  * TaskRecord {44c4ee90 # 2 A com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    Сродство = 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 (неактивно для 73483 с)
    * 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 = истинная задача = TaskRecord {44c4ee90 # 2 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
        конфигурация = {масштаб = 1,0 imsi = 310/4 loc = en_US touch = 3 клавиши = 2/1/2 nav = 2/2 ориентация = 1 макет = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        состояние = STOPPED остановлено = true delayedResume = false окончание = false
        keysPaused = false inHistory = true persistent = false launchMode = 2
        fullscreen = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false idle = true

Есть ли хороший способ показать все задачи и действия стека текущего приложения через logcat? нам действительно нужно проанализировать команду adb?
Android-разработчик

85
Кроме того, если вы хотите видеть только название действий в стеке, вы можете сделать это: adb shell <enter> dumpsys activity | grep -i run .
Сурия Виджая Маджид

6
Отличный ответ! Я написал удобный сценарий, который фильтрует выходные данные, чтобы получить задачи / действия для данного пакета.
Щуберт

5
В дополнение к этому adb shell dmpsys activityвы можете получить для каждого списка, например, adb shell dmpsys activity activitiesACTIVITY MANAGER 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

Вы можете использовать следующую команду в командной строке, чтобы увидеть задачи и backstacks в системе:

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

Или вы можете попробовать TaskLogger , простой инструмент, который я создал, который может отслеживать все действия и задачи в вашем приложении и выводить их в Logcat в режиме реального времени.


+1 .... Я попробовал ваш TaskLogger, это хороший инструмент и мне очень помогает, но выводит лавину нежелательных логов.
ThinkDeep

34

Я знаю, что это старый вопрос, но эта функциональность теперь встроена в Android Studio:

скриншот андроид студии

Затем в полученном текстовом файле найдите ACTIVITY(все заглавные буквы):

скриншот текстового файла Android Studio


20
Я думаю, что эта опция больше не существует, так как новое окно Android Profiler в Android Studio 3.0 заменяет инструменты Android Monitor.
Фрукты

5
Я создал проблему для этой отсутствующей функции: issetracker.google.com/issues/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ździoch "adb shell dumpsys активность" показывает нам слишком длинные сообщения. Это сообщения, выше, их немного. Кстати, я получил чаевые, могу этого избежать. Запустите это, «adb shell dumpsys активность действий». Вы можете увидеть более короткое сообщение и легко прочитать о стеке действий. :)
cmcromance

1
... и если этот список все еще слишком длинный, откройте список последних приложений и проведите пальцем по некоторым задачам.
Барри Фрутман

10

Вы можете использовать инструментierarchyviewer.bat. Это часть Android SDK. Это работает только с эмулятором, хотя. Но это намного удобнее и понятнее.

Изменить: я только что нашел средство просмотра иерархии в Eclipse! И это работает с реальными устройствами. Просто откройте перспективу Windows-> Open Perspective-> Hierarchy View. В списке вы увидите все подключенные устройства и эмуляторы и стек активности. Кроме того, в виде дерева вы можете увидеть гораздо больше информации о самом представлении.

Изменить: Средство просмотра иерархии будет работать только с устройствами разработчика. Производственные устройства не могут сделать это по соображениям безопасности. Для получения дополнительной информации, пожалуйста, посмотрите на следующий ответ


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-ш, вы можете использовать AdbCommanderплагин и добавить эти команды во macrosвкладку
prot0n


1

Решение: «adb shell dumpsys активность» не работает с TabActivity. Когда выбран каждый элемент вкладки, будет запущено соответствующее действие. Но когда используется операция adb shell dumpsys, всегда возвращается основная операция:

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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.