ดูกองกิจกรรมของงาน


140

ฉันเพิ่งเริ่มพัฒนาแอปพลิเคชัน Android ง่ายๆในขณะที่ฉันยังเรียนรู้แพลตฟอร์ม

ฉันใช้ Eclipse IDE กับปลั๊กอิน ADT 0.9.6

ฉันต้องการทราบว่าสามารถดูActivityสแต็กที่เกี่ยวข้องกับงานได้หรือไม่?

มีวิธีใดบ้างผ่านเครื่องมือ DDMS หรือผ่านเทคนิคอื่น ๆ ?

โดยพื้นฐานแล้วสิ่งที่ฉันต้องการคือสามารถดูกิจกรรมสแต็กของงานเพื่อให้แน่ใจว่าแอปพลิเคชันทำงานตามที่คาดไว้

ฉันรู้ว่าเป็นไปได้ที่จะควบคุมพฤติกรรมของงานในระดับหนึ่งโดยใช้แฟล็กในIntentออบเจ็กต์และผ่านคุณสมบัติบางอย่างของ<activity>องค์ประกอบ

อย่างไรก็ตามมันจะเป็นการดีที่จะมีเครื่องมือประเภทหนึ่งโดยเฉพาะในโหมดดีบั๊กหรือมากกว่านั้นซึ่งจะช่วยให้นักพัฒนาสามารถมองเห็นActivityสแต็กได้ทันที


หากคุณใช้ Android Studio ฉันได้โพสต์วิธีแก้ปัญหา [ที่นี่] [1] [1]: stackoverflow.com/a/22392616/1798991
Nebu

คำตอบ:


165

จากบรรทัดคำสั่งคุณสามารถใช้: adb shell dumpsys activity

สิ่งนี้ขอให้ตัวจัดการกิจกรรมพิมพ์ดัมพ์ของสถานะปัจจุบัน ส่วนแรกคือประวัติกิจกรรมที่สมบูรณ์ซึ่งจัดเรียงตามงาน นอกจากนี้ยังมีสิ่งต่างๆมากมายที่พิมพ์ออกมาหลังจากนั้นคุณอาจต้องเลื่อนขึ้นเล็กน้อยเพื่อค้นหาสิ่งที่คุณต้องการ

นี่คือตัวอย่างของผลลัพธ์ (เนื้อหาที่แน่นอนแตกต่างกันไปตามเวอร์ชันของแพลตฟอร์ม) โดยแสดงงานอันดับต้น ๆ คือการติดต่อกับสองกิจกรรมและเบื้องหลังตัวเรียกใช้งานที่มีกิจกรรมเดียว:

กิจกรรมในสถานะตัวจัดการกิจกรรมปัจจุบัน:
  * TaskRecord {44d07218 # 4 A android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    ความสัมพันธ์ = android.task.contacts
    ความตั้งใจ = {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 = 1,0004 แอป = 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 = งานเท็จ = TaskRecord {44d07218 # 4 A android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .ViewContactActivity
        ฐาน = / system / app / Contacts.apk / system / app / Contacts.apk data = / data / data / com.android.contacts
        labelRes = 0x7f090012 ไอคอน = 0x7f02006b ธีม = 0x7f0e0004
        stateNotNeeded = false componentSpecified = false isHomeActivity = false
        configuration = {scale = 1.0 imsi = 310/4 loc = th_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 icicle = null
        state = RESUMED หยุด = false delayResume = false จบ = false
        keysPaused = false inHistory = true persistent = false launchMode = 0
        เต็มหน้าจอ = มองเห็นได้จริง = จริง frozenBeforeDestroy = ภาพขนาดย่อเท็จจำเป็น = เท็จไม่ได้ใช้งาน = จริง
        waitingVisible = false nowVisible = จริง
    * Hist # 7: HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity}
        packageName = com.android.contacts processName = android.process.acore
        LaunchFromUid = 1,0004 แอป = 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 = งานจริง = TaskRecord {44d07218 # 4 A android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .DialtactsActivity
        ฐาน = / system / app / Contacts.apk / system / app / Contacts.apk data = / data / data / com.android.contacts
        labelRes = 0x7f090007 ไอคอน = 0x7f02006b ธีม = 0x7f0e0000
        stateNotNeeded = false componentSpecified = true isHomeActivity = false
        configuration = {scale = 1.0 imsi = 310/4 loc = th_US touch = 3 keys = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        LaunchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        state = STOPPED หยุด = true delayResume = false จบ = false
        keysPaused = false inHistory = true persistent = false launchMode = 2
        fullscreen = true visible = false frozenBeforeDestroy = false screenshotNeeded = false idle = true
  * TaskRecord {44c4ee90 # 2 A com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    ความสัมพันธ์ = com.android.launcher
    เจตนา = {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 แอป = 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 = งานจริง = TaskRecord {44c4ee90 # 2 A com.android.launcher}
        taskAffinity = com.android.launcher
        realActivity = com.android.launcher / .Launcher
        ฐาน = / system / app / Launcher.apk / system / app / Launcher.apk data = / data / data / com.android.launcher
        labelRes = 0x7f0a0000 ไอคอน = 0x7f020015 ธีม = 0x103005f
        stateNotNeeded = true componentSpecified = false isHomeActivity = true
        configuration = {scale = 1.0 imsi = 310/4 loc = th_US touch = 3 keys = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        LaunchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        state = STOPPED หยุด = true delayResume = false จบ = false
        keysPaused = false inHistory = true persistent = false launchMode = 2
        fullscreen = true visible = false frozenBeforeDestroy = false screenshotNeeded = false idle = true

มีวิธีที่ดีในการแสดงกองงานและกิจกรรมทั้งหมดของแอปปัจจุบันผ่าน logcat หรือไม่ เราจำเป็นต้องแยกวิเคราะห์คำสั่ง adb หรือไม่?
นักพัฒนา Android

87
นอกจากนี้หากคุณต้องการที่จะเห็นชื่อกิจกรรมในกองที่คุณสามารถทำเช่นนี้: <enter>adb shell dumpsys activity | grep -i run
Surya Wijaya Madjid

6
ตอบโจทย์มาก! ฉันได้เขียนสคริปต์อำนวยความสะดวกซึ่งกรองผลลัพธ์เพื่อรับงาน / กิจกรรมสำหรับแพ็คเกจที่กำหนด
sschuberth

6
นอกจากนี้adb shell dmpsys activityคุณจะได้รับสำหรับแต่ละรายการเช่นadb shell dmpsys activity activitiesกิจกรรมผู้จัดการกิจกรรมที่มีสแต็กหลักกิจกรรมที่กำลังรันและงานล่าสุด dumpsys activity intentsสำหรับความตั้งใจที่รอดำเนินการ dumpsys activity broadcastsสำหรับสถานะการออกอากาศ dumpsys activity providersสำหรับผู้ให้บริการเนื้อหา dumpsys activity servicesสำหรับบริการ; dumpsys activity processesสำหรับกระบวนการทำงาน
Fredrick Gauss

1
คำสั่งของ @ SuryaWijayaMadjid สามารถทำได้ในบรรทัดเดียว: adb shell dumpsys activity | grep -i runหรือadb shell dumpsys activity activities | grep -i runเพื่อผลลัพธ์ที่สะอาดกว่าเล็กน้อย
vaughandroid

61

คุณสามารถใช้คำสั่งต่อไปนี้ในบรรทัดคำสั่งของคุณเพื่อดูงานและแบ็คสแต็คในระบบ:

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

หรือคุณสามารถลองใช้TaskLoggerซึ่งเป็นเครื่องมือง่ายๆที่ฉันสร้างขึ้นซึ่งสามารถตรวจสอบกิจกรรมและงานทั้งหมดในแอพของคุณและส่งออกใน Logcat แบบเรียลไทม์


+1 .... ฉันได้ลองใช้ TaskLogger ของคุณแล้วมันเป็นเครื่องมือที่ดีและช่วยฉันได้มาก แต่กลับพิมพ์บันทึกที่ไม่ต้องการอย่างถล่มทลาย
ThinkDeep

34

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ตอนนี้ฟังก์ชันนี้ถูกรวมไว้ใน Android Studio แล้ว:

ภาพหน้าจอสตูดิโอ android

จากนั้นในไฟล์ข้อความผลลัพธ์ให้ค้นหาACTIVITY(ตัวพิมพ์ใหญ่ทั้งหมด):

ภาพหน้าจอไฟล์ข้อความ android studio


20
ฉันคิดว่าไม่มีตัวเลือกนี้อีกต่อไปเนื่องจากหน้าต่างใหม่ของ Android Profiler ใน Android Studio 3.0 แทนที่เครื่องมือ Android Monitor
ผลไม้

5
ฉันสร้างปัญหาสำหรับฟังก์ชันที่ขาดหายไปนี้: issueetracker.google.com/issues/77944626ดังนั้นโปรดลงคะแนนให้ ขอบคุณ
mtrakal

28

หากคุณต้องการตรวจสอบสแต็กงานของแพ็กเกจเฉพาะคำสั่งต่อไปนี้จะทำ:

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 เป็นส่วนหนึ่งของ Android SDK ใช้งานได้กับโปรแกรมจำลองเท่านั้น แต่สะดวกสบายและชัดเจนกว่ามาก

แก้ไข: ฉันเพิ่งพบ Hierarchy Viewer ภายใน Eclipse! และใช้งานได้กับอุปกรณ์จริงเช่นกัน เพียงแค่เปิดมุมมอง Windows-> Open Perspective-> Hierarchy View ในรายการคุณจะเห็นอุปกรณ์ที่เชื่อมต่อและอีมูเลเตอร์ทั้งหมดและสแต็กกิจกรรม และนอกจากนี้ในมุมมองแบบต้นไม้คุณยังสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับมุมมองได้อีกด้วย

แก้ไข: Hierarchy Viewer จะทำงานกับอุปกรณ์ของนักพัฒนาเท่านั้น อุปกรณ์การผลิตไม่สามารถทำได้ด้วยเหตุผลด้านความปลอดภัย สำหรับข้อมูลเพิ่มเติมโปรดดูคำตอบต่อไปนี้


4
Hierarchy Viewer ใช้สำหรับดูลำดับชั้น View ของกิจกรรม คำถามคือเกี่ยวกับงาน / กิจกรรมสแต็ค
Jeremy Logan

8

สำหรับรายการงานล่าสุด

adb shell dumpsys activity recents

สำหรับรายการบริการที่ทำงานอยู่

adb shell dumpsys activity services

สำหรับรายชื่อผู้ให้บริการเนื้อหาปัจจุบัน

adb shell dumpsys activity providers

สำหรับรายการสถานะการออกอากาศ

adb shell dumpsys activity broadcasts

สำหรับรายการ Intent ที่รอดำเนินการ

adb shell dumpsys activity intents

สำหรับรายการสิทธิ์

adb shell dumpsys activity permissions

ถ้าคุณชอบวิธีที่ GUI-SH คุณสามารถใช้AdbCommanderปลั๊กอินและเพิ่มคำสั่งผู้ที่อยู่ในmacrosแท็บ
prot0n


1

วิธีแก้ไข: 'adb shell dumpsys activity' ไม่ทำงานกับ TabActivity เมื่อเลือกรายการแท็บแต่ละรายการกิจกรรมที่เกี่ยวข้องจะเปิดขึ้น แต่เมื่อใช้กิจกรรม 'adb shell dumpsys' มันจะส่งคืนกิจกรรม '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.