Cara menghapus data aplikasi secara terprogram

152

Saya mengembangkan tes otomatis untuk aplikasi android (menggunakan Robotium). Untuk memastikan konsistensi dan keandalan tes, saya ingin memulai setiap tes dengan kondisi bersih (dari aplikasi yang diuji). Untuk melakukannya, saya perlu menghapus data aplikasi. Ini dapat dilakukan secara manual di Pengaturan / Aplikasi / Kelola Aplikasi / [Aplikasi Saya] / Hapus data

Apa cara yang disarankan untuk menyelesaikan ini secara terprogram?

pengguna597603
sumber
Apakah layak menggunakan alat adb untuk menghapus data di antara peluncuran aplikasi? adb -w
smith324
Sayangnya, opsi ini tidak tersedia (bantuan adb kedaluwarsa).
user597603
Ini akan sangat luar biasa. Ketika men-debug masalah basis data, saya harus menavigasi ke opsi Hapus Data begitu banyak dan itu benar-benar merusak aliran saya.
Jason Prado
Cara melakukannya melalui Android Studio dibahas di sini: stackoverflow.com/q/31713579/905686 .
user905686
Secara khusus, lakukan ini: stackoverflow.com/a/57461180/94557
Matt Wolfe

Jawaban:

171

Anda dapat menggunakan alat manajer paket untuk menghapus data untuk aplikasi yang diinstal (mirip dengan menekan tombol 'hapus data' dalam pengaturan aplikasi pada perangkat Anda). Jadi menggunakan adb yang bisa Anda lakukan:

adb shell pm clear my.wonderful.app.package
edovino
sumber
1
Pada Android 2.1-update1, sayangnya ini menghasilkan Error: unknown command 'clear'.
Paul Lammertsma
@Palani: bekerja untuk saya untuk semua versi di atas 2.1-r1 (andoid-7). ada pesan kesalahan?
edovino
1
Perintah di atas terhubung ke shell android dan menjalankan "pm clear my.wonderful.app.package" di android. Di perangkat saya, perintah "pm" tidak memiliki opsi "hapus". Tidak ada hubungannya dengan SDK. Itu tergantung pada firmware perangkat.
Palani
Saya sedang mencari data yang jelas dari browser (defaut) dan aplikasi browser chrome di program perangkat android dari aplikasi android saya. Tolong bantu untuk itu ..
Brijesh Patel
Tidak bekerja di setiap perangkat, tetapi ini luar biasa untuk perangkat yang berfungsi
Cory Trese
34

Menindaklanjuti jawaban @ edovino, cara menghapus semua preferensi aplikasi secara terprogram adalah

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

Peringatan : aplikasi akan ditutup paksa.

Sebastiano
sumber
5
Jika Anda memiliki kode tes yang berjalan setelah ini, itu gagal.
rajath
Apakah mengeksekusi ini memerlukan dan izin untuk dinyatakan dalam manifes?
reubenjohn
1
Tidak, itu tidak memerlukan izin khusus.
Sebastiano
Terima kasih, saya menyelamatkan hidup saya!
Sidd
1
jika saya tidak ingin menutup aplikasi itu?
NJ
22

Anda dapat menghapus data-aplikasi SharedPreferences dengan ini

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

dan untuk menghapus aplikasi db, jawaban ini benar -> Menghapus basis data Aplikasi

guleryuz
sumber
14

Dari API versi 19, dimungkinkan untuk memanggil ActivityManager.clearApplicationUserData ().

((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).clearApplicationUserData();
Joakim
sumber
13
Hanya FYI, memanggil ini akan menghentikan aplikasi Anda.
Zach Rattner
8

Periksa kode ini untuk:

@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();
}
Hare-Krishna
sumber
6

Jika Anda hanya memiliki beberapa preferensi bersama untuk dihapus, maka solusi ini jauh lebih baik .

@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());
}
Thomas Keller
sumber
Tidakkah ini membutuhkan "mode instrumentasi" untuk diaktifkan? Modus apa itu?
ADTC
Yap, ini membutuhkan aplikasi "instrumented", yaitu pengujian Anda berjalan di samping kode aplikasi Anda pada perangkat nyata yang sedang dalam proses , yang berarti bahwa Anda dapat mengakses semua status aplikasi Anda dan mengubahnya pada waktu berjalan untuk keperluan pengujian.
Thomas Keller
apa yang seharusnya di (...)?
NickUnuchek
@NickUnuchek Nama file preferensi.
Thomas Keller
3

Menggunakan Konteks , Kami dapat menghapus file khusus aplikasi seperti preferensi, file database. Saya telah menggunakan kode di bawah ini untuk pengujian UI menggunakan 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");
    }
Ronak Poriya
sumber
3

Cara paling sederhana untuk melakukan ini adalah

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

Ini akan menghapus data dan menghapus aplikasi Anda dari memori. Ini sama dengan menghapus opsi data di bawah Pengaturan -> Manajer Aplikasi -> Aplikasi Anda -> Hapus data.

Ini akan menghapus data sepenuhnya serta menutup paksa aplikasi

Sumain Jain
sumber
Tolong jangan tambahkan jawaban yang sama untuk beberapa pertanyaan. Jawab yang terbaik dan tandai sisanya sebagai duplikat. Lihat Apakah diterima untuk menambahkan jawaban rangkap ke beberapa pertanyaan?
FelixSFD
1
Bagaimana kita bisa mencapai ini tanpa penutupan aplikasi
Omkar Ghurye
2

Solusi ini sangat membantu saya:

Dengan menggunakan dua metode di bawah ini kita dapat menghapus data secara programatik

    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;
}
Priyanka SN
sumber
2

jika versi android di atas kitkat Anda dapat menggunakan ini juga

public void onClick (Tampilan tampilan) {

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

Apa cara yang disarankan untuk menyelesaikan ini secara terprogram?

Satu-satunya pilihan yang mungkin adalah menjalankan perintah ADB adb shell pm clear packagesebelum pengujian. Masalah terbesar adalah jenis sakit kepala yang menggabungkan tes eksekusi dan perintah shell.

Namun, kami (di Mediafe) datang dengan beberapa solusi yang dapat bekerja untuk Anda pada perangkat yang tidak di-root. Yang perlu Anda lakukan adalah menambahkan anotasi. Semua sisanya dilakukan dengan menjalankan skrip bash sederhana .

Cukup tambahkan @ClearDataanotasi sebelum SETIAP tes dan tada 🎉 Anda, perintah yang jelas ADB akan dijalankan sebelum pelaksanaan tes.

Ini adalah contoh dari tes tersebut:

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

Idenya adalah sebagai berikut

  1. Baca semua tes dengan menggunakan adb shell am instrument -e log true
  2. Bangun rencana eksekusi dengan memilah output dari (1)
  3. Jalankan rencana eksekusi baris demi baris

Menggunakan ide yang sama ini adalah semua opsi yang dapat Anda dukung dengan mudah:

  • Hapus data
  • Hapus bilah notifikasi
  • Parameterisasi
  • Saring dan jalankan dengan tag

Gunakan hanya anotasi. Seperti ini:

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

Bonus! 🎁 Untuk setiap tes yang gagal:

  • Kumpulkan Logcat + stacktrace
  • Rekam video (mp4)
  • Dump DB (sqlite)
  • Preferensi bersama default sampah (xml)
  • Kumpulkan file dumpsys seperti: baterai, netstats, dan lainnya.

Secara umum, mudah untuk menambahkan lebih banyak opsi, karena tes dijalankan satu per satu dari skrip bash daripada dari tugas gradle.

📗 Posting blog lengkap : https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

📘 Kode sumber dengan contoh : https://github.com/medisafe/run-android-tests

Semoga ini menjawab 6 tahun pertanyaan;)

sromku
sumber