タスクのアクティビティスタックを表示する


138

プラットフォームを学びながら、単純なAndroidアプリケーションの開発を始めました。

私はADTプラグイン0.9.6でEclipse IDEを使用しています。

Activityタスクに関連付けられているスタックを表示できるかどうかを知る必要がありますか?

DDMSツールまたは他の手法を使用する方法はありますか?

基本的に必要なのは、タスクのスタックアクティビティを確認して、アプリケーションが期待どおりに動作することを確認できるようにすることです。

Intentオブジェクト内のフラグを使用し、<activity>要素の一部の属性を使用して、タスクの動作をある程度制御できることを知っています。

ただし、開発者がActivityスタックを直接確認できるようなツール(特にデバッグモードなど)があると便利です。


Android Studioを使用している場合は、[ここ] [1]に解決策を投稿しました。[1]:stackoverflow.com/a/22392616/1798991
ネブ

回答:


164

コマンドラインから、次のものを使用できます。 adb shell dumpsys activity

これは、アクティビティマネージャーに現在の状態のダンプを出力するように要求します。その最初の部分は、タスクごとに整理された完全な活動履歴です。その後もたくさんのものが印刷されるので、必要なものを見つけるために少し上にスクロールする必要があるかもしれません。

以下はその出力の例です(正確な内容はプラットフォームのバージョンによって異なります)。2つのアクティビティーとの接触である最上位のタスクと、1つのアクティビティーを持つランチャーの背後を示しています。

現在のアクティビティマネージャー状態のアクティビティ:
  * TaskRecord {44d07218#4 A android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    affinity = 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秒間非アクティブ)
    *履歴#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}
        インテント{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
        configuration = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 keys = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = favorites resultCode = 2
        launchFailed = false haveState = false icicle = null
        状態=再開停止=偽遅延再開=偽仕上げ=偽
        keysPaused = false inHistory = true persistent = false launchMode = 0
        fullscreen = true visible = true frozenBeforeDestroy = false thumbnailNeeded = false idle = true
        waitingVisible = false nowVisible = true
    *履歴#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}
        インテント{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
        configuration = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 keys = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        状態= STOPPED停止= true delayResume = 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
    affinity = 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秒間非アクティブ)
    *履歴#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}
        インテント{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
        configuration = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 keys = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        状態= STOPPED停止= true delayResume = 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
Surya Wijaya Madjid 2012

6
正解です。特定のパッケージのタスク/アクティビティを取得するために出力をフィルタリングする便利なスクリプトを作成しました。
sschuberth

5
さらに、メインスタック、実行中のアクティビティ、最近のタスクを含むACTIVITY MANAGER ACTIVITIES adb shell dmpsys activityなどのリストごとに取得できますadb shell dmpsys activity activitiesdumpsys activity intents保留中の意図; dumpsys activity broadcasts放送状態; dumpsys activity providersコンテンツ提供者; dumpsys activity servicesサービス; dumpsys activity processesプロセスを実行するため。
Fredrick Gauss

1
@ SuryaWijayaMadjidのコマンドは1行で行うことができますadb shell dumpsys activity | grep -i run、またはadb shell dumpsys activity activities | grep -i run少しクリーナー出力用。
vaughandroid 2018

58

コマンドラインで次のコマンドを使用して、システム内のタスクとバックスタックを確認できます。

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

または、アプリ内のすべてのアクティビティとタスクを監視し、それらをLogcatにリアルタイムで出力できるシンプルなツールであるTaskLoggerを試すこともできます。


+1 ....私はあなたのTaskLoggerを試してみましたが、それは良いツールであり、多くの助けになりますが、不要なログが雪崩で印刷されます。
ThinkDeep

34

これは古い質問ですが、この機能はAndroid Studioに組み込まれています。

Androidスタジオのスクリーンショット

次に、結果のテキストファイルでACTIVITY(すべて大文字)を検索します。

android studioテキストファイルのスクリーンショット


20
Android Studio 3.0の新しいAndroid ProfilerウィンドウがAndroid Monitorツールに置き換わったため、このオプションはもう存在しないと思います。
フルーツ

5
この欠落している関数:issuetracker.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
「ロングダンプメッセージ」とは何ですか?
マリアンPaździoch14年

2
@MarianPaździoch "adb shell dumpsys activity"は、長すぎるメッセージを示しています。上記のこのメッセージはその一部です。ちなみに、これを回避できるヒントを得ました。これを実行すると、「adb shell dumpsysアクティビティー・アクティビティー」というメッセージが表示され、アクティビティー・スタックについてより簡単に読み取ることができます。:)
cmcromance 2014

1
...そのリストがまだ長すぎる場合は、[最近のアプリ]リストを開いて、いくつかのタスクをスワイプします。
Barry Fruitman 2015年

10

ツールhierarchyviewer.batを使用できます。これはAndroid SDKの一部です。ただし、エミュレータでのみ機能します。しかし、それははるかに快適で明確です。

編集:Eclipse内で階層ビューアーを見つけました!また、実際のデバイスでも動作します。パースペクティブを開くだけです。Windows-> Open Perspective-> Hierarchy Viewリストには、接続されているすべてのデバイスとエミュレーター、およびアクティビティスタックが表示されます。さらに、ツリービューでは、ビュー自体に関する詳細情報を確認できます。

編集:階層ビューアは開発者デバイスでのみ機能します。セキュリティ上の理由から、製品デバイスはそれを行うことができません。詳細については、次の回答をご覧ください


4
階層ビューアは、アクティビティのビュー階層を表示するためのものです。問題は、タスク/アクティビティスタックに関するものでした。
Jeremy Logan 14年

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 shell dumpsys activity」はTabActivityでは機能しません。各タブ項目が選択されると、対応するアクティビティが起動されます。しかし、「adb shell dumpsys activity」を使用すると、常に「main」アクティビティが返されます。

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

    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.