작업의 활동 스택을 봅니다.


138

나는 여전히 플랫폼을 배우는 동안 간단한 안드로이드 응용 프로그램을 개발하기 시작했습니다.

ADT 플러그인 0.9.6과 함께 Eclipse IDE를 사용하고 있습니다.

Activity작업과 관련된 스택 을 볼 수 있는지 알아야 합니까?

DDMS 도구 또는 다른 기술을 통해 어떤 방법이 있습니까?

본질적으로 필요한 것은 응용 프로그램이 예상대로 작동하는지 확인하기 위해 작업의 스택 활동을 볼 수 있어야합니다.

Intent객체 에서 플래그를 사용 하고 <activity>요소의 일부 속성을 통해 어느 정도 작업 동작을 제어 할 수 있다는 것을 알고 있습니다.

그러나 개발자가 Activity스택을 곧바로 볼 수 있도록하는 일종의 도구 (특히 디버그 모드 등)가 있으면 좋을 것 입니다.


Android Studio를 사용하는 경우 [여기] [1]에 솔루션을 게시했습니다. [1] : stackoverflow.com/a/22392616/1798991
Nebu

답변:


164

명령 행에서 다음을 사용할 수 있습니다. adb shell dumpsys activity

이것은 활동 관리자에게 현재 상태의 덤프를 인쇄하도록 요청합니다. 그 첫 번째 부분은 작업별로 구성된 전체 활동 기록입니다. 그 후에도 많은 것들이 인쇄되므로 원하는 것을 찾기 위해 약간 위로 스크롤해야 할 수도 있습니다.

다음은 출력의 예입니다 (정확한 내용은 플랫폼 버전에 따라 다름). 최상위 작업이 두 활동과 접촉하고 하나의 활동으로 실행기와 그 뒤에 있음을 보여줍니다.

현재 활동 관리자 상태의 활동 :
  * TaskRecord {44d07218 # 4 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 초 동안 비활성)
    * 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}
        의도 {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 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 테마 = 0x7f0e0004
        stateNotNeeded = 거짓 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 = 즐겨 찾기 resultCode = 2
        launchFailed = false haveState = false 고드름 = 널
        state = RESUMED stop = false delayedResume = false 마무리 = false
        keysPaused = 거짓 inHistory = true 지속적 = 거짓 launchMode = 0
        fullscreen = true visible = true frozenBeforeDestroy = false thumbnailNeeded = false idle = 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}
        의도 {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 테마 = 0x7f0e0000
        stateNotNeeded = 거짓 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 = 번들 [mParcelledData.dataSize = 4196]
        state = STOPPED 중지 = true 지연됨 재개 = false 마무리 = false
        keysPaused = 거짓 inHistory = true 지속적 = 거짓 launchMode = 2
        fullscreen = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false idle = true
  * TaskRecord {44c4ee90 # 2 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 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 테마 = 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 = 번들 [mParcelledData.dataSize = 5964]
        state = STOPPED 중지 = true 지연됨 재개 = false 마무리 = false
        keysPaused = 거짓 inHistory = true 지속적 = 거짓 launchMode = 2
        fullscreen = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false idle = true

logcat을 통해 현재 앱의 모든 작업 및 활동 스택을 표시하는 좋은 방법이 있습니까? 실제로 adb 명령을 구문 분석해야합니까?
안드로이드 개발자

85
또한 스택에서 액티비티 이름 만 보려면 adb shell <enter>를 수행하면 dumpsys activity | grep -i run됩니다.
Surya Wijaya Madjid

6
좋은 대답입니다! 주어진 패키지에 대한 작업 / 활동을 얻기 위해 출력을 필터링 하는 편의 스크립트 를 작성했습니다 .
sschuberth

5
또한 메인 스택, 실행중인 활동 및 최근 작업이 포함 된 ACTIVITY MANAGER 활동에 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'

또는 앱에서 모든 활동과 작업을 모니터링하고 Logcat에 실시간으로 출력 할 수있는 간단한 도구 인 TaskLogger 를 사용해 볼 수 있습니다.


+1 .... TaskLogger를 사용해 보았습니다. 좋은 도구이며 많은 도움이되지만 원치 않는 로그가 눈에 띄게 인쇄됩니다.
ThinkDeep

34

나는 이것이 오래된 질문이라는 것을 알고 있지만이 기능은 이제 Android Studio에 구워졌습니다.

안드로이드 스튜디오 스크린 샷

그런 다음 결과 텍스트 파일에서 ACTIVITY(모두 대문자)를 검색하십시오 .

안드로이드 스튜디오 텍스트 파일 스크린 샷


20
Android Studio 3.0의 새로운 Android 프로파일 러 창이 Android 모니터 도구를 대체하므로이 옵션이 더 이상 존재하지 않는다고 생각합니다.
과일

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}

참고 : Run # 4는 화면에 표시되는 활동입니다. :)


2
"긴 덤프 메시지"란 무엇입니까?
Marian Paździoch

2
@ MarianPaździoch "adb shell dumpsys activity"는 우리에게 너무 긴 메시지를 보여줍니다. 위의 메시지는 그 중 일부입니다. 그건 그렇고, 나는 이것을 피할 수있는 팁을 얻었습니다. "adb shell dumpsys activity Activities"를 실행하십시오. 메시지가 짧아지고 활동 스택에 대해 더 쉽게 읽을 수 있습니다. :)
cmcromance

1
... 목록이 여전히 너무 길면 최근 앱 목록을 열고 일부 작업을 스 와이프합니다.
Barry Fruitman

10

hierarchyviewer.bat 도구를 사용할 수 있습니다. 그것은 안드로이드 SDK의 일부입니다. 그래도 에뮬레이터에서만 작동합니다. 그러나 훨씬 더 편하고 명확합니다.

편집 : 방금 Eclipse에서 계층 뷰어를 찾았습니다! 또한 실제 장치에서도 작동합니다. Perspective Windows-> Open Perspective-> Hierarchy View를 열면 목록에 연결된 모든 장치와 에뮬레이터 및 활동 스택이 표시됩니다. 또한 트리 뷰에서 뷰 자체에 대한 훨씬 더 많은 정보를 볼 수 있습니다.

편집 : 계층 뷰어는 개발자 장치에서만 작동합니다. 보안상의 이유로 생산 장치는이를 수행 할 수 없습니다. 자세한 내용은 다음 답변을 참조하십시오


4
계층 뷰어는 활동의보기 계층을보기위한 것입니다. 문제는 작업 / 활동 스택에 관한 것 입니다.
Jeremy Logan

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.