การหยุดแอพ Android จากคอนโซล


205

เป็นไปได้ไหมที่จะหยุดแอพ Android จากคอนโซล? สิ่งที่ต้องการ:

adb stop com.my.app.package

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

คำตอบ:


146

แก้ไข: อีกไม่นานหลังจากที่ฉันเขียนโพสต์นี้และได้รับการยอมรับว่าเป็นคำตอบam force-stopคำสั่งถูกนำมาใช้โดยทีม Android ตามที่ระบุไว้ในคำตอบนี้

อีกทางเลือกหนึ่ง:แทนที่จะหยุดแอพเนื่องจากคุณพูดถึงการต้องการ "clean slate" สำหรับการทดสอบแต่ละครั้งคุณสามารถใช้adb shell pm clear com.my.app.packageซึ่งจะหยุดกระบวนการแอปและล้างข้อมูลที่เก็บไว้ทั้งหมดสำหรับแอปนั้น


หากคุณใช้ Linux:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

ซึ่งจะใช้งานได้กับอุปกรณ์ / ตัวจำลองที่คุณมีรูททันทีเมื่อใช้งานเชลล์ ที่อาจจะได้รับการขัดเกลาเล็กน้อยเพื่อโทรsuล่วงหน้า

มิฉะนั้นคุณสามารถทำได้ (ด้วยตนเองหรือฉันคิดว่าสคริปต์):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>


6
ไม่สามารถใช้งานได้ (สิทธิ์ถูกปฏิเสธทั้งการฆ่าและ su) แต่ +1 สำหรับแสดงฉันฉันสามารถทำได้มากกว่าที่ฉันคิดด้วย adb
hpique

9
อาดูเหมือนว่าคุณไม่มีอุปกรณ์รูท มันใช้งานได้กับอีมูเลเตอร์อย่างน้อยที่สุด! :)
Christopher Orr

1
บางทีคุณอาจต้องติดตั้งพาร์ติชั่นใหม่อ่าน - เขียนและเรียกใช้ adb เป็น root: adb remount; adb root # เป็นเพียงความคิดที่โง่
Rorist

570

วิธีที่สะอาดในการหยุดแอพคือ:

adb shell am force-stop com.my.app.package

วิธีนี้คุณไม่ต้องคิด ID กระบวนการ


28
นี่ควรเป็นคำตอบที่ได้รับการยอมรับสำหรับปัญหานี้ คำถามไม่ได้รวมอุปกรณ์ที่รูท
Dimitris

10
@Dimitris ฉันเขียนคำตอบของฉันไปก่อนที่force-stopคำสั่งจะมีอยู่ ฉันอัปเดตคำตอบเพื่อชี้ไปที่สิ่งนี้
Christopher Orr

2
นอกจากนี้ฉันยังปรับปรุงคำตอบของฉันด้วยวิธีที่ดีในการจัดทำ "กระดานชนวนสะอาด" สำหรับการทดสอบการทำงาน
Christopher Orr

จุดสำคัญที่หลังจากนี้ BroadcastReceiver ของคุณจะไม่ทำงาน (จนกว่าจะเปิดแอปถัดไป) commonsware.com/blog/2011/07/13/…
CAMOBAP

ผ่านการทดสอบAndroid 9.0 API Level 28แล้วแอปยังคงปรากฏในแอพล่าสุดแม้จะPIDพบแอพที่เกี่ยวข้องกับแอพ คุณรู้วิธีหยุดแอพอย่างสมบูรณ์ซึ่งหมายความว่าแม้จะมาจากแอปพื้นหลัง
talha06

32

ก่อนอื่นให้วางแอปไว้ในพื้นหลัง (กดปุ่มโฮมของอุปกรณ์)

จากนั้น .... ในเทอร์มินัล ....

adb shell am kill com.your.package

11
หมายเหตุฉันไม่เชื่อว่าจะใช้งานได้อีกในระดับ API> 22.
dell116

มันทำบน Nexus 5 ของฉันกับ Marshmallow
urSus

วิธีนี้ใช้ได้ผล ตรวจสอบให้แน่ใจว่าคุณใส่แอพเข้าไปในพื้นหลังก่อน
PhillyTheThrilly

17

คุณสามารถใช้สิ่งต่อไปนี้จากคอนโซลอุปกรณ์: pm disable com.my.app.packageซึ่งจะฆ่ามัน จากนั้นใช้pm enable com.my.app.packageเพื่อให้คุณสามารถเปิดใช้อีกครั้ง


1
สำหรับโทรศัพท์ที่ไม่ได้รูทเครื่องจะไม่ทำอะไรเลย
Robert Muil

ฉันตรวจสอบมันบนโทรศัพท์ที่ไม่ได้รูท ในตอนแรกมีข้อความปฏิเสธการอนุญาตจากนั้นจึงฆ่าแอพ / บริการ DalvicVM ของฉัน เพียงแค่ให้มันวินาที
LikeYou

1
บนอุปกรณ์ที่รูทแล้วจะใช้งานได้และมีประโยชน์เพิ่มเติมในการทำให้แอพ / บริการไม่ทำงาน สิ่งนี้อาจเป็นที่ต้องการสำหรับการทดสอบ
miki

2
หมายเหตุ: คุณต้องadb shellแล้วเรียกใช้suก่อน
kakyo

คำเตือนนี่จะทำให้ไอคอนตัวเรียกใช้งานลัดสำหรับแพ็คเกจนั้นหายไปแม้หลังจากเปิดใช้งานอีกครั้ง
Elad Nava

10

หากคุณมีสิทธิ์เข้าถึงแพ็คเกจแอปพลิเคชันคุณสามารถติดตั้งด้วยตัวเลือก -r และมันจะฆ่ากระบวนการหากกำลังทำงานเป็นผลข้างเคียง แบบนี้:

adb -d install -r MyApp.apk ; adb -d shell am start -a android.intent.action.MAIN -n com.MyCompany.MyApp/.MyActivity

ตัวเลือก -r รักษาข้อมูลที่เชื่อมโยงกับแอปในปัจจุบัน อย่างไรก็ตามหากคุณต้องการกระดานชนวนที่สะอาดเหมือนที่คุณพูดถึงคุณอาจไม่ต้องการใช้ตัวเลือกนั้น


7

หากคุณกำหนดเป้าหมายอุปกรณ์ที่ไม่ได้รูทและ / หรือมีบริการใน APK ที่คุณไม่ต้องการหยุดเช่นกันโซลูชันอื่นจะไม่ทำงาน

ในการแก้ปัญหานี้ฉันได้หันไปใช้ตัวรับข้อความบรอดคาสต์ที่ฉันเพิ่มลงในกิจกรรมของฉันเพื่อหยุด

public class TestActivity extends Activity {
    private static final String STOP_COMMAND = "com.example.TestActivity.STOP";

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            TestActivity.this.finish();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //other stuff...

        registerReceiver(broadcastReceiver, new IntentFilter(STOP_COMMAND));
    }
}

ด้วยวิธีนี้คุณสามารถออกคำสั่ง adb นี้เพื่อหยุดกิจกรรมของคุณ:

adb shell am broadcast -a com.example.TestActivity.STOP

2

หากสิ่งที่คุณกำลังมองหาคือการฆ่าแพคเกจ

pkill package_name 

ควรทำงาน


หมายเหตุ: ใช้งานได้เฉพาะกับ Android เวอร์ชันใหม่กว่าเท่านั้น pkill ไม่สามารถใช้ได้กับเครื่องจำลอง 4.4 ของฉัน แต่มีในเครื่องจำลอง Android 6
Simon Warta

1

adb shell killall -9 com.your.package.name

ตาม MAC "การควบคุมการเข้าถึงบังคับ" คุณอาจได้รับอนุญาตให้ฆ่ากระบวนการที่ไม่ได้เริ่มจากรูท

มีความสุข!


ฉันได้รับ "การดำเนินการไม่ได้รับอนุญาต" ในการตอบสนองต่อการเรียกใช้คำสั่งนี้
Abdul Rahman Shamair

0

ใน eclipse ไปที่มุมมอง DDMS และในแท็บอุปกรณ์คลิกกระบวนการที่คุณต้องการฆ่าภายใต้อุปกรณ์ที่คุณต้องการฆ่ามัน จากนั้นคุณเพียงแค่ต้องกดปุ่มหยุดและมันควรจะฆ่ากระบวนการ

ฉันไม่แน่ใจว่าคุณจะทำสิ่งนี้จากเครื่องมือบรรทัดคำสั่ง แต่ต้องมีวิธี บางทีคุณอาจทำมันผ่านเชลล์ adb ...


ฉันได้พบข้อมูลโค้ดบน GitHubเกี่ยวกับวิธีการทำเช่นนี้จากบรรทัดคำสั่งโดยไม่ต้องใช้ Eclipse และขยายออกไปเล็กน้อย
sschuberth

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.