Làm thế nào để xóa dữ liệu ứng dụng theo chương trình


152

Tôi đang phát triển các bài kiểm tra tự động cho một ứng dụng Android (sử dụng Robotium). Để đảm bảo tính nhất quán và độ tin cậy của các thử nghiệm, tôi muốn bắt đầu mỗi thử nghiệm với trạng thái sạch (của ứng dụng đang thử nghiệm). Để làm như vậy, tôi cần xóa dữ liệu ứng dụng. Điều này có thể được thực hiện thủ công trong Cài đặt / Ứng dụng / Quản lý ứng dụng / [Ứng dụng của tôi] / Xóa dữ liệu

Cách được đề xuất để thực hiện điều này theo chương trình là gì?


Có khả thi khi sử dụng công cụ adb để xóa dữ liệu giữa các lần khởi chạy ứng dụng không? adb -w
smith324

Thật không may, tùy chọn này không có sẵn (trợ giúp adb đã lỗi thời).
dùng597603 ngày

Điều này sẽ rất tuyệt Khi gỡ lỗi các vấn đề cơ sở dữ liệu, tôi phải điều hướng đến tùy chọn Clear Data rất nhiều và nó thực sự phá vỡ dòng chảy của tôi.
Jason Prado

Cách thực hiện thông qua Android Studio được thảo luận tại đây: stackoverflow.com/q/31713579/905686 .
user905686

Cụ thể, hãy làm điều này: stackoverflow.com/a/57461180/94557
Matt Wolfe

Câu trả lời:


171

Bạn có thể sử dụng công cụ quản lý gói để xóa dữ liệu cho các ứng dụng đã cài đặt (tương tự như nhấn nút 'xóa dữ liệu' trong cài đặt ứng dụng trên thiết bị của bạn). Vì vậy, sử dụng adb bạn có thể làm:

adb shell pm clear my.wonderful.app.package

1
Trên Android 2.1-update1, điều này không may mang lại Error: unknown command 'clear'.
Paul Lammertsma

@Palani: hoạt động với tôi cho bất kỳ phiên bản nào trên 2.1-r1 (andoid-7). có thông báo lỗi nào không?
edovino

1
Lệnh trên kết nối với Android shell và thực thi "pm xóa my.wonderful.app.package" trong Android. Trong thiết bị của tôi, lệnh "pm" không có tùy chọn "xóa". Nó không có gì liên quan đến sdk. Nó phụ thuộc vào phần sụn thiết bị.
Palani

Tôi đang tìm kiếm dữ liệu rõ ràng về trình duyệt (defaut) và ứng dụng trình duyệt chrome trong chương trình thiết bị Android từ ứng dụng Android của tôi. Xin vui lòng giúp đỡ về nó ..
Brijesh Patel

Không hoạt động trên mọi thiết bị, nhưng thật tuyệt vời cho các thiết bị hoạt động trên đó
Cory Trese

34

Theo câu trả lời của @ edovino, cách xóa tất cả các tùy chọn của ứng dụng theo chương trình sẽ là

private void clearPreferences() {
    try {
        // clearing app data
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("pm clear YOUR_APP_PACKAGE_GOES HERE");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Cảnh báo : ứng dụng sẽ buộc đóng.


5
Nếu bạn có bất kỳ mã kiểm tra nào chạy sau này, nó sẽ thất bại.
rajath

Việc thực hiện điều này có yêu cầu và quyền được khai báo trong tệp kê khai không?
reubenjohn

1
Không, nó không yêu cầu bất kỳ sự cho phép đặc biệt.
Sebastiano

Thx, u đã cứu mạng tôi!
Sidd

1
Nếu tôi không muốn buộc đóng ứng dụng thì sao?
NJ

22

bạn có thể xóa dữ liệu ứng dụng SharedPreferences với điều này

Editor editor = 
context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();

và để xóa db ứng dụng, câu trả lời này là chính xác -> Xóa cơ sở dữ liệu ứng dụng


14

Từ API phiên bản 19, có thể gọi ActivityManager.clearApplicationUserData ().

((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).clearApplicationUserData();

13
Chỉ cần FYI, gọi đây sẽ chấm dứt ứng dụng của bạn.
Zach Rattner

8

Kiểm tra mã này để:

@Override
protected void onDestroy() {
// closing Entire Application
    android.os.Process.killProcess(android.os.Process.myPid());
    Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
    editor.clear();
    editor.commit();
    trimCache(this);
    super.onDestroy();
}


public static void trimCache(Context context) {
    try {
        File dir = context.getCacheDir();
        if (dir != null && dir.isDirectory()) {
            deleteDir(dir);

        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}


public static boolean deleteDir(File dir) {
    if (dir != null && dir.isDirectory()) {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }

    // <uses-permission
    // android:name="android.permission.CLEAR_APP_CACHE"></uses-permission>
    // The directory is now empty so delete it

    return dir.delete();
}

6

Nếu bạn chỉ có một vài sở thích được chia sẻ để xóa, thì giải pháp này đẹp hơn nhiều .

@Override
protected void setUp() throws Exception {
    super.setUp();
    Instrumentation instrumentation = getInstrumentation();
    SharedPreferences preferences = instrumentation.getTargetContext().getSharedPreferences(...), Context.MODE_PRIVATE);
    preferences.edit().clear().commit();
    solo = new Solo(instrumentation, getActivity());
}

Điều này có yêu cầu "chế độ thiết bị" được kích hoạt không? Chế độ đó là gì?
ADTC

Đúng, điều này đòi hỏi một ứng dụng "cụ", tức là thử nghiệm của bạn chạy cùng với mã ứng dụng của bạn trên một thiết bị thực đang xử lý , điều đó có nghĩa là bạn có thể truy cập tất cả trạng thái của ứng dụng và thay đổi nó trong thời gian chạy cho mục đích thử nghiệm.
Thomas Keller

những gì nên có trong (...)?
NickUnuchek

@NickUnuchek Tên của tệp ưu tiên.
Thomas Keller

3

Sử dụng Ngữ cảnh , Chúng tôi có thể xóa các tệp cụ thể của ứng dụng như tùy chọn, tệp cơ sở dữ liệu. Tôi đã sử dụng mã dưới đây để kiểm tra giao diện người dùng bằng Espresso.

    @Rule
    public ActivityTestRule<HomeActivity> mActivityRule = new ActivityTestRule<>(
            HomeActivity.class);

    public static void clearAppInfo() {
        Activity mActivity = testRule.getActivity();
        SharedPreferences prefs =
                PreferenceManager.getDefaultSharedPreferences(mActivity);
        prefs.edit().clear().commit();
        mActivity.deleteDatabase("app_db_name.db");
    }

3

Cách đơn giản nhất để làm điều này là

private void deleteAppData() {
         try {
        // clearing app data
        String packageName = getApplicationContext().getPackageName();
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("pm clear "+packageName);

    } catch (Exception e) {
        e.printStackTrace();
    } 
}

Điều này sẽ xóa dữ liệu và xóa ứng dụng của bạn khỏi bộ nhớ. Nó tương đương với tùy chọn xóa dữ liệu trong Cài đặt -> Trình quản lý ứng dụng -> Ứng dụng của bạn -> Xóa dữ liệu.

Điều này sẽ xóa hoàn toàn dữ liệu cũng như buộc đóng ứng dụng


Vui lòng không thêm cùng một câu trả lời cho nhiều câu hỏi. Trả lời câu hỏi hay nhất và đánh dấu phần còn lại là trùng lặp. Xem Có được chấp nhận để thêm một câu trả lời trùng lặp cho một số câu hỏi không?
FelixSFD

1
Làm thế nào chúng ta có thể đạt được điều này mà không cần đóng ứng dụng
Omkar Ghurye

2

Giải pháp này đã thực sự giúp tôi:

Bằng cách sử dụng hai phương pháp dưới đây, chúng tôi có thể xóa dữ liệu theo chương trình

    public void clearApplicationData() {
    File cacheDirectory = getCacheDir();
    File applicationDirectory = new File(cacheDirectory.getParent());
    if (applicationDirectory.exists()) {
    String[] fileNames = applicationDirectory.list();
        for (String fileName : fileNames) {
            if (!fileName.equals("lib")) {
                deleteFile(new File(applicationDirectory, fileName));
            }
        }
    }
}
    public static boolean deleteFile(File file) {
    boolean deletedAll = true;
    if (file != null) {
        if (file.isDirectory()) {
            String[] children = file.list();
            for (int i = 0; i < children.length; i++) {
                deletedAll = deleteFile(new File(file, children[i])) && deletedAll;
            }
        } else {
            deletedAll = file.delete();
        }
    }

    return deletedAll;
}

2

Nếu phiên bản Android ở trên kitkat, bạn cũng có thể sử dụng phiên bản này

khoảng trống công khai trênClick (Xem chế độ xem) {

    Context context = getApplicationContext(); // add this line
    if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
        ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE))
            .clearApplicationUserData();
        return;
    }

0

Cách được đề xuất để thực hiện điều này theo chương trình là gì?

Tùy chọn duy nhất có thể là chạy lệnh ADB adb shell pm clear packagetrước khi thử nghiệm. Vấn đề lớn nhất là loại đau đầu kết hợp kiểm tra thực thi và lệnh shell.

Tuy nhiên, chúng tôi (tại Mediafe) đã đưa ra một số giải pháp có thể phù hợp với bạn trên thiết bị không được phân phối thông thường. Tất cả bạn cần làm là thêm một chú thích. Tất cả phần còn lại được thực hiện bằng cách chạy tập lệnh bash đơn giản .

Chỉ cần thêm @ClearDatachú thích trước BẤT K of bài kiểm tra nào của bạn và tada 🎉, lệnh xóa ADB sẽ được thực thi trước khi thực hiện kiểm tra.

Đây là một ví dụ về thử nghiệm như vậy:

@Test
@ClearData
public void someTest() {
    // your test
}

Ý tưởng là như sau

  1. Đọc tất cả các bài kiểm tra bằng cách sử dụng adb shell am instrument -e log true
  2. Xây dựng kế hoạch thực hiện bằng cách phân tích cú pháp đầu ra từ (1)
  3. Chạy dòng kế hoạch thực hiện theo dòng

Sử dụng cùng một ý tưởng, đây là tất cả các tùy chọn bạn có thể dễ dàng hỗ trợ:

  • Xóa dữ liệu
  • Xóa thanh thông báo
  • Tham số hóa
  • Lọc và chạy theo thẻ

Chỉ sử dụng chú thích. Như thế này:

@Test
@ClearData
@Tags(tags = {"sanity", "medium"})
@Parameterized.Repeat(count = 3)
public void myTest() throws Exception {
    String param = params[index];
    // ...
}

Tặng kem! Đối với mỗi bài kiểm tra thất bại:

  • Thu thập Logcat + stacktrace
  • Quay video (mp4)
  • Đổ DB (sqlite)
  • Kết xuất tùy chọn chia sẻ mặc định (xml)
  • Thu thập các tập tin dumpsys như: pin, netstats và khác.

Nói chung, thật dễ dàng để thêm nhiều tùy chọn hơn, vì các bài kiểm tra được thực hiện lần lượt từ tập lệnh bash thay vì từ tác vụ lớp.

📗 Các bài viết trên blog đầy đủ : https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

📘 Mã nguồn với các ví dụ : https://github.com/medisafe/run-android-tests

Hy vọng câu trả lời này 6 năm câu hỏi;)

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.