Dừng ứng dụng Android từ bảng điều khiển


205

Có thể dừng một ứng dụng Android từ bảng điều khiển không? Cái gì đó như:

adb stop com.my.app.package

Nó sẽ tăng tốc quá trình thử nghiệm của chúng tôi rất nhiều. Ngay bây giờ chúng tôi gỡ cài đặt / cài đặt ứng dụng mỗi lần để đảm bảo các trường hợp kiểm tra thủ công bắt đầu với trạng thái sạch.

Câu trả lời:


146

Chỉnh sửa: Rất lâu sau khi tôi viết bài đăng này và nó đã được chấp nhận làm câu trả lời, am force-stoplệnh đã được nhóm Android triển khai , như đã đề cập trong câu trả lời này .

Ngoài ra: Thay vì chỉ dừng ứng dụng, vì bạn đề cập đến việc muốn có "bảng xếp hạng sạch" cho mỗi lần chạy thử, bạn có thể sử dụng adb shell pm clear com.my.app.package, điều này sẽ dừng quá trình ứng dụng xóa tất cả dữ liệu được lưu trữ cho ứng dụng đó.


Nếu bạn đang dùng Linux:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

Điều đó sẽ chỉ hoạt động cho các thiết bị / trình giả lập mà bạn đã root ngay lập tức khi chạy shell. Điều đó có thể được tinh chỉnh một chút để gọi sutrước.

Mặt khác, bạn có thể làm (theo cách thủ công hoặc tôi giả sử theo kịch bản):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>


6
Không thể làm cho nó hoạt động (quyền bị từ chối cả giết và su), nhưng +1 để cho tôi thấy tôi có thể làm được nhiều hơn tôi nghĩ với adb.
hpique

9
Ah, có vẻ như bạn không có một thiết bị đã root. Nó chắc chắn hoạt động trên trình giả lập ít nhất! :)
Christopher Orr

1
Có lẽ bạn phải kể lại phân vùng đọc-ghi và chạy adb với quyền root: adb remount; adb root # đó chỉ là một suy nghĩ ngu ngốc
Rorist

569

Cách rõ ràng để dừng ứng dụng là:

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

Bằng cách này, bạn không phải tìm ra ID tiến trình.


28
Đây phải là câu trả lời được chấp nhận cho vấn đề này. Câu hỏi không bao gồm một thiết bị đã root.
Dimitris

10
@Dimitris Tôi đã viết câu trả lời của tôi ở trên trước khi force-stoplệnh tồn tại. Tôi cập nhật câu trả lời của tôi để chỉ ra điều này.
Christopher Orr

2
Ngoài ra, tôi đã cập nhật câu trả lời của mình với một cách tốt để thực sự cung cấp "bảng xếp hạng sạch" để chạy thử nghiệm.
Christopher Orr

Điểm quan trọng là sau này BroadcastReceiver của bạn sẽ không hoạt động (cho đến khi ứng dụng tiếp theo mở) commonsware.com/blog/2011/07/13/ợi
CAMOBAP

Đã thử nghiệm Android 9.0 API Level 28, ứng dụng vẫn được hiển thị trong Ứng dụng gần đây mặc dù PIDứng dụng được tìm thấy liên quan đến ứng dụng. Bạn có biết làm thế nào để dừng ứng dụng hoàn toàn có nghĩa là ngay cả từ các ứng dụng nền không?
Talha06

32

Đầu tiên, đặt ứng dụng vào nền (nhấn nút home của thiết bị)

Sau đó .... trong một thiết bị đầu cuối ....

adb shell am kill com.your.package

11
LƯU Ý Tôi không tin điều này hoạt động nữa ở các cấp API> 22.
dell116

nó hoạt động trên Nexus 5 của tôi với Marshmallow
urSus ngày

Những công việc này. Hãy chắc chắn rằng bạn đặt ứng dụng vào nền trước.
PhillyTheThrilly

17

bạn có thể sử dụng những điều sau đây từ bảng điều khiển thiết bị: pm disable com.my.app.packagesẽ giết nó. Sau đó sử dụng pm enable com.my.app.packageđể bạn có thể khởi chạy lại.


1
Trên một chiếc điện thoại không root, điều này dường như không làm gì cả.
Robert Muil

Tôi đã checke nó trên một điện thoại không root. Lúc đầu, có một số tin nhắn bị từ chối cấp phép và sau đó nó đã giết chết ứng dụng / dịch vụ DalvicVM của tôi. Chỉ cần cho nó một giây.
LikeYou

1
trên một thiết bị đã root, nó hoạt động và nó có thêm lợi ích là có thể giữ ứng dụng / dịch vụ không hoạt động. Điều này có thể được mong muốn cho mục đích thử nghiệm.
miki

2
Lưu ý: Bạn cần phải adb shell, sau đó chạy sutrước.
kakyo

Cảnh báo, điều này sẽ làm cho các phím tắt biểu tượng trình khởi chạy cho gói đó biến mất, ngay cả sau khi bật lại.
Elad Nava

10

Nếu bạn có quyền truy cập vào gói ứng dụng, thì bạn có thể cài đặt với tùy chọn -r và nó sẽ giết quá trình nếu nó hiện đang chạy như một hiệu ứng phụ. Như thế này:

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

Tùy chọn -r bảo tồn dữ liệu hiện được liên kết với ứng dụng. Tuy nhiên, nếu bạn muốn một bảng xếp hạng sạch như bạn đề cập, bạn có thể không muốn sử dụng tùy chọn đó.


7

Nếu bạn nhắm mục tiêu một thiết bị chưa root và / hoặc có các dịch vụ trong APK mà bạn không muốn dừng lại, các giải pháp khác sẽ không hoạt động.

Để giải quyết vấn đề này, tôi đã nhờ đến một máy thu tin nhắn quảng bá mà tôi đã thêm vào hoạt động của mình để ngăn chặn nó.

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

Bằng cách đó, bạn có thể ban hành lệnh adb này để dừng hoạt động của mình:

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

2

Nếu tất cả những gì bạn đang tìm kiếm là giết chết một gói

pkill package_name 

nên làm việc


Lưu ý: điều này chỉ hoạt động trên các phiên bản Android mới hơn. pkill không có sẵn trên trình giả lập 4.4 của tôi nhưng có sẵn trên trình giả lập Android 6.
Simon Warta

1

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

theo MAC "kiểm soát truy cập bắt buộc", bạn có thể có quyền giết tiến trình không được bắt đầu bằng root

chúc vui vẻ!


Tôi nhận được "Hoạt động không được phép" trong phản ứng khi chạy lệnh này
Abdul Rahman Shamair

0

Trong nhật thực, hãy chuyển đến phối cảnh DDMS và trong tab thiết bị, nhấp vào quá trình bạn muốn giết trong thiết bị bạn muốn tiêu diệt. Sau đó, bạn chỉ cần nhấn nút dừng và nó sẽ giết quá trình.

Tôi không chắc chắn cách bạn làm điều này từ công cụ dòng lệnh nhưng phải có một cách. Có lẽ bạn làm điều đó thông qua vỏ adb ...


Tôi đã tìm thấy một đoạn mã trên GitHub về cách thực hiện điều này từ dòng lệnh mà không cần chạy Eclipse và mở rộng nó một chút .
sschuberth

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.